| 
									
										
										
										
											2019-10-29 14:35:13 -07:00
										 |  |  | import json | 
					
						
							| 
									
										
										
										
											2020-02-24 13:25:36 -06:00
										 |  |  | import os | 
					
						
							| 
									
										
										
										
											2020-07-13 10:30:55 +02:00
										 |  |  | import time | 
					
						
							| 
									
										
										
										
											2019-02-25 16:27:25 -08:00
										 |  |  | from datetime import datetime, timedelta | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import boto3 | 
					
						
							|  |  |  | from botocore.exceptions import ClientError | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  | from unittest import SkipTest | 
					
						
							|  |  |  | import pytest | 
					
						
							| 
									
										
										
										
											2019-02-25 16:27:25 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-23 17:16:20 -07:00
										 |  |  | from moto import mock_s3 | 
					
						
							| 
									
										
										
										
											2019-02-25 16:27:25 -08:00
										 |  |  | from moto.config import mock_config | 
					
						
							| 
									
										
										
										
											2019-12-16 21:05:29 -05:00
										 |  |  | from moto.core import ACCOUNT_ID | 
					
						
							| 
									
										
										
										
											2019-02-25 16:27:25 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-01 15:35:25 +01:00
										 |  |  | import sure  # noqa | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-12-16 21:25:20 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-25 16:27:25 -08:00
										 |  |  | @mock_config | 
					
						
							|  |  |  | def test_put_configuration_recorder(): | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     client = boto3.client("config", region_name="us-west-2") | 
					
						
							| 
									
										
										
										
											2019-02-25 16:27:25 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Try without a name supplied: | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(ClientError) as ce: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         client.put_configuration_recorder(ConfigurationRecorder={"roleARN": "somearn"}) | 
					
						
							|  |  |  |     assert ( | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |         ce.value.response["Error"]["Code"] | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         == "InvalidConfigurationRecorderNameException" | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |     assert "is not valid, blank string." in ce.value.response["Error"]["Message"] | 
					
						
							| 
									
										
										
										
											2019-02-25 16:27:25 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Try with a really long name: | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(ClientError) as ce: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         client.put_configuration_recorder( | 
					
						
							|  |  |  |             ConfigurationRecorder={"name": "a" * 257, "roleARN": "somearn"} | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |     assert ce.value.response["Error"]["Code"] == "ValidationException" | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     assert ( | 
					
						
							|  |  |  |         "Member must have length less than or equal to 256" | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |         in ce.value.response["Error"]["Message"] | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-02-25 16:27:25 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # With resource types and flags set to True: | 
					
						
							|  |  |  |     bad_groups = [ | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         { | 
					
						
							|  |  |  |             "allSupported": True, | 
					
						
							|  |  |  |             "includeGlobalResourceTypes": True, | 
					
						
							|  |  |  |             "resourceTypes": ["item"], | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             "allSupported": False, | 
					
						
							|  |  |  |             "includeGlobalResourceTypes": True, | 
					
						
							|  |  |  |             "resourceTypes": ["item"], | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             "allSupported": True, | 
					
						
							|  |  |  |             "includeGlobalResourceTypes": False, | 
					
						
							|  |  |  |             "resourceTypes": ["item"], | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             "allSupported": False, | 
					
						
							|  |  |  |             "includeGlobalResourceTypes": False, | 
					
						
							|  |  |  |             "resourceTypes": [], | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         {"includeGlobalResourceTypes": False, "resourceTypes": []}, | 
					
						
							|  |  |  |         {"includeGlobalResourceTypes": True}, | 
					
						
							|  |  |  |         {"resourceTypes": []}, | 
					
						
							|  |  |  |         {}, | 
					
						
							| 
									
										
										
										
											2019-02-25 16:27:25 -08:00
										 |  |  |     ] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     for bg in bad_groups: | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |         with pytest.raises(ClientError) as ce: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |             client.put_configuration_recorder( | 
					
						
							|  |  |  |                 ConfigurationRecorder={ | 
					
						
							|  |  |  |                     "name": "default", | 
					
						
							|  |  |  |                     "roleARN": "somearn", | 
					
						
							|  |  |  |                     "recordingGroup": bg, | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             ) | 
					
						
							| 
									
										
										
										
											2020-10-06 08:46:05 +02:00
										 |  |  |         assert ce.value.response["Error"]["Code"] == "InvalidRecordingGroupException" | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         assert ( | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |             ce.value.response["Error"]["Message"] | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |             == "The recording group provided is not valid" | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2019-02-25 16:27:25 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # With an invalid Resource Type: | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(ClientError) as ce: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         client.put_configuration_recorder( | 
					
						
							|  |  |  |             ConfigurationRecorder={ | 
					
						
							|  |  |  |                 "name": "default", | 
					
						
							|  |  |  |                 "roleARN": "somearn", | 
					
						
							|  |  |  |                 "recordingGroup": { | 
					
						
							|  |  |  |                     "allSupported": False, | 
					
						
							|  |  |  |                     "includeGlobalResourceTypes": False, | 
					
						
							|  |  |  |                     # 2 good, and 2 bad: | 
					
						
							|  |  |  |                     "resourceTypes": [ | 
					
						
							|  |  |  |                         "AWS::EC2::Volume", | 
					
						
							|  |  |  |                         "LOLNO", | 
					
						
							|  |  |  |                         "AWS::EC2::VPC", | 
					
						
							|  |  |  |                         "LOLSTILLNO", | 
					
						
							|  |  |  |                     ], | 
					
						
							|  |  |  |                 }, | 
					
						
							| 
									
										
										
										
											2019-02-25 16:27:25 -08:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         ) | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |     assert ce.value.response["Error"]["Code"] == "ValidationException" | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     assert "2 validation error detected: Value '['LOLNO', 'LOLSTILLNO']" in str( | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |         ce.value.response["Error"]["Message"] | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     ) | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |     assert "AWS::EC2::Instance" in ce.value.response["Error"]["Message"] | 
					
						
							| 
									
										
										
										
											2019-02-25 16:27:25 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Create a proper one: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     client.put_configuration_recorder( | 
					
						
							|  |  |  |         ConfigurationRecorder={ | 
					
						
							|  |  |  |             "name": "testrecorder", | 
					
						
							|  |  |  |             "roleARN": "somearn", | 
					
						
							|  |  |  |             "recordingGroup": { | 
					
						
							|  |  |  |                 "allSupported": False, | 
					
						
							|  |  |  |                 "includeGlobalResourceTypes": False, | 
					
						
							|  |  |  |                 "resourceTypes": ["AWS::EC2::Volume", "AWS::EC2::VPC"], | 
					
						
							|  |  |  |             }, | 
					
						
							| 
									
										
										
										
											2019-02-25 16:27:25 -08:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-02-25 16:27:25 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     result = client.describe_configuration_recorders()["ConfigurationRecorders"] | 
					
						
							| 
									
										
										
										
											2019-02-25 16:27:25 -08:00
										 |  |  |     assert len(result) == 1 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     assert result[0]["name"] == "testrecorder" | 
					
						
							|  |  |  |     assert result[0]["roleARN"] == "somearn" | 
					
						
							|  |  |  |     assert not result[0]["recordingGroup"]["allSupported"] | 
					
						
							|  |  |  |     assert not result[0]["recordingGroup"]["includeGlobalResourceTypes"] | 
					
						
							|  |  |  |     assert len(result[0]["recordingGroup"]["resourceTypes"]) == 2 | 
					
						
							|  |  |  |     assert ( | 
					
						
							|  |  |  |         "AWS::EC2::Volume" in result[0]["recordingGroup"]["resourceTypes"] | 
					
						
							|  |  |  |         and "AWS::EC2::VPC" in result[0]["recordingGroup"]["resourceTypes"] | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-02-25 16:27:25 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Now update the configuration recorder: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     client.put_configuration_recorder( | 
					
						
							|  |  |  |         ConfigurationRecorder={ | 
					
						
							|  |  |  |             "name": "testrecorder", | 
					
						
							|  |  |  |             "roleARN": "somearn", | 
					
						
							|  |  |  |             "recordingGroup": { | 
					
						
							|  |  |  |                 "allSupported": True, | 
					
						
							|  |  |  |                 "includeGlobalResourceTypes": True, | 
					
						
							|  |  |  |             }, | 
					
						
							| 
									
										
										
										
											2019-02-25 16:27:25 -08:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     ) | 
					
						
							|  |  |  |     result = client.describe_configuration_recorders()["ConfigurationRecorders"] | 
					
						
							| 
									
										
										
										
											2019-02-25 16:27:25 -08:00
										 |  |  |     assert len(result) == 1 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     assert result[0]["name"] == "testrecorder" | 
					
						
							|  |  |  |     assert result[0]["roleARN"] == "somearn" | 
					
						
							|  |  |  |     assert result[0]["recordingGroup"]["allSupported"] | 
					
						
							|  |  |  |     assert result[0]["recordingGroup"]["includeGlobalResourceTypes"] | 
					
						
							|  |  |  |     assert len(result[0]["recordingGroup"]["resourceTypes"]) == 0 | 
					
						
							| 
									
										
										
										
											2019-02-25 16:27:25 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # With a default recording group (i.e. lacking one) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     client.put_configuration_recorder( | 
					
						
							|  |  |  |         ConfigurationRecorder={"name": "testrecorder", "roleARN": "somearn"} | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |     result = client.describe_configuration_recorders()["ConfigurationRecorders"] | 
					
						
							| 
									
										
										
										
											2019-02-25 16:27:25 -08:00
										 |  |  |     assert len(result) == 1 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     assert result[0]["name"] == "testrecorder" | 
					
						
							|  |  |  |     assert result[0]["roleARN"] == "somearn" | 
					
						
							|  |  |  |     assert result[0]["recordingGroup"]["allSupported"] | 
					
						
							|  |  |  |     assert not result[0]["recordingGroup"]["includeGlobalResourceTypes"] | 
					
						
							|  |  |  |     assert not result[0]["recordingGroup"].get("resourceTypes") | 
					
						
							| 
									
										
										
										
											2019-02-25 16:27:25 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Can currently only have exactly 1 Config Recorder in an account/region: | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(ClientError) as ce: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         client.put_configuration_recorder( | 
					
						
							|  |  |  |             ConfigurationRecorder={ | 
					
						
							|  |  |  |                 "name": "someotherrecorder", | 
					
						
							|  |  |  |                 "roleARN": "somearn", | 
					
						
							|  |  |  |                 "recordingGroup": { | 
					
						
							|  |  |  |                     "allSupported": False, | 
					
						
							|  |  |  |                     "includeGlobalResourceTypes": False, | 
					
						
							|  |  |  |                 }, | 
					
						
							| 
									
										
										
										
											2019-02-25 16:27:25 -08:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         ) | 
					
						
							|  |  |  |     assert ( | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |         ce.value.response["Error"]["Code"] | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         == "MaxNumberOfConfigurationRecordersExceededException" | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |     assert ( | 
					
						
							|  |  |  |         "maximum number of configuration recorders: 1 is reached." | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |         in ce.value.response["Error"]["Message"] | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-02-25 16:27:25 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  | @mock_config | 
					
						
							|  |  |  | def test_put_configuration_aggregator(): | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     client = boto3.client("config", region_name="us-west-2") | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # With too many aggregation sources: | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(ClientError) as ce: | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  |         client.put_configuration_aggregator( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |             ConfigurationAggregatorName="testing", | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  |             AccountAggregationSources=[ | 
					
						
							|  |  |  |                 { | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |                     "AccountIds": ["012345678910", "111111111111", "222222222222"], | 
					
						
							|  |  |  |                     "AwsRegions": ["us-east-1", "us-west-2"], | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  |                 }, | 
					
						
							|  |  |  |                 { | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |                     "AccountIds": ["012345678910", "111111111111", "222222222222"], | 
					
						
							|  |  |  |                     "AwsRegions": ["us-east-1", "us-west-2"], | 
					
						
							|  |  |  |                 }, | 
					
						
							|  |  |  |             ], | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  |         ) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     assert ( | 
					
						
							|  |  |  |         "Member must have length less than or equal to 1" | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |         in ce.value.response["Error"]["Message"] | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     ) | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |     assert ce.value.response["Error"]["Code"] == "ValidationException" | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # With an invalid region config (no regions defined): | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(ClientError) as ce: | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  |         client.put_configuration_aggregator( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |             ConfigurationAggregatorName="testing", | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  |             AccountAggregationSources=[ | 
					
						
							|  |  |  |                 { | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |                     "AccountIds": ["012345678910", "111111111111", "222222222222"], | 
					
						
							|  |  |  |                     "AllAwsRegions": False, | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  |                 } | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |             ], | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  |         ) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     assert ( | 
					
						
							|  |  |  |         "Your request does not specify any regions" | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |         in ce.value.response["Error"]["Message"] | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     ) | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |     assert ce.value.response["Error"]["Code"] == "InvalidParameterValueException" | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(ClientError) as ce: | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  |         client.put_configuration_aggregator( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |             ConfigurationAggregatorName="testing", | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  |             OrganizationAggregationSource={ | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |                 "RoleArn": "arn:aws:iam::012345678910:role/SomeRole" | 
					
						
							|  |  |  |             }, | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  |         ) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     assert ( | 
					
						
							|  |  |  |         "Your request does not specify any regions" | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |         in ce.value.response["Error"]["Message"] | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     ) | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |     assert ce.value.response["Error"]["Code"] == "InvalidParameterValueException" | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # With both region flags defined: | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(ClientError) as ce: | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  |         client.put_configuration_aggregator( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |             ConfigurationAggregatorName="testing", | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  |             AccountAggregationSources=[ | 
					
						
							|  |  |  |                 { | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |                     "AccountIds": ["012345678910", "111111111111", "222222222222"], | 
					
						
							|  |  |  |                     "AwsRegions": ["us-east-1", "us-west-2"], | 
					
						
							|  |  |  |                     "AllAwsRegions": True, | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  |                 } | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |             ], | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  |         ) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     assert ( | 
					
						
							| 
									
										
										
										
											2020-10-06 08:46:05 +02:00
										 |  |  |         "You must choose one of these options" in ce.value.response["Error"]["Message"] | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     ) | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |     assert ce.value.response["Error"]["Code"] == "InvalidParameterValueException" | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(ClientError) as ce: | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  |         client.put_configuration_aggregator( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |             ConfigurationAggregatorName="testing", | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  |             OrganizationAggregationSource={ | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |                 "RoleArn": "arn:aws:iam::012345678910:role/SomeRole", | 
					
						
							|  |  |  |                 "AwsRegions": ["us-east-1", "us-west-2"], | 
					
						
							|  |  |  |                 "AllAwsRegions": True, | 
					
						
							|  |  |  |             }, | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  |         ) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     assert ( | 
					
						
							| 
									
										
										
										
											2020-10-06 08:46:05 +02:00
										 |  |  |         "You must choose one of these options" in ce.value.response["Error"]["Message"] | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     ) | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |     assert ce.value.response["Error"]["Code"] == "InvalidParameterValueException" | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Name too long: | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(ClientError) as ce: | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  |         client.put_configuration_aggregator( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |             ConfigurationAggregatorName="a" * 257, | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  |             AccountAggregationSources=[ | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |                 {"AccountIds": ["012345678910"], "AllAwsRegions": True} | 
					
						
							|  |  |  |             ], | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  |         ) | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |     assert "configurationAggregatorName" in ce.value.response["Error"]["Message"] | 
					
						
							|  |  |  |     assert ce.value.response["Error"]["Code"] == "ValidationException" | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Too many tags (>50): | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(ClientError) as ce: | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  |         client.put_configuration_aggregator( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |             ConfigurationAggregatorName="testing", | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  |             AccountAggregationSources=[ | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |                 {"AccountIds": ["012345678910"], "AllAwsRegions": True} | 
					
						
							|  |  |  |             ], | 
					
						
							|  |  |  |             Tags=[ | 
					
						
							|  |  |  |                 {"Key": "{}".format(x), "Value": "{}".format(x)} for x in range(0, 51) | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  |             ], | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     assert ( | 
					
						
							|  |  |  |         "Member must have length less than or equal to 50" | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |         in ce.value.response["Error"]["Message"] | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     ) | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |     assert ce.value.response["Error"]["Code"] == "ValidationException" | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Tag key is too big (>128 chars): | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(ClientError) as ce: | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  |         client.put_configuration_aggregator( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |             ConfigurationAggregatorName="testing", | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  |             AccountAggregationSources=[ | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |                 {"AccountIds": ["012345678910"], "AllAwsRegions": True} | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  |             ], | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |             Tags=[{"Key": "a" * 129, "Value": "a"}], | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  |         ) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     assert ( | 
					
						
							|  |  |  |         "Member must have length less than or equal to 128" | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |         in ce.value.response["Error"]["Message"] | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     ) | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |     assert ce.value.response["Error"]["Code"] == "ValidationException" | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Tag value is too big (>256 chars): | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(ClientError) as ce: | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  |         client.put_configuration_aggregator( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |             ConfigurationAggregatorName="testing", | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  |             AccountAggregationSources=[ | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |                 {"AccountIds": ["012345678910"], "AllAwsRegions": True} | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  |             ], | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |             Tags=[{"Key": "tag", "Value": "a" * 257}], | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  |         ) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     assert ( | 
					
						
							|  |  |  |         "Member must have length less than or equal to 256" | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |         in ce.value.response["Error"]["Message"] | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     ) | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |     assert ce.value.response["Error"]["Code"] == "ValidationException" | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Duplicate Tags: | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(ClientError) as ce: | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  |         client.put_configuration_aggregator( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |             ConfigurationAggregatorName="testing", | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  |             AccountAggregationSources=[ | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |                 {"AccountIds": ["012345678910"], "AllAwsRegions": True} | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  |             ], | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |             Tags=[{"Key": "a", "Value": "a"}, {"Key": "a", "Value": "a"}], | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  |         ) | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |     assert "Duplicate tag keys found." in ce.value.response["Error"]["Message"] | 
					
						
							|  |  |  |     assert ce.value.response["Error"]["Code"] == "InvalidInput" | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Invalid characters in the tag key: | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(ClientError) as ce: | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  |         client.put_configuration_aggregator( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |             ConfigurationAggregatorName="testing", | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  |             AccountAggregationSources=[ | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |                 {"AccountIds": ["012345678910"], "AllAwsRegions": True} | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  |             ], | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |             Tags=[{"Key": "!", "Value": "a"}], | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  |         ) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     assert ( | 
					
						
							|  |  |  |         "Member must satisfy regular expression pattern:" | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |         in ce.value.response["Error"]["Message"] | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     ) | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |     assert ce.value.response["Error"]["Code"] == "ValidationException" | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # If it contains both the AccountAggregationSources and the OrganizationAggregationSource | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(ClientError) as ce: | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  |         client.put_configuration_aggregator( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |             ConfigurationAggregatorName="testing", | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  |             AccountAggregationSources=[ | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |                 {"AccountIds": ["012345678910"], "AllAwsRegions": False} | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  |             ], | 
					
						
							|  |  |  |             OrganizationAggregationSource={ | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |                 "RoleArn": "arn:aws:iam::012345678910:role/SomeRole", | 
					
						
							|  |  |  |                 "AllAwsRegions": False, | 
					
						
							|  |  |  |             }, | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  |         ) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     assert ( | 
					
						
							|  |  |  |         "AccountAggregationSource and the OrganizationAggregationSource" | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |         in ce.value.response["Error"]["Message"] | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     ) | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |     assert ce.value.response["Error"]["Code"] == "InvalidParameterValueException" | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # If it contains neither: | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(ClientError) as ce: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         client.put_configuration_aggregator(ConfigurationAggregatorName="testing") | 
					
						
							|  |  |  |     assert ( | 
					
						
							|  |  |  |         "AccountAggregationSource or the OrganizationAggregationSource" | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |         in ce.value.response["Error"]["Message"] | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     ) | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |     assert ce.value.response["Error"]["Code"] == "InvalidParameterValueException" | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Just make one: | 
					
						
							|  |  |  |     account_aggregation_source = { | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         "AccountIds": ["012345678910", "111111111111", "222222222222"], | 
					
						
							|  |  |  |         "AwsRegions": ["us-east-1", "us-west-2"], | 
					
						
							|  |  |  |         "AllAwsRegions": False, | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     result = client.put_configuration_aggregator( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         ConfigurationAggregatorName="testing", | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  |         AccountAggregationSources=[account_aggregation_source], | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     assert result["ConfigurationAggregator"]["ConfigurationAggregatorName"] == "testing" | 
					
						
							|  |  |  |     assert result["ConfigurationAggregator"]["AccountAggregationSources"] == [ | 
					
						
							|  |  |  |         account_aggregation_source | 
					
						
							|  |  |  |     ] | 
					
						
							|  |  |  |     assert ( | 
					
						
							| 
									
										
										
										
											2019-12-16 21:25:20 -05:00
										 |  |  |         "arn:aws:config:us-west-2:{}:config-aggregator/config-aggregator-".format( | 
					
						
							|  |  |  |             ACCOUNT_ID | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         in result["ConfigurationAggregator"]["ConfigurationAggregatorArn"] | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |     assert ( | 
					
						
							|  |  |  |         result["ConfigurationAggregator"]["CreationTime"] | 
					
						
							|  |  |  |         == result["ConfigurationAggregator"]["LastUpdatedTime"] | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Update the existing one: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     original_arn = result["ConfigurationAggregator"]["ConfigurationAggregatorArn"] | 
					
						
							|  |  |  |     account_aggregation_source.pop("AwsRegions") | 
					
						
							|  |  |  |     account_aggregation_source["AllAwsRegions"] = True | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  |     result = client.put_configuration_aggregator( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         ConfigurationAggregatorName="testing", | 
					
						
							|  |  |  |         AccountAggregationSources=[account_aggregation_source], | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     assert result["ConfigurationAggregator"]["ConfigurationAggregatorName"] == "testing" | 
					
						
							|  |  |  |     assert result["ConfigurationAggregator"]["AccountAggregationSources"] == [ | 
					
						
							|  |  |  |         account_aggregation_source | 
					
						
							|  |  |  |     ] | 
					
						
							|  |  |  |     assert ( | 
					
						
							|  |  |  |         result["ConfigurationAggregator"]["ConfigurationAggregatorArn"] == original_arn | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Make an org one: | 
					
						
							|  |  |  |     result = client.put_configuration_aggregator( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         ConfigurationAggregatorName="testingOrg", | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  |         OrganizationAggregationSource={ | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |             "RoleArn": "arn:aws:iam::012345678910:role/SomeRole", | 
					
						
							|  |  |  |             "AwsRegions": ["us-east-1", "us-west-2"], | 
					
						
							|  |  |  |         }, | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     assert ( | 
					
						
							|  |  |  |         result["ConfigurationAggregator"]["ConfigurationAggregatorName"] == "testingOrg" | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |     assert result["ConfigurationAggregator"]["OrganizationAggregationSource"] == { | 
					
						
							|  |  |  |         "RoleArn": "arn:aws:iam::012345678910:role/SomeRole", | 
					
						
							|  |  |  |         "AwsRegions": ["us-east-1", "us-west-2"], | 
					
						
							|  |  |  |         "AllAwsRegions": False, | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_config | 
					
						
							|  |  |  | def test_describe_configuration_aggregators(): | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     client = boto3.client("config", region_name="us-west-2") | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Without any config aggregators: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     assert not client.describe_configuration_aggregators()["ConfigurationAggregators"] | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Make 10 config aggregators: | 
					
						
							|  |  |  |     for x in range(0, 10): | 
					
						
							|  |  |  |         client.put_configuration_aggregator( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |             ConfigurationAggregatorName="testing{}".format(x), | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  |             AccountAggregationSources=[ | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |                 {"AccountIds": ["012345678910"], "AllAwsRegions": True} | 
					
						
							|  |  |  |             ], | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Describe with an incorrect name: | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(ClientError) as ce: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         client.describe_configuration_aggregators( | 
					
						
							|  |  |  |             ConfigurationAggregatorNames=["DoesNotExist"] | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |     assert ( | 
					
						
							|  |  |  |         "The configuration aggregator does not exist." | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |         in ce.value.response["Error"]["Message"] | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     ) | 
					
						
							|  |  |  |     assert ( | 
					
						
							| 
									
										
										
										
											2020-10-06 08:46:05 +02:00
										 |  |  |         ce.value.response["Error"]["Code"] == "NoSuchConfigurationAggregatorException" | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Error describe with more than 1 item in the list: | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(ClientError) as ce: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         client.describe_configuration_aggregators( | 
					
						
							|  |  |  |             ConfigurationAggregatorNames=["testing0", "DoesNotExist"] | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |     assert ( | 
					
						
							|  |  |  |         "At least one of the configuration aggregators does not exist." | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |         in ce.value.response["Error"]["Message"] | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     ) | 
					
						
							|  |  |  |     assert ( | 
					
						
							| 
									
										
										
										
											2020-10-06 08:46:05 +02:00
										 |  |  |         ce.value.response["Error"]["Code"] == "NoSuchConfigurationAggregatorException" | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Get the normal list: | 
					
						
							|  |  |  |     result = client.describe_configuration_aggregators() | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     assert not result.get("NextToken") | 
					
						
							|  |  |  |     assert len(result["ConfigurationAggregators"]) == 10 | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Test filtered list: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     agg_names = ["testing0", "testing1", "testing2"] | 
					
						
							|  |  |  |     result = client.describe_configuration_aggregators( | 
					
						
							|  |  |  |         ConfigurationAggregatorNames=agg_names | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |     assert not result.get("NextToken") | 
					
						
							|  |  |  |     assert len(result["ConfigurationAggregators"]) == 3 | 
					
						
							|  |  |  |     assert [ | 
					
						
							|  |  |  |         agg["ConfigurationAggregatorName"] for agg in result["ConfigurationAggregators"] | 
					
						
							|  |  |  |     ] == agg_names | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Test Pagination: | 
					
						
							|  |  |  |     result = client.describe_configuration_aggregators(Limit=4) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     assert len(result["ConfigurationAggregators"]) == 4 | 
					
						
							|  |  |  |     assert result["NextToken"] == "testing4" | 
					
						
							|  |  |  |     assert [ | 
					
						
							|  |  |  |         agg["ConfigurationAggregatorName"] for agg in result["ConfigurationAggregators"] | 
					
						
							|  |  |  |     ] == ["testing{}".format(x) for x in range(0, 4)] | 
					
						
							|  |  |  |     result = client.describe_configuration_aggregators(Limit=4, NextToken="testing4") | 
					
						
							|  |  |  |     assert len(result["ConfigurationAggregators"]) == 4 | 
					
						
							|  |  |  |     assert result["NextToken"] == "testing8" | 
					
						
							|  |  |  |     assert [ | 
					
						
							|  |  |  |         agg["ConfigurationAggregatorName"] for agg in result["ConfigurationAggregators"] | 
					
						
							|  |  |  |     ] == ["testing{}".format(x) for x in range(4, 8)] | 
					
						
							|  |  |  |     result = client.describe_configuration_aggregators(Limit=4, NextToken="testing8") | 
					
						
							|  |  |  |     assert len(result["ConfigurationAggregators"]) == 2 | 
					
						
							|  |  |  |     assert not result.get("NextToken") | 
					
						
							|  |  |  |     assert [ | 
					
						
							|  |  |  |         agg["ConfigurationAggregatorName"] for agg in result["ConfigurationAggregators"] | 
					
						
							|  |  |  |     ] == ["testing{}".format(x) for x in range(8, 10)] | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Test Pagination with Filtering: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     result = client.describe_configuration_aggregators( | 
					
						
							|  |  |  |         ConfigurationAggregatorNames=["testing2", "testing4"], Limit=1 | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |     assert len(result["ConfigurationAggregators"]) == 1 | 
					
						
							|  |  |  |     assert result["NextToken"] == "testing4" | 
					
						
							|  |  |  |     assert ( | 
					
						
							|  |  |  |         result["ConfigurationAggregators"][0]["ConfigurationAggregatorName"] | 
					
						
							|  |  |  |         == "testing2" | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |     result = client.describe_configuration_aggregators( | 
					
						
							|  |  |  |         ConfigurationAggregatorNames=["testing2", "testing4"], | 
					
						
							|  |  |  |         Limit=1, | 
					
						
							|  |  |  |         NextToken="testing4", | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |     assert not result.get("NextToken") | 
					
						
							|  |  |  |     assert ( | 
					
						
							|  |  |  |         result["ConfigurationAggregators"][0]["ConfigurationAggregatorName"] | 
					
						
							|  |  |  |         == "testing4" | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Test with an invalid filter: | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(ClientError) as ce: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         client.describe_configuration_aggregators(NextToken="WRONG") | 
					
						
							| 
									
										
										
										
											2020-10-06 08:46:05 +02:00
										 |  |  |     assert "The nextToken provided is invalid" == ce.value.response["Error"]["Message"] | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |     assert ce.value.response["Error"]["Code"] == "InvalidNextTokenException" | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_config | 
					
						
							|  |  |  | def test_put_aggregation_authorization(): | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     client = boto3.client("config", region_name="us-west-2") | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Too many tags (>50): | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(ClientError) as ce: | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  |         client.put_aggregation_authorization( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |             AuthorizedAccountId="012345678910", | 
					
						
							|  |  |  |             AuthorizedAwsRegion="us-west-2", | 
					
						
							|  |  |  |             Tags=[ | 
					
						
							|  |  |  |                 {"Key": "{}".format(x), "Value": "{}".format(x)} for x in range(0, 51) | 
					
						
							|  |  |  |             ], | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  |         ) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     assert ( | 
					
						
							|  |  |  |         "Member must have length less than or equal to 50" | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |         in ce.value.response["Error"]["Message"] | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     ) | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |     assert ce.value.response["Error"]["Code"] == "ValidationException" | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Tag key is too big (>128 chars): | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(ClientError) as ce: | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  |         client.put_aggregation_authorization( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |             AuthorizedAccountId="012345678910", | 
					
						
							|  |  |  |             AuthorizedAwsRegion="us-west-2", | 
					
						
							|  |  |  |             Tags=[{"Key": "a" * 129, "Value": "a"}], | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  |         ) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     assert ( | 
					
						
							|  |  |  |         "Member must have length less than or equal to 128" | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |         in ce.value.response["Error"]["Message"] | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     ) | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |     assert ce.value.response["Error"]["Code"] == "ValidationException" | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Tag value is too big (>256 chars): | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(ClientError) as ce: | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  |         client.put_aggregation_authorization( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |             AuthorizedAccountId="012345678910", | 
					
						
							|  |  |  |             AuthorizedAwsRegion="us-west-2", | 
					
						
							|  |  |  |             Tags=[{"Key": "tag", "Value": "a" * 257}], | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  |         ) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     assert ( | 
					
						
							|  |  |  |         "Member must have length less than or equal to 256" | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |         in ce.value.response["Error"]["Message"] | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     ) | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |     assert ce.value.response["Error"]["Code"] == "ValidationException" | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Duplicate Tags: | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(ClientError) as ce: | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  |         client.put_aggregation_authorization( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |             AuthorizedAccountId="012345678910", | 
					
						
							|  |  |  |             AuthorizedAwsRegion="us-west-2", | 
					
						
							|  |  |  |             Tags=[{"Key": "a", "Value": "a"}, {"Key": "a", "Value": "a"}], | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  |         ) | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |     assert "Duplicate tag keys found." in ce.value.response["Error"]["Message"] | 
					
						
							|  |  |  |     assert ce.value.response["Error"]["Code"] == "InvalidInput" | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Invalid characters in the tag key: | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(ClientError) as ce: | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  |         client.put_aggregation_authorization( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |             AuthorizedAccountId="012345678910", | 
					
						
							|  |  |  |             AuthorizedAwsRegion="us-west-2", | 
					
						
							|  |  |  |             Tags=[{"Key": "!", "Value": "a"}], | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  |         ) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     assert ( | 
					
						
							|  |  |  |         "Member must satisfy regular expression pattern:" | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |         in ce.value.response["Error"]["Message"] | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     ) | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |     assert ce.value.response["Error"]["Code"] == "ValidationException" | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Put a normal one there: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     result = client.put_aggregation_authorization( | 
					
						
							|  |  |  |         AuthorizedAccountId="012345678910", | 
					
						
							|  |  |  |         AuthorizedAwsRegion="us-east-1", | 
					
						
							|  |  |  |         Tags=[{"Key": "tag", "Value": "a"}], | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-12-16 21:25:20 -05:00
										 |  |  |     assert result["AggregationAuthorization"][ | 
					
						
							|  |  |  |         "AggregationAuthorizationArn" | 
					
						
							|  |  |  |     ] == "arn:aws:config:us-west-2:{}:aggregation-authorization/012345678910/us-east-1".format( | 
					
						
							|  |  |  |         ACCOUNT_ID | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     ) | 
					
						
							|  |  |  |     assert result["AggregationAuthorization"]["AuthorizedAccountId"] == "012345678910" | 
					
						
							|  |  |  |     assert result["AggregationAuthorization"]["AuthorizedAwsRegion"] == "us-east-1" | 
					
						
							|  |  |  |     assert isinstance(result["AggregationAuthorization"]["CreationTime"], datetime) | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     creation_date = result["AggregationAuthorization"]["CreationTime"] | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # And again: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     result = client.put_aggregation_authorization( | 
					
						
							|  |  |  |         AuthorizedAccountId="012345678910", AuthorizedAwsRegion="us-east-1" | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-12-16 21:25:20 -05:00
										 |  |  |     assert result["AggregationAuthorization"][ | 
					
						
							|  |  |  |         "AggregationAuthorizationArn" | 
					
						
							|  |  |  |     ] == "arn:aws:config:us-west-2:{}:aggregation-authorization/012345678910/us-east-1".format( | 
					
						
							|  |  |  |         ACCOUNT_ID | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     ) | 
					
						
							|  |  |  |     assert result["AggregationAuthorization"]["AuthorizedAccountId"] == "012345678910" | 
					
						
							|  |  |  |     assert result["AggregationAuthorization"]["AuthorizedAwsRegion"] == "us-east-1" | 
					
						
							|  |  |  |     assert result["AggregationAuthorization"]["CreationTime"] == creation_date | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_config | 
					
						
							|  |  |  | def test_describe_aggregation_authorizations(): | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     client = boto3.client("config", region_name="us-west-2") | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # With no aggregation authorizations: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     assert not client.describe_aggregation_authorizations()["AggregationAuthorizations"] | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Make 10 account authorizations: | 
					
						
							|  |  |  |     for i in range(0, 10): | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         client.put_aggregation_authorization( | 
					
						
							|  |  |  |             AuthorizedAccountId="{}".format(str(i) * 12), | 
					
						
							|  |  |  |             AuthorizedAwsRegion="us-west-2", | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     result = client.describe_aggregation_authorizations() | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     assert len(result["AggregationAuthorizations"]) == 10 | 
					
						
							|  |  |  |     assert not result.get("NextToken") | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  |     for i in range(0, 10): | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         assert ( | 
					
						
							|  |  |  |             result["AggregationAuthorizations"][i]["AuthorizedAccountId"] == str(i) * 12 | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Test Pagination: | 
					
						
							|  |  |  |     result = client.describe_aggregation_authorizations(Limit=4) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     assert len(result["AggregationAuthorizations"]) == 4 | 
					
						
							|  |  |  |     assert result["NextToken"] == ("4" * 12) + "/us-west-2" | 
					
						
							|  |  |  |     assert [ | 
					
						
							|  |  |  |         auth["AuthorizedAccountId"] for auth in result["AggregationAuthorizations"] | 
					
						
							|  |  |  |     ] == ["{}".format(str(x) * 12) for x in range(0, 4)] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     result = client.describe_aggregation_authorizations( | 
					
						
							|  |  |  |         Limit=4, NextToken=("4" * 12) + "/us-west-2" | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |     assert len(result["AggregationAuthorizations"]) == 4 | 
					
						
							|  |  |  |     assert result["NextToken"] == ("8" * 12) + "/us-west-2" | 
					
						
							|  |  |  |     assert [ | 
					
						
							|  |  |  |         auth["AuthorizedAccountId"] for auth in result["AggregationAuthorizations"] | 
					
						
							|  |  |  |     ] == ["{}".format(str(x) * 12) for x in range(4, 8)] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     result = client.describe_aggregation_authorizations( | 
					
						
							|  |  |  |         Limit=4, NextToken=("8" * 12) + "/us-west-2" | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |     assert len(result["AggregationAuthorizations"]) == 2 | 
					
						
							|  |  |  |     assert not result.get("NextToken") | 
					
						
							|  |  |  |     assert [ | 
					
						
							|  |  |  |         auth["AuthorizedAccountId"] for auth in result["AggregationAuthorizations"] | 
					
						
							|  |  |  |     ] == ["{}".format(str(x) * 12) for x in range(8, 10)] | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Test with an invalid filter: | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(ClientError) as ce: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         client.describe_aggregation_authorizations(NextToken="WRONG") | 
					
						
							| 
									
										
										
										
											2020-10-06 08:46:05 +02:00
										 |  |  |     assert "The nextToken provided is invalid" == ce.value.response["Error"]["Message"] | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |     assert ce.value.response["Error"]["Code"] == "InvalidNextTokenException" | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_config | 
					
						
							|  |  |  | def test_delete_aggregation_authorization(): | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     client = boto3.client("config", region_name="us-west-2") | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     client.put_aggregation_authorization( | 
					
						
							|  |  |  |         AuthorizedAccountId="012345678910", AuthorizedAwsRegion="us-west-2" | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Delete it: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     client.delete_aggregation_authorization( | 
					
						
							|  |  |  |         AuthorizedAccountId="012345678910", AuthorizedAwsRegion="us-west-2" | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Verify that none are there: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     assert not client.describe_aggregation_authorizations()["AggregationAuthorizations"] | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Try it again -- nothing should happen: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     client.delete_aggregation_authorization( | 
					
						
							|  |  |  |         AuthorizedAccountId="012345678910", AuthorizedAwsRegion="us-west-2" | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_config | 
					
						
							|  |  |  | def test_delete_configuration_aggregator(): | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     client = boto3.client("config", region_name="us-west-2") | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  |     client.put_configuration_aggregator( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         ConfigurationAggregatorName="testing", | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  |         AccountAggregationSources=[ | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |             {"AccountIds": ["012345678910"], "AllAwsRegions": True} | 
					
						
							|  |  |  |         ], | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     client.delete_configuration_aggregator(ConfigurationAggregatorName="testing") | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # And again to confirm that it's deleted: | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(ClientError) as ce: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         client.delete_configuration_aggregator(ConfigurationAggregatorName="testing") | 
					
						
							|  |  |  |     assert ( | 
					
						
							|  |  |  |         "The configuration aggregator does not exist." | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |         in ce.value.response["Error"]["Message"] | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     ) | 
					
						
							|  |  |  |     assert ( | 
					
						
							| 
									
										
										
										
											2020-10-06 08:46:05 +02:00
										 |  |  |         ce.value.response["Error"]["Code"] == "NoSuchConfigurationAggregatorException" | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-07-29 16:36:57 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-25 16:27:25 -08:00
										 |  |  | @mock_config | 
					
						
							|  |  |  | def test_describe_configurations(): | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     client = boto3.client("config", region_name="us-west-2") | 
					
						
							| 
									
										
										
										
											2019-02-25 16:27:25 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Without any configurations: | 
					
						
							|  |  |  |     result = client.describe_configuration_recorders() | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     assert not result["ConfigurationRecorders"] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     client.put_configuration_recorder( | 
					
						
							|  |  |  |         ConfigurationRecorder={ | 
					
						
							|  |  |  |             "name": "testrecorder", | 
					
						
							|  |  |  |             "roleARN": "somearn", | 
					
						
							|  |  |  |             "recordingGroup": { | 
					
						
							|  |  |  |                 "allSupported": False, | 
					
						
							|  |  |  |                 "includeGlobalResourceTypes": False, | 
					
						
							|  |  |  |                 "resourceTypes": ["AWS::EC2::Volume", "AWS::EC2::VPC"], | 
					
						
							|  |  |  |             }, | 
					
						
							| 
									
										
										
										
											2019-02-25 16:27:25 -08:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-02-25 16:27:25 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     result = client.describe_configuration_recorders()["ConfigurationRecorders"] | 
					
						
							| 
									
										
										
										
											2019-02-25 16:27:25 -08:00
										 |  |  |     assert len(result) == 1 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     assert result[0]["name"] == "testrecorder" | 
					
						
							|  |  |  |     assert result[0]["roleARN"] == "somearn" | 
					
						
							|  |  |  |     assert not result[0]["recordingGroup"]["allSupported"] | 
					
						
							|  |  |  |     assert not result[0]["recordingGroup"]["includeGlobalResourceTypes"] | 
					
						
							|  |  |  |     assert len(result[0]["recordingGroup"]["resourceTypes"]) == 2 | 
					
						
							|  |  |  |     assert ( | 
					
						
							|  |  |  |         "AWS::EC2::Volume" in result[0]["recordingGroup"]["resourceTypes"] | 
					
						
							|  |  |  |         and "AWS::EC2::VPC" in result[0]["recordingGroup"]["resourceTypes"] | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-02-25 16:27:25 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Specify an incorrect name: | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(ClientError) as ce: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         client.describe_configuration_recorders(ConfigurationRecorderNames=["wrong"]) | 
					
						
							| 
									
										
										
										
											2020-10-06 08:46:05 +02:00
										 |  |  |     assert ce.value.response["Error"]["Code"] == "NoSuchConfigurationRecorderException" | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |     assert "wrong" in ce.value.response["Error"]["Message"] | 
					
						
							| 
									
										
										
										
											2019-02-25 16:27:25 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # And with both a good and wrong name: | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(ClientError) as ce: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         client.describe_configuration_recorders( | 
					
						
							|  |  |  |             ConfigurationRecorderNames=["testrecorder", "wrong"] | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2020-10-06 08:46:05 +02:00
										 |  |  |     assert ce.value.response["Error"]["Code"] == "NoSuchConfigurationRecorderException" | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |     assert "wrong" in ce.value.response["Error"]["Message"] | 
					
						
							| 
									
										
										
										
											2019-02-25 16:27:25 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_config | 
					
						
							|  |  |  | def test_delivery_channels(): | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     client = boto3.client("config", region_name="us-west-2") | 
					
						
							| 
									
										
										
										
											2019-02-25 16:27:25 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Try without a config recorder: | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(ClientError) as ce: | 
					
						
							| 
									
										
										
										
											2019-02-25 16:27:25 -08:00
										 |  |  |         client.put_delivery_channel(DeliveryChannel={}) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     assert ( | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |         ce.value.response["Error"]["Code"] | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         == "NoAvailableConfigurationRecorderException" | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |     assert ( | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |         ce.value.response["Error"]["Message"] | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         == "Configuration recorder is not available to " | 
					
						
							|  |  |  |         "put delivery channel." | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-02-25 16:27:25 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Create a config recorder to continue testing: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     client.put_configuration_recorder( | 
					
						
							|  |  |  |         ConfigurationRecorder={ | 
					
						
							|  |  |  |             "name": "testrecorder", | 
					
						
							|  |  |  |             "roleARN": "somearn", | 
					
						
							|  |  |  |             "recordingGroup": { | 
					
						
							|  |  |  |                 "allSupported": False, | 
					
						
							|  |  |  |                 "includeGlobalResourceTypes": False, | 
					
						
							|  |  |  |                 "resourceTypes": ["AWS::EC2::Volume", "AWS::EC2::VPC"], | 
					
						
							|  |  |  |             }, | 
					
						
							| 
									
										
										
										
											2019-02-25 16:27:25 -08:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-02-25 16:27:25 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Try without a name supplied: | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(ClientError) as ce: | 
					
						
							| 
									
										
										
										
											2019-02-25 16:27:25 -08:00
										 |  |  |         client.put_delivery_channel(DeliveryChannel={}) | 
					
						
							| 
									
										
										
										
											2020-10-06 08:46:05 +02:00
										 |  |  |     assert ce.value.response["Error"]["Code"] == "InvalidDeliveryChannelNameException" | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |     assert "is not valid, blank string." in ce.value.response["Error"]["Message"] | 
					
						
							| 
									
										
										
										
											2019-02-25 16:27:25 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Try with a really long name: | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(ClientError) as ce: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         client.put_delivery_channel(DeliveryChannel={"name": "a" * 257}) | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |     assert ce.value.response["Error"]["Code"] == "ValidationException" | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     assert ( | 
					
						
							|  |  |  |         "Member must have length less than or equal to 256" | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |         in ce.value.response["Error"]["Message"] | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-02-25 16:27:25 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Without specifying a bucket name: | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(ClientError) as ce: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         client.put_delivery_channel(DeliveryChannel={"name": "testchannel"}) | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |     assert ce.value.response["Error"]["Code"] == "NoSuchBucketException" | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     assert ( | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |         ce.value.response["Error"]["Message"] | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         == "Cannot find a S3 bucket with an empty bucket name." | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-02-25 16:27:25 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(ClientError) as ce: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         client.put_delivery_channel( | 
					
						
							|  |  |  |             DeliveryChannel={"name": "testchannel", "s3BucketName": ""} | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |     assert ce.value.response["Error"]["Code"] == "NoSuchBucketException" | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     assert ( | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |         ce.value.response["Error"]["Message"] | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         == "Cannot find a S3 bucket with an empty bucket name." | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-02-25 16:27:25 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # With an empty string for the S3 key prefix: | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(ClientError) as ce: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         client.put_delivery_channel( | 
					
						
							|  |  |  |             DeliveryChannel={ | 
					
						
							|  |  |  |                 "name": "testchannel", | 
					
						
							|  |  |  |                 "s3BucketName": "somebucket", | 
					
						
							|  |  |  |                 "s3KeyPrefix": "", | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |     assert ce.value.response["Error"]["Code"] == "InvalidS3KeyPrefixException" | 
					
						
							|  |  |  |     assert "empty s3 key prefix." in ce.value.response["Error"]["Message"] | 
					
						
							| 
									
										
										
										
											2019-02-25 16:27:25 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # With an empty string for the SNS ARN: | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(ClientError) as ce: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         client.put_delivery_channel( | 
					
						
							|  |  |  |             DeliveryChannel={ | 
					
						
							|  |  |  |                 "name": "testchannel", | 
					
						
							|  |  |  |                 "s3BucketName": "somebucket", | 
					
						
							|  |  |  |                 "snsTopicARN": "", | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |     assert ce.value.response["Error"]["Code"] == "InvalidSNSTopicARNException" | 
					
						
							|  |  |  |     assert "The sns topic arn" in ce.value.response["Error"]["Message"] | 
					
						
							| 
									
										
										
										
											2019-02-25 16:27:25 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # With an invalid delivery frequency: | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(ClientError) as ce: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         client.put_delivery_channel( | 
					
						
							|  |  |  |             DeliveryChannel={ | 
					
						
							|  |  |  |                 "name": "testchannel", | 
					
						
							|  |  |  |                 "s3BucketName": "somebucket", | 
					
						
							|  |  |  |                 "configSnapshotDeliveryProperties": {"deliveryFrequency": "WRONG"}, | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |     assert ce.value.response["Error"]["Code"] == "InvalidDeliveryFrequency" | 
					
						
							|  |  |  |     assert "WRONG" in ce.value.response["Error"]["Message"] | 
					
						
							|  |  |  |     assert "TwentyFour_Hours" in ce.value.response["Error"]["Message"] | 
					
						
							| 
									
										
										
										
											2019-02-25 16:27:25 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Create a proper one: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     client.put_delivery_channel( | 
					
						
							|  |  |  |         DeliveryChannel={"name": "testchannel", "s3BucketName": "somebucket"} | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |     result = client.describe_delivery_channels()["DeliveryChannels"] | 
					
						
							| 
									
										
										
										
											2019-02-25 16:27:25 -08:00
										 |  |  |     assert len(result) == 1 | 
					
						
							|  |  |  |     assert len(result[0].keys()) == 2 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     assert result[0]["name"] == "testchannel" | 
					
						
							|  |  |  |     assert result[0]["s3BucketName"] == "somebucket" | 
					
						
							| 
									
										
										
										
											2019-02-25 16:27:25 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Overwrite it with another proper configuration: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     client.put_delivery_channel( | 
					
						
							|  |  |  |         DeliveryChannel={ | 
					
						
							|  |  |  |             "name": "testchannel", | 
					
						
							|  |  |  |             "s3BucketName": "somebucket", | 
					
						
							|  |  |  |             "snsTopicARN": "sometopicarn", | 
					
						
							|  |  |  |             "configSnapshotDeliveryProperties": { | 
					
						
							|  |  |  |                 "deliveryFrequency": "TwentyFour_Hours" | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |     result = client.describe_delivery_channels()["DeliveryChannels"] | 
					
						
							| 
									
										
										
										
											2019-02-25 16:27:25 -08:00
										 |  |  |     assert len(result) == 1 | 
					
						
							|  |  |  |     assert len(result[0].keys()) == 4 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     assert result[0]["name"] == "testchannel" | 
					
						
							|  |  |  |     assert result[0]["s3BucketName"] == "somebucket" | 
					
						
							|  |  |  |     assert result[0]["snsTopicARN"] == "sometopicarn" | 
					
						
							|  |  |  |     assert ( | 
					
						
							|  |  |  |         result[0]["configSnapshotDeliveryProperties"]["deliveryFrequency"] | 
					
						
							|  |  |  |         == "TwentyFour_Hours" | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-02-25 16:27:25 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Can only have 1: | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(ClientError) as ce: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         client.put_delivery_channel( | 
					
						
							|  |  |  |             DeliveryChannel={"name": "testchannel2", "s3BucketName": "somebucket"} | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |     assert ( | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |         ce.value.response["Error"]["Code"] | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         == "MaxNumberOfDeliveryChannelsExceededException" | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |     assert ( | 
					
						
							|  |  |  |         "because the maximum number of delivery channels: 1 is reached." | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |         in ce.value.response["Error"]["Message"] | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-02-25 16:27:25 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_config | 
					
						
							|  |  |  | def test_describe_delivery_channels(): | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     client = boto3.client("config", region_name="us-west-2") | 
					
						
							|  |  |  |     client.put_configuration_recorder( | 
					
						
							|  |  |  |         ConfigurationRecorder={ | 
					
						
							|  |  |  |             "name": "testrecorder", | 
					
						
							|  |  |  |             "roleARN": "somearn", | 
					
						
							|  |  |  |             "recordingGroup": { | 
					
						
							|  |  |  |                 "allSupported": False, | 
					
						
							|  |  |  |                 "includeGlobalResourceTypes": False, | 
					
						
							|  |  |  |                 "resourceTypes": ["AWS::EC2::Volume", "AWS::EC2::VPC"], | 
					
						
							|  |  |  |             }, | 
					
						
							| 
									
										
										
										
											2019-02-25 16:27:25 -08:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-02-25 16:27:25 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Without any channels: | 
					
						
							|  |  |  |     result = client.describe_delivery_channels() | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     assert not result["DeliveryChannels"] | 
					
						
							| 
									
										
										
										
											2019-02-25 16:27:25 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     client.put_delivery_channel( | 
					
						
							|  |  |  |         DeliveryChannel={"name": "testchannel", "s3BucketName": "somebucket"} | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |     result = client.describe_delivery_channels()["DeliveryChannels"] | 
					
						
							| 
									
										
										
										
											2019-02-25 16:27:25 -08:00
										 |  |  |     assert len(result) == 1 | 
					
						
							|  |  |  |     assert len(result[0].keys()) == 2 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     assert result[0]["name"] == "testchannel" | 
					
						
							|  |  |  |     assert result[0]["s3BucketName"] == "somebucket" | 
					
						
							| 
									
										
										
										
											2019-02-25 16:27:25 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Overwrite it with another proper configuration: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     client.put_delivery_channel( | 
					
						
							|  |  |  |         DeliveryChannel={ | 
					
						
							|  |  |  |             "name": "testchannel", | 
					
						
							|  |  |  |             "s3BucketName": "somebucket", | 
					
						
							|  |  |  |             "snsTopicARN": "sometopicarn", | 
					
						
							|  |  |  |             "configSnapshotDeliveryProperties": { | 
					
						
							|  |  |  |                 "deliveryFrequency": "TwentyFour_Hours" | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |     result = client.describe_delivery_channels()["DeliveryChannels"] | 
					
						
							| 
									
										
										
										
											2019-02-25 16:27:25 -08:00
										 |  |  |     assert len(result) == 1 | 
					
						
							|  |  |  |     assert len(result[0].keys()) == 4 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     assert result[0]["name"] == "testchannel" | 
					
						
							|  |  |  |     assert result[0]["s3BucketName"] == "somebucket" | 
					
						
							|  |  |  |     assert result[0]["snsTopicARN"] == "sometopicarn" | 
					
						
							|  |  |  |     assert ( | 
					
						
							|  |  |  |         result[0]["configSnapshotDeliveryProperties"]["deliveryFrequency"] | 
					
						
							|  |  |  |         == "TwentyFour_Hours" | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-02-25 16:27:25 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Specify an incorrect name: | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(ClientError) as ce: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         client.describe_delivery_channels(DeliveryChannelNames=["wrong"]) | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |     assert ce.value.response["Error"]["Code"] == "NoSuchDeliveryChannelException" | 
					
						
							|  |  |  |     assert "wrong" in ce.value.response["Error"]["Message"] | 
					
						
							| 
									
										
										
										
											2019-02-25 16:27:25 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # And with both a good and wrong name: | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(ClientError) as ce: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         client.describe_delivery_channels(DeliveryChannelNames=["testchannel", "wrong"]) | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |     assert ce.value.response["Error"]["Code"] == "NoSuchDeliveryChannelException" | 
					
						
							|  |  |  |     assert "wrong" in ce.value.response["Error"]["Message"] | 
					
						
							| 
									
										
										
										
											2019-02-25 16:27:25 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_config | 
					
						
							|  |  |  | def test_start_configuration_recorder(): | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     client = boto3.client("config", region_name="us-west-2") | 
					
						
							| 
									
										
										
										
											2019-02-25 16:27:25 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Without a config recorder: | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(ClientError) as ce: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         client.start_configuration_recorder(ConfigurationRecorderName="testrecorder") | 
					
						
							| 
									
										
										
										
											2020-10-06 08:46:05 +02:00
										 |  |  |     assert ce.value.response["Error"]["Code"] == "NoSuchConfigurationRecorderException" | 
					
						
							| 
									
										
										
										
											2019-02-25 16:27:25 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Make the config recorder; | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     client.put_configuration_recorder( | 
					
						
							|  |  |  |         ConfigurationRecorder={ | 
					
						
							|  |  |  |             "name": "testrecorder", | 
					
						
							|  |  |  |             "roleARN": "somearn", | 
					
						
							|  |  |  |             "recordingGroup": { | 
					
						
							|  |  |  |                 "allSupported": False, | 
					
						
							|  |  |  |                 "includeGlobalResourceTypes": False, | 
					
						
							|  |  |  |                 "resourceTypes": ["AWS::EC2::Volume", "AWS::EC2::VPC"], | 
					
						
							|  |  |  |             }, | 
					
						
							| 
									
										
										
										
											2019-02-25 16:27:25 -08:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-02-25 16:27:25 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Without a delivery channel: | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(ClientError) as ce: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         client.start_configuration_recorder(ConfigurationRecorderName="testrecorder") | 
					
						
							| 
									
										
										
										
											2020-10-06 08:46:05 +02:00
										 |  |  |     assert ce.value.response["Error"]["Code"] == "NoAvailableDeliveryChannelException" | 
					
						
							| 
									
										
										
										
											2019-02-25 16:27:25 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Make the delivery channel: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     client.put_delivery_channel( | 
					
						
							|  |  |  |         DeliveryChannel={"name": "testchannel", "s3BucketName": "somebucket"} | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-02-25 16:27:25 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Start it: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     client.start_configuration_recorder(ConfigurationRecorderName="testrecorder") | 
					
						
							| 
									
										
										
										
											2019-02-25 16:27:25 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Verify it's enabled: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     result = client.describe_configuration_recorder_status()[ | 
					
						
							|  |  |  |         "ConfigurationRecordersStatus" | 
					
						
							|  |  |  |     ] | 
					
						
							|  |  |  |     lower_bound = datetime.utcnow() - timedelta(minutes=5) | 
					
						
							|  |  |  |     assert result[0]["recording"] | 
					
						
							|  |  |  |     assert result[0]["lastStatus"] == "PENDING" | 
					
						
							|  |  |  |     assert ( | 
					
						
							|  |  |  |         lower_bound | 
					
						
							|  |  |  |         < result[0]["lastStartTime"].replace(tzinfo=None) | 
					
						
							|  |  |  |         <= datetime.utcnow() | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |     assert ( | 
					
						
							|  |  |  |         lower_bound | 
					
						
							|  |  |  |         < result[0]["lastStatusChangeTime"].replace(tzinfo=None) | 
					
						
							|  |  |  |         <= datetime.utcnow() | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-02-25 16:27:25 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_config | 
					
						
							|  |  |  | def test_stop_configuration_recorder(): | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     client = boto3.client("config", region_name="us-west-2") | 
					
						
							| 
									
										
										
										
											2019-02-25 16:27:25 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Without a config recorder: | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(ClientError) as ce: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         client.stop_configuration_recorder(ConfigurationRecorderName="testrecorder") | 
					
						
							| 
									
										
										
										
											2020-10-06 08:46:05 +02:00
										 |  |  |     assert ce.value.response["Error"]["Code"] == "NoSuchConfigurationRecorderException" | 
					
						
							| 
									
										
										
										
											2019-02-25 16:27:25 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Make the config recorder; | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     client.put_configuration_recorder( | 
					
						
							|  |  |  |         ConfigurationRecorder={ | 
					
						
							|  |  |  |             "name": "testrecorder", | 
					
						
							|  |  |  |             "roleARN": "somearn", | 
					
						
							|  |  |  |             "recordingGroup": { | 
					
						
							|  |  |  |                 "allSupported": False, | 
					
						
							|  |  |  |                 "includeGlobalResourceTypes": False, | 
					
						
							|  |  |  |                 "resourceTypes": ["AWS::EC2::Volume", "AWS::EC2::VPC"], | 
					
						
							|  |  |  |             }, | 
					
						
							| 
									
										
										
										
											2019-02-25 16:27:25 -08:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-02-25 16:27:25 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Make the delivery channel for creation: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     client.put_delivery_channel( | 
					
						
							|  |  |  |         DeliveryChannel={"name": "testchannel", "s3BucketName": "somebucket"} | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-02-25 16:27:25 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Start it: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     client.start_configuration_recorder(ConfigurationRecorderName="testrecorder") | 
					
						
							|  |  |  |     client.stop_configuration_recorder(ConfigurationRecorderName="testrecorder") | 
					
						
							| 
									
										
										
										
											2019-02-25 16:27:25 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Verify it's disabled: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     result = client.describe_configuration_recorder_status()[ | 
					
						
							|  |  |  |         "ConfigurationRecordersStatus" | 
					
						
							|  |  |  |     ] | 
					
						
							|  |  |  |     lower_bound = datetime.utcnow() - timedelta(minutes=5) | 
					
						
							|  |  |  |     assert not result[0]["recording"] | 
					
						
							|  |  |  |     assert result[0]["lastStatus"] == "PENDING" | 
					
						
							|  |  |  |     assert ( | 
					
						
							|  |  |  |         lower_bound | 
					
						
							|  |  |  |         < result[0]["lastStartTime"].replace(tzinfo=None) | 
					
						
							|  |  |  |         <= datetime.utcnow() | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |     assert ( | 
					
						
							|  |  |  |         lower_bound | 
					
						
							|  |  |  |         < result[0]["lastStopTime"].replace(tzinfo=None) | 
					
						
							|  |  |  |         <= datetime.utcnow() | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |     assert ( | 
					
						
							|  |  |  |         lower_bound | 
					
						
							|  |  |  |         < result[0]["lastStatusChangeTime"].replace(tzinfo=None) | 
					
						
							|  |  |  |         <= datetime.utcnow() | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-02-25 16:27:25 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_config | 
					
						
							|  |  |  | def test_describe_configuration_recorder_status(): | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     client = boto3.client("config", region_name="us-west-2") | 
					
						
							| 
									
										
										
										
											2019-02-25 16:27:25 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Without any: | 
					
						
							|  |  |  |     result = client.describe_configuration_recorder_status() | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     assert not result["ConfigurationRecordersStatus"] | 
					
						
							| 
									
										
										
										
											2019-02-25 16:27:25 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Make the config recorder; | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     client.put_configuration_recorder( | 
					
						
							|  |  |  |         ConfigurationRecorder={ | 
					
						
							|  |  |  |             "name": "testrecorder", | 
					
						
							|  |  |  |             "roleARN": "somearn", | 
					
						
							|  |  |  |             "recordingGroup": { | 
					
						
							|  |  |  |                 "allSupported": False, | 
					
						
							|  |  |  |                 "includeGlobalResourceTypes": False, | 
					
						
							|  |  |  |                 "resourceTypes": ["AWS::EC2::Volume", "AWS::EC2::VPC"], | 
					
						
							|  |  |  |             }, | 
					
						
							| 
									
										
										
										
											2019-02-25 16:27:25 -08:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-02-25 16:27:25 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Without specifying a config recorder: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     result = client.describe_configuration_recorder_status()[ | 
					
						
							|  |  |  |         "ConfigurationRecordersStatus" | 
					
						
							|  |  |  |     ] | 
					
						
							| 
									
										
										
										
											2019-02-25 16:27:25 -08:00
										 |  |  |     assert len(result) == 1 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     assert result[0]["name"] == "testrecorder" | 
					
						
							|  |  |  |     assert not result[0]["recording"] | 
					
						
							| 
									
										
										
										
											2019-02-25 16:27:25 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # With a proper name: | 
					
						
							|  |  |  |     result = client.describe_configuration_recorder_status( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         ConfigurationRecorderNames=["testrecorder"] | 
					
						
							|  |  |  |     )["ConfigurationRecordersStatus"] | 
					
						
							| 
									
										
										
										
											2019-02-25 16:27:25 -08:00
										 |  |  |     assert len(result) == 1 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     assert result[0]["name"] == "testrecorder" | 
					
						
							|  |  |  |     assert not result[0]["recording"] | 
					
						
							| 
									
										
										
										
											2019-02-25 16:27:25 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Invalid name: | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(ClientError) as ce: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         client.describe_configuration_recorder_status( | 
					
						
							|  |  |  |             ConfigurationRecorderNames=["testrecorder", "wrong"] | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2020-10-06 08:46:05 +02:00
										 |  |  |     assert ce.value.response["Error"]["Code"] == "NoSuchConfigurationRecorderException" | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |     assert "wrong" in ce.value.response["Error"]["Message"] | 
					
						
							| 
									
										
										
										
											2019-02-25 16:27:25 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_config | 
					
						
							|  |  |  | def test_delete_configuration_recorder(): | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     client = boto3.client("config", region_name="us-west-2") | 
					
						
							| 
									
										
										
										
											2019-02-25 16:27:25 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Make the config recorder; | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     client.put_configuration_recorder( | 
					
						
							|  |  |  |         ConfigurationRecorder={ | 
					
						
							|  |  |  |             "name": "testrecorder", | 
					
						
							|  |  |  |             "roleARN": "somearn", | 
					
						
							|  |  |  |             "recordingGroup": { | 
					
						
							|  |  |  |                 "allSupported": False, | 
					
						
							|  |  |  |                 "includeGlobalResourceTypes": False, | 
					
						
							|  |  |  |                 "resourceTypes": ["AWS::EC2::Volume", "AWS::EC2::VPC"], | 
					
						
							|  |  |  |             }, | 
					
						
							| 
									
										
										
										
											2019-02-25 16:27:25 -08:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-02-25 16:27:25 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Delete it: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     client.delete_configuration_recorder(ConfigurationRecorderName="testrecorder") | 
					
						
							| 
									
										
										
										
											2019-02-25 16:27:25 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Try again -- it should be deleted: | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(ClientError) as ce: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         client.delete_configuration_recorder(ConfigurationRecorderName="testrecorder") | 
					
						
							| 
									
										
										
										
											2020-10-06 08:46:05 +02:00
										 |  |  |     assert ce.value.response["Error"]["Code"] == "NoSuchConfigurationRecorderException" | 
					
						
							| 
									
										
										
										
											2019-02-25 16:27:25 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_config | 
					
						
							|  |  |  | def test_delete_delivery_channel(): | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     client = boto3.client("config", region_name="us-west-2") | 
					
						
							| 
									
										
										
										
											2019-02-25 16:27:25 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Need a recorder to test the constraint on recording being enabled: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     client.put_configuration_recorder( | 
					
						
							|  |  |  |         ConfigurationRecorder={ | 
					
						
							|  |  |  |             "name": "testrecorder", | 
					
						
							|  |  |  |             "roleARN": "somearn", | 
					
						
							|  |  |  |             "recordingGroup": { | 
					
						
							|  |  |  |                 "allSupported": False, | 
					
						
							|  |  |  |                 "includeGlobalResourceTypes": False, | 
					
						
							|  |  |  |                 "resourceTypes": ["AWS::EC2::Volume", "AWS::EC2::VPC"], | 
					
						
							|  |  |  |             }, | 
					
						
							| 
									
										
										
										
											2019-02-25 16:27:25 -08:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     ) | 
					
						
							|  |  |  |     client.put_delivery_channel( | 
					
						
							|  |  |  |         DeliveryChannel={"name": "testchannel", "s3BucketName": "somebucket"} | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |     client.start_configuration_recorder(ConfigurationRecorderName="testrecorder") | 
					
						
							| 
									
										
										
										
											2019-02-25 16:27:25 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # With the recorder enabled: | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(ClientError) as ce: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         client.delete_delivery_channel(DeliveryChannelName="testchannel") | 
					
						
							|  |  |  |     assert ( | 
					
						
							| 
									
										
										
										
											2020-10-06 08:46:05 +02:00
										 |  |  |         ce.value.response["Error"]["Code"] == "LastDeliveryChannelDeleteFailedException" | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     ) | 
					
						
							|  |  |  |     assert ( | 
					
						
							|  |  |  |         "because there is a running configuration recorder." | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |         in ce.value.response["Error"]["Message"] | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-02-25 16:27:25 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Stop recording: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     client.stop_configuration_recorder(ConfigurationRecorderName="testrecorder") | 
					
						
							| 
									
										
										
										
											2019-02-25 16:27:25 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Try again: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     client.delete_delivery_channel(DeliveryChannelName="testchannel") | 
					
						
							| 
									
										
										
										
											2019-02-25 16:27:25 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Verify: | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(ClientError) as ce: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         client.delete_delivery_channel(DeliveryChannelName="testchannel") | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |     assert ce.value.response["Error"]["Code"] == "NoSuchDeliveryChannelException" | 
					
						
							| 
									
										
										
										
											2019-09-23 17:16:20 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_config | 
					
						
							|  |  |  | @mock_s3 | 
					
						
							|  |  |  | def test_list_discovered_resource(): | 
					
						
							|  |  |  |     """NOTE: We are only really testing the Config part. For each individual service, please add tests
 | 
					
						
							| 
									
										
										
										
											2020-10-06 08:46:05 +02:00
										 |  |  |     for that individual service's "list_config_service_resources" function. | 
					
						
							| 
									
										
										
										
											2019-09-23 17:16:20 -07:00
										 |  |  |     """
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     client = boto3.client("config", region_name="us-west-2") | 
					
						
							| 
									
										
										
										
											2019-09-23 17:16:20 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # With nothing created yet: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     assert not client.list_discovered_resources(resourceType="AWS::S3::Bucket")[ | 
					
						
							|  |  |  |         "resourceIdentifiers" | 
					
						
							|  |  |  |     ] | 
					
						
							| 
									
										
										
										
											2019-09-23 17:16:20 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Create some S3 buckets: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     s3_client = boto3.client("s3", region_name="us-west-2") | 
					
						
							| 
									
										
										
										
											2019-09-23 17:16:20 -07:00
										 |  |  |     for x in range(0, 10): | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         s3_client.create_bucket( | 
					
						
							|  |  |  |             Bucket="bucket{}".format(x), | 
					
						
							|  |  |  |             CreateBucketConfiguration={"LocationConstraint": "us-west-2"}, | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2019-09-23 17:16:20 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-23 18:37:35 -07:00
										 |  |  |     # And with an EU bucket -- this should not show up for the us-west-2 config backend: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     eu_client = boto3.client("s3", region_name="eu-west-1") | 
					
						
							|  |  |  |     eu_client.create_bucket( | 
					
						
							|  |  |  |         Bucket="eu-bucket", | 
					
						
							|  |  |  |         CreateBucketConfiguration={"LocationConstraint": "eu-west-1"}, | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-10-23 18:37:35 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-23 17:16:20 -07:00
										 |  |  |     # Now try: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     result = client.list_discovered_resources(resourceType="AWS::S3::Bucket") | 
					
						
							|  |  |  |     assert len(result["resourceIdentifiers"]) == 10 | 
					
						
							| 
									
										
										
										
											2019-09-23 17:16:20 -07:00
										 |  |  |     for x in range(0, 10): | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         assert result["resourceIdentifiers"][x] == { | 
					
						
							|  |  |  |             "resourceType": "AWS::S3::Bucket", | 
					
						
							|  |  |  |             "resourceId": "bucket{}".format(x), | 
					
						
							|  |  |  |             "resourceName": "bucket{}".format(x), | 
					
						
							| 
									
										
										
										
											2019-09-23 17:16:20 -07:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     assert not result.get("nextToken") | 
					
						
							| 
									
										
										
										
											2019-09-23 17:16:20 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     result = client.list_discovered_resources( | 
					
						
							|  |  |  |         resourceType="AWS::S3::Bucket", resourceName="eu-bucket" | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |     assert not result["resourceIdentifiers"] | 
					
						
							| 
									
										
										
										
											2019-10-23 18:37:35 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-23 17:16:20 -07:00
										 |  |  |     # Test that pagination places a proper nextToken in the response and also that the limit works: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     result = client.list_discovered_resources( | 
					
						
							|  |  |  |         resourceType="AWS::S3::Bucket", limit=1, nextToken="bucket1" | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |     assert len(result["resourceIdentifiers"]) == 1 | 
					
						
							|  |  |  |     assert result["nextToken"] == "bucket2" | 
					
						
							| 
									
										
										
										
											2019-09-23 17:16:20 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Try with a resource name: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     result = client.list_discovered_resources( | 
					
						
							|  |  |  |         resourceType="AWS::S3::Bucket", limit=1, resourceName="bucket1" | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |     assert len(result["resourceIdentifiers"]) == 1 | 
					
						
							|  |  |  |     assert not result.get("nextToken") | 
					
						
							| 
									
										
										
										
											2019-09-23 17:16:20 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Try with a resource ID: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     result = client.list_discovered_resources( | 
					
						
							|  |  |  |         resourceType="AWS::S3::Bucket", limit=1, resourceIds=["bucket1"] | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |     assert len(result["resourceIdentifiers"]) == 1 | 
					
						
							|  |  |  |     assert not result.get("nextToken") | 
					
						
							| 
									
										
										
										
											2019-09-23 17:16:20 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Try with duplicated resource IDs: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     result = client.list_discovered_resources( | 
					
						
							|  |  |  |         resourceType="AWS::S3::Bucket", limit=1, resourceIds=["bucket1", "bucket1"] | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |     assert len(result["resourceIdentifiers"]) == 1 | 
					
						
							|  |  |  |     assert not result.get("nextToken") | 
					
						
							| 
									
										
										
										
											2019-09-23 17:16:20 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Test with an invalid resource type: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     assert not client.list_discovered_resources( | 
					
						
							|  |  |  |         resourceType="LOL::NOT::A::RESOURCE::TYPE" | 
					
						
							|  |  |  |     )["resourceIdentifiers"] | 
					
						
							| 
									
										
										
										
											2019-09-23 17:16:20 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Test with an invalid page num > 100: | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(ClientError) as ce: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         client.list_discovered_resources(resourceType="AWS::S3::Bucket", limit=101) | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |     assert "101" in ce.value.response["Error"]["Message"] | 
					
						
							| 
									
										
										
										
											2019-09-23 17:16:20 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Test by supplying both resourceName and also resourceIds: | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(ClientError) as ce: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         client.list_discovered_resources( | 
					
						
							|  |  |  |             resourceType="AWS::S3::Bucket", | 
					
						
							|  |  |  |             resourceName="whats", | 
					
						
							|  |  |  |             resourceIds=["up", "doc"], | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |     assert ( | 
					
						
							|  |  |  |         "Both Resource ID and Resource Name cannot be specified in the request" | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |         in ce.value.response["Error"]["Message"] | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-09-23 17:16:20 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # More than 20 resourceIds: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     resource_ids = ["{}".format(x) for x in range(0, 21)] | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(ClientError) as ce: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         client.list_discovered_resources( | 
					
						
							|  |  |  |             resourceType="AWS::S3::Bucket", resourceIds=resource_ids | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |     assert ( | 
					
						
							|  |  |  |         "The specified list had more than 20 resource ID's." | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |         in ce.value.response["Error"]["Message"] | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-09-23 17:16:20 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_config | 
					
						
							|  |  |  | @mock_s3 | 
					
						
							|  |  |  | def test_list_aggregate_discovered_resource(): | 
					
						
							|  |  |  |     """NOTE: We are only really testing the Config part. For each individual service, please add tests
 | 
					
						
							| 
									
										
										
										
											2020-10-06 08:46:05 +02:00
										 |  |  |     for that individual service's "list_config_service_resources" function. | 
					
						
							| 
									
										
										
										
											2019-09-23 17:16:20 -07:00
										 |  |  |     """
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     client = boto3.client("config", region_name="us-west-2") | 
					
						
							| 
									
										
										
										
											2019-09-23 17:16:20 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Without an aggregator: | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(ClientError) as ce: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         client.list_aggregate_discovered_resources( | 
					
						
							|  |  |  |             ConfigurationAggregatorName="lolno", ResourceType="AWS::S3::Bucket" | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |     assert ( | 
					
						
							|  |  |  |         "The configuration aggregator does not exist" | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |         in ce.value.response["Error"]["Message"] | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-09-23 17:16:20 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Create the aggregator: | 
					
						
							|  |  |  |     account_aggregation_source = { | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         "AccountIds": ["012345678910", "111111111111", "222222222222"], | 
					
						
							|  |  |  |         "AllAwsRegions": True, | 
					
						
							| 
									
										
										
										
											2019-09-23 17:16:20 -07:00
										 |  |  |     } | 
					
						
							|  |  |  |     client.put_configuration_aggregator( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         ConfigurationAggregatorName="testing", | 
					
						
							|  |  |  |         AccountAggregationSources=[account_aggregation_source], | 
					
						
							| 
									
										
										
										
											2019-09-23 17:16:20 -07:00
										 |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # With nothing created yet: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     assert not client.list_aggregate_discovered_resources( | 
					
						
							|  |  |  |         ConfigurationAggregatorName="testing", ResourceType="AWS::S3::Bucket" | 
					
						
							|  |  |  |     )["ResourceIdentifiers"] | 
					
						
							| 
									
										
										
										
											2019-09-23 17:16:20 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Create some S3 buckets: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     s3_client = boto3.client("s3", region_name="us-west-2") | 
					
						
							| 
									
										
										
										
											2019-09-23 17:16:20 -07:00
										 |  |  |     for x in range(0, 10): | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         s3_client.create_bucket( | 
					
						
							|  |  |  |             Bucket="bucket{}".format(x), | 
					
						
							|  |  |  |             CreateBucketConfiguration={"LocationConstraint": "us-west-2"}, | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2019-09-23 17:16:20 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     s3_client_eu = boto3.client("s3", region_name="eu-west-1") | 
					
						
							| 
									
										
										
										
											2019-09-23 17:16:20 -07:00
										 |  |  |     for x in range(10, 12): | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         s3_client_eu.create_bucket( | 
					
						
							|  |  |  |             Bucket="eu-bucket{}".format(x), | 
					
						
							|  |  |  |             CreateBucketConfiguration={"LocationConstraint": "eu-west-1"}, | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2019-09-23 17:16:20 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Now try: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     result = client.list_aggregate_discovered_resources( | 
					
						
							|  |  |  |         ConfigurationAggregatorName="testing", ResourceType="AWS::S3::Bucket" | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |     assert len(result["ResourceIdentifiers"]) == 12 | 
					
						
							| 
									
										
										
										
											2019-09-23 17:16:20 -07:00
										 |  |  |     for x in range(0, 10): | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         assert result["ResourceIdentifiers"][x] == { | 
					
						
							| 
									
										
										
										
											2019-12-15 19:22:26 -05:00
										 |  |  |             "SourceAccountId": ACCOUNT_ID, | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |             "ResourceType": "AWS::S3::Bucket", | 
					
						
							|  |  |  |             "ResourceId": "bucket{}".format(x), | 
					
						
							|  |  |  |             "ResourceName": "bucket{}".format(x), | 
					
						
							|  |  |  |             "SourceRegion": "us-west-2", | 
					
						
							| 
									
										
										
										
											2019-09-23 17:16:20 -07:00
										 |  |  |         } | 
					
						
							|  |  |  |     for x in range(11, 12): | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         assert result["ResourceIdentifiers"][x] == { | 
					
						
							| 
									
										
										
										
											2019-12-15 19:22:26 -05:00
										 |  |  |             "SourceAccountId": ACCOUNT_ID, | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |             "ResourceType": "AWS::S3::Bucket", | 
					
						
							|  |  |  |             "ResourceId": "eu-bucket{}".format(x), | 
					
						
							|  |  |  |             "ResourceName": "eu-bucket{}".format(x), | 
					
						
							|  |  |  |             "SourceRegion": "eu-west-1", | 
					
						
							| 
									
										
										
										
											2019-09-23 17:16:20 -07:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     assert not result.get("NextToken") | 
					
						
							| 
									
										
										
										
											2019-09-23 17:16:20 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Test that pagination places a proper nextToken in the response and also that the limit works: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     result = client.list_aggregate_discovered_resources( | 
					
						
							|  |  |  |         ConfigurationAggregatorName="testing", | 
					
						
							|  |  |  |         ResourceType="AWS::S3::Bucket", | 
					
						
							|  |  |  |         Limit=1, | 
					
						
							|  |  |  |         NextToken="bucket1", | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |     assert len(result["ResourceIdentifiers"]) == 1 | 
					
						
							|  |  |  |     assert result["NextToken"] == "bucket2" | 
					
						
							| 
									
										
										
										
											2019-09-23 17:16:20 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Try with a resource name: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     result = client.list_aggregate_discovered_resources( | 
					
						
							|  |  |  |         ConfigurationAggregatorName="testing", | 
					
						
							|  |  |  |         ResourceType="AWS::S3::Bucket", | 
					
						
							|  |  |  |         Limit=1, | 
					
						
							|  |  |  |         NextToken="bucket1", | 
					
						
							|  |  |  |         Filters={"ResourceName": "bucket1"}, | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |     assert len(result["ResourceIdentifiers"]) == 1 | 
					
						
							|  |  |  |     assert not result.get("NextToken") | 
					
						
							| 
									
										
										
										
											2019-09-23 17:16:20 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Try with a resource ID: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     result = client.list_aggregate_discovered_resources( | 
					
						
							|  |  |  |         ConfigurationAggregatorName="testing", | 
					
						
							|  |  |  |         ResourceType="AWS::S3::Bucket", | 
					
						
							|  |  |  |         Limit=1, | 
					
						
							|  |  |  |         NextToken="bucket1", | 
					
						
							|  |  |  |         Filters={"ResourceId": "bucket1"}, | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |     assert len(result["ResourceIdentifiers"]) == 1 | 
					
						
							|  |  |  |     assert not result.get("NextToken") | 
					
						
							| 
									
										
										
										
											2019-09-23 17:16:20 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Try with a region specified: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     result = client.list_aggregate_discovered_resources( | 
					
						
							|  |  |  |         ConfigurationAggregatorName="testing", | 
					
						
							|  |  |  |         ResourceType="AWS::S3::Bucket", | 
					
						
							|  |  |  |         Filters={"Region": "eu-west-1"}, | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |     assert len(result["ResourceIdentifiers"]) == 2 | 
					
						
							|  |  |  |     assert result["ResourceIdentifiers"][0]["SourceRegion"] == "eu-west-1" | 
					
						
							|  |  |  |     assert not result.get("NextToken") | 
					
						
							| 
									
										
										
										
											2019-09-23 17:16:20 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Try with both name and id set to the incorrect values: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     assert not client.list_aggregate_discovered_resources( | 
					
						
							|  |  |  |         ConfigurationAggregatorName="testing", | 
					
						
							|  |  |  |         ResourceType="AWS::S3::Bucket", | 
					
						
							|  |  |  |         Filters={"ResourceId": "bucket1", "ResourceName": "bucket2"}, | 
					
						
							|  |  |  |     )["ResourceIdentifiers"] | 
					
						
							| 
									
										
										
										
											2019-09-23 17:16:20 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Test with an invalid resource type: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     assert not client.list_aggregate_discovered_resources( | 
					
						
							|  |  |  |         ConfigurationAggregatorName="testing", | 
					
						
							|  |  |  |         ResourceType="LOL::NOT::A::RESOURCE::TYPE", | 
					
						
							|  |  |  |     )["ResourceIdentifiers"] | 
					
						
							| 
									
										
										
										
											2019-09-23 17:16:20 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Try with correct name but incorrect region: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     assert not client.list_aggregate_discovered_resources( | 
					
						
							|  |  |  |         ConfigurationAggregatorName="testing", | 
					
						
							|  |  |  |         ResourceType="AWS::S3::Bucket", | 
					
						
							|  |  |  |         Filters={"ResourceId": "bucket1", "Region": "us-west-1"}, | 
					
						
							|  |  |  |     )["ResourceIdentifiers"] | 
					
						
							| 
									
										
										
										
											2019-09-23 17:16:20 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Test with an invalid page num > 100: | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(ClientError) as ce: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         client.list_aggregate_discovered_resources( | 
					
						
							|  |  |  |             ConfigurationAggregatorName="testing", | 
					
						
							|  |  |  |             ResourceType="AWS::S3::Bucket", | 
					
						
							|  |  |  |             Limit=101, | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |     assert "101" in ce.value.response["Error"]["Message"] | 
					
						
							| 
									
										
										
										
											2019-10-03 18:00:07 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_config | 
					
						
							|  |  |  | @mock_s3 | 
					
						
							|  |  |  | def test_get_resource_config_history(): | 
					
						
							|  |  |  |     """NOTE: We are only really testing the Config part. For each individual service, please add tests
 | 
					
						
							| 
									
										
										
										
											2020-10-06 08:46:05 +02:00
										 |  |  |     for that individual service's "get_config_resource" function. | 
					
						
							| 
									
										
										
										
											2019-10-03 18:00:07 -07:00
										 |  |  |     """
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     client = boto3.client("config", region_name="us-west-2") | 
					
						
							| 
									
										
										
										
											2019-10-03 18:00:07 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # With an invalid resource type: | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(ClientError) as ce: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         client.get_resource_config_history( | 
					
						
							|  |  |  |             resourceType="NOT::A::RESOURCE", resourceId="notcreatedyet" | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |     assert ce.value.response["Error"] == { | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         "Message": "Resource notcreatedyet of resourceType:NOT::A::RESOURCE is unknown or has " | 
					
						
							|  |  |  |         "not been discovered", | 
					
						
							|  |  |  |         "Code": "ResourceNotDiscoveredException", | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2019-10-03 18:00:07 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # With nothing created yet: | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(ClientError) as ce: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         client.get_resource_config_history( | 
					
						
							|  |  |  |             resourceType="AWS::S3::Bucket", resourceId="notcreatedyet" | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |     assert ce.value.response["Error"] == { | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         "Message": "Resource notcreatedyet of resourceType:AWS::S3::Bucket is unknown or has " | 
					
						
							|  |  |  |         "not been discovered", | 
					
						
							|  |  |  |         "Code": "ResourceNotDiscoveredException", | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2019-10-03 18:00:07 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Create an S3 bucket: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     s3_client = boto3.client("s3", region_name="us-west-2") | 
					
						
							| 
									
										
										
										
											2019-10-03 18:00:07 -07:00
										 |  |  |     for x in range(0, 10): | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         s3_client.create_bucket( | 
					
						
							|  |  |  |             Bucket="bucket{}".format(x), | 
					
						
							|  |  |  |             CreateBucketConfiguration={"LocationConstraint": "us-west-2"}, | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2019-10-03 18:00:07 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Now try: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     result = client.get_resource_config_history( | 
					
						
							|  |  |  |         resourceType="AWS::S3::Bucket", resourceId="bucket1" | 
					
						
							|  |  |  |     )["configurationItems"] | 
					
						
							| 
									
										
										
										
											2019-10-03 18:00:07 -07:00
										 |  |  |     assert len(result) == 1 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     assert result[0]["resourceName"] == result[0]["resourceId"] == "bucket1" | 
					
						
							|  |  |  |     assert result[0]["arn"] == "arn:aws:s3:::bucket1" | 
					
						
							| 
									
										
										
										
											2019-10-13 11:10:37 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-23 18:37:35 -07:00
										 |  |  |     # Make a bucket in a different region and verify that it does not show up in the config backend: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     s3_client = boto3.client("s3", region_name="eu-west-1") | 
					
						
							|  |  |  |     s3_client.create_bucket( | 
					
						
							|  |  |  |         Bucket="eu-bucket", | 
					
						
							|  |  |  |         CreateBucketConfiguration={"LocationConstraint": "eu-west-1"}, | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(ClientError) as ce: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         client.get_resource_config_history( | 
					
						
							|  |  |  |             resourceType="AWS::S3::Bucket", resourceId="eu-bucket" | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |     assert ce.value.response["Error"]["Code"] == "ResourceNotDiscoveredException" | 
					
						
							| 
									
										
										
										
											2019-10-23 18:37:35 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-13 11:10:37 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | @mock_config | 
					
						
							|  |  |  | @mock_s3 | 
					
						
							|  |  |  | def test_batch_get_resource_config(): | 
					
						
							|  |  |  |     """NOTE: We are only really testing the Config part. For each individual service, please add tests
 | 
					
						
							| 
									
										
										
										
											2020-10-06 08:46:05 +02:00
										 |  |  |     for that individual service's "get_config_resource" function. | 
					
						
							| 
									
										
										
										
											2019-10-13 11:10:37 -07:00
										 |  |  |     """
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     client = boto3.client("config", region_name="us-west-2") | 
					
						
							| 
									
										
										
										
											2019-10-13 11:10:37 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # With more than 100 resourceKeys: | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(ClientError) as ce: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         client.batch_get_resource_config( | 
					
						
							|  |  |  |             resourceKeys=[ | 
					
						
							|  |  |  |                 {"resourceType": "AWS::S3::Bucket", "resourceId": "someBucket"} | 
					
						
							|  |  |  |             ] | 
					
						
							|  |  |  |             * 101 | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |     assert ( | 
					
						
							|  |  |  |         "Member must have length less than or equal to 100" | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |         in ce.value.response["Error"]["Message"] | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-10-13 11:10:37 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # With invalid resource types and resources that don't exist: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     result = client.batch_get_resource_config( | 
					
						
							|  |  |  |         resourceKeys=[ | 
					
						
							|  |  |  |             {"resourceType": "NOT::A::RESOURCE", "resourceId": "NotAThing"}, | 
					
						
							|  |  |  |             {"resourceType": "AWS::S3::Bucket", "resourceId": "NotAThing"}, | 
					
						
							|  |  |  |         ] | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-10-13 11:10:37 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     assert not result["baseConfigurationItems"] | 
					
						
							|  |  |  |     assert not result["unprocessedResourceKeys"] | 
					
						
							| 
									
										
										
										
											2019-10-13 11:10:37 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Create some S3 buckets: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     s3_client = boto3.client("s3", region_name="us-west-2") | 
					
						
							| 
									
										
										
										
											2019-10-13 11:10:37 -07:00
										 |  |  |     for x in range(0, 10): | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         s3_client.create_bucket( | 
					
						
							|  |  |  |             Bucket="bucket{}".format(x), | 
					
						
							|  |  |  |             CreateBucketConfiguration={"LocationConstraint": "us-west-2"}, | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2019-10-13 11:10:37 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Get them all: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     keys = [ | 
					
						
							|  |  |  |         {"resourceType": "AWS::S3::Bucket", "resourceId": "bucket{}".format(x)} | 
					
						
							|  |  |  |         for x in range(0, 10) | 
					
						
							|  |  |  |     ] | 
					
						
							| 
									
										
										
										
											2019-10-13 11:10:37 -07:00
										 |  |  |     result = client.batch_get_resource_config(resourceKeys=keys) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     assert len(result["baseConfigurationItems"]) == 10 | 
					
						
							|  |  |  |     buckets_missing = ["bucket{}".format(x) for x in range(0, 10)] | 
					
						
							|  |  |  |     for r in result["baseConfigurationItems"]: | 
					
						
							|  |  |  |         buckets_missing.remove(r["resourceName"]) | 
					
						
							| 
									
										
										
										
											2019-10-13 11:10:37 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     assert not buckets_missing | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-23 18:37:35 -07:00
										 |  |  |     # Make a bucket in a different region and verify that it does not show up in the config backend: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     s3_client = boto3.client("s3", region_name="eu-west-1") | 
					
						
							|  |  |  |     s3_client.create_bucket( | 
					
						
							|  |  |  |         Bucket="eu-bucket", | 
					
						
							|  |  |  |         CreateBucketConfiguration={"LocationConstraint": "eu-west-1"}, | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |     keys = [{"resourceType": "AWS::S3::Bucket", "resourceId": "eu-bucket"}] | 
					
						
							| 
									
										
										
										
											2019-10-23 18:37:35 -07:00
										 |  |  |     result = client.batch_get_resource_config(resourceKeys=keys) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     assert not result["baseConfigurationItems"] | 
					
						
							| 
									
										
										
										
											2019-10-23 18:37:35 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-13 11:10:37 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | @mock_config | 
					
						
							|  |  |  | @mock_s3 | 
					
						
							|  |  |  | def test_batch_get_aggregate_resource_config(): | 
					
						
							|  |  |  |     """NOTE: We are only really testing the Config part. For each individual service, please add tests
 | 
					
						
							| 
									
										
										
										
											2020-10-06 08:46:05 +02:00
										 |  |  |     for that individual service's "get_config_resource" function. | 
					
						
							| 
									
										
										
										
											2019-10-13 11:10:37 -07:00
										 |  |  |     """
 | 
					
						
							|  |  |  |     from moto.config.models import DEFAULT_ACCOUNT_ID | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     client = boto3.client("config", region_name="us-west-2") | 
					
						
							| 
									
										
										
										
											2019-10-13 11:10:37 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Without an aggregator: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     bad_ri = { | 
					
						
							|  |  |  |         "SourceAccountId": "000000000000", | 
					
						
							|  |  |  |         "SourceRegion": "not-a-region", | 
					
						
							|  |  |  |         "ResourceType": "NOT::A::RESOURCE", | 
					
						
							|  |  |  |         "ResourceId": "nope", | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(ClientError) as ce: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         client.batch_get_aggregate_resource_config( | 
					
						
							|  |  |  |             ConfigurationAggregatorName="lolno", ResourceIdentifiers=[bad_ri] | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |     assert ( | 
					
						
							|  |  |  |         "The configuration aggregator does not exist" | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |         in ce.value.response["Error"]["Message"] | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-10-13 11:10:37 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Create the aggregator: | 
					
						
							|  |  |  |     account_aggregation_source = { | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         "AccountIds": ["012345678910", "111111111111", "222222222222"], | 
					
						
							|  |  |  |         "AllAwsRegions": True, | 
					
						
							| 
									
										
										
										
											2019-10-13 11:10:37 -07:00
										 |  |  |     } | 
					
						
							|  |  |  |     client.put_configuration_aggregator( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         ConfigurationAggregatorName="testing", | 
					
						
							|  |  |  |         AccountAggregationSources=[account_aggregation_source], | 
					
						
							| 
									
										
										
										
											2019-10-13 11:10:37 -07:00
										 |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # With more than 100 items: | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(ClientError) as ce: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         client.batch_get_aggregate_resource_config( | 
					
						
							|  |  |  |             ConfigurationAggregatorName="testing", ResourceIdentifiers=[bad_ri] * 101 | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |     assert ( | 
					
						
							|  |  |  |         "Member must have length less than or equal to 100" | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |         in ce.value.response["Error"]["Message"] | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-10-13 11:10:37 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Create some S3 buckets: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     s3_client = boto3.client("s3", region_name="us-west-2") | 
					
						
							| 
									
										
										
										
											2019-10-13 11:10:37 -07:00
										 |  |  |     for x in range(0, 10): | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         s3_client.create_bucket( | 
					
						
							|  |  |  |             Bucket="bucket{}".format(x), | 
					
						
							|  |  |  |             CreateBucketConfiguration={"LocationConstraint": "us-west-2"}, | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |         s3_client.put_bucket_tagging( | 
					
						
							|  |  |  |             Bucket="bucket{}".format(x), | 
					
						
							|  |  |  |             Tagging={"TagSet": [{"Key": "Some", "Value": "Tag"}]}, | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2019-10-13 11:10:37 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     s3_client_eu = boto3.client("s3", region_name="eu-west-1") | 
					
						
							| 
									
										
										
										
											2019-10-13 11:10:37 -07:00
										 |  |  |     for x in range(10, 12): | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         s3_client_eu.create_bucket( | 
					
						
							|  |  |  |             Bucket="eu-bucket{}".format(x), | 
					
						
							|  |  |  |             CreateBucketConfiguration={"LocationConstraint": "eu-west-1"}, | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |         s3_client.put_bucket_tagging( | 
					
						
							|  |  |  |             Bucket="eu-bucket{}".format(x), | 
					
						
							|  |  |  |             Tagging={"TagSet": [{"Key": "Some", "Value": "Tag"}]}, | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2019-10-13 11:10:37 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Now try with resources that exist and ones that don't: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     identifiers = [ | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             "SourceAccountId": DEFAULT_ACCOUNT_ID, | 
					
						
							|  |  |  |             "SourceRegion": "us-west-2", | 
					
						
							|  |  |  |             "ResourceType": "AWS::S3::Bucket", | 
					
						
							|  |  |  |             "ResourceId": "bucket{}".format(x), | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         for x in range(0, 10) | 
					
						
							|  |  |  |     ] | 
					
						
							|  |  |  |     identifiers += [ | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             "SourceAccountId": DEFAULT_ACCOUNT_ID, | 
					
						
							|  |  |  |             "SourceRegion": "eu-west-1", | 
					
						
							|  |  |  |             "ResourceType": "AWS::S3::Bucket", | 
					
						
							|  |  |  |             "ResourceId": "eu-bucket{}".format(x), | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         for x in range(10, 12) | 
					
						
							|  |  |  |     ] | 
					
						
							| 
									
										
										
										
											2019-10-13 11:10:37 -07:00
										 |  |  |     identifiers += [bad_ri] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     result = client.batch_get_aggregate_resource_config( | 
					
						
							|  |  |  |         ConfigurationAggregatorName="testing", ResourceIdentifiers=identifiers | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |     assert len(result["UnprocessedResourceIdentifiers"]) == 1 | 
					
						
							|  |  |  |     assert result["UnprocessedResourceIdentifiers"][0] == bad_ri | 
					
						
							| 
									
										
										
										
											2019-10-13 11:10:37 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Verify all the buckets are there: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     assert len(result["BaseConfigurationItems"]) == 12 | 
					
						
							|  |  |  |     missing_buckets = ["bucket{}".format(x) for x in range(0, 10)] + [ | 
					
						
							|  |  |  |         "eu-bucket{}".format(x) for x in range(10, 12) | 
					
						
							|  |  |  |     ] | 
					
						
							| 
									
										
										
										
											2019-10-13 11:10:37 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     for r in result["BaseConfigurationItems"]: | 
					
						
							|  |  |  |         missing_buckets.remove(r["resourceName"]) | 
					
						
							| 
									
										
										
										
											2019-10-13 11:10:37 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     assert not missing_buckets | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-29 14:35:13 -07:00
										 |  |  |     # Verify that 'tags' is not in the result set: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     for b in result["BaseConfigurationItems"]: | 
					
						
							|  |  |  |         assert not b.get("tags") | 
					
						
							|  |  |  |         assert json.loads( | 
					
						
							|  |  |  |             b["supplementaryConfiguration"]["BucketTaggingConfiguration"] | 
					
						
							|  |  |  |         ) == {"tagSets": [{"tags": {"Some": "Tag"}}]} | 
					
						
							| 
									
										
										
										
											2019-10-29 14:35:13 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-13 11:10:37 -07:00
										 |  |  |     # Verify that if the resource name and ID are correct that things are good: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     identifiers = [ | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             "SourceAccountId": DEFAULT_ACCOUNT_ID, | 
					
						
							|  |  |  |             "SourceRegion": "us-west-2", | 
					
						
							|  |  |  |             "ResourceType": "AWS::S3::Bucket", | 
					
						
							|  |  |  |             "ResourceId": "bucket1", | 
					
						
							|  |  |  |             "ResourceName": "bucket1", | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     ] | 
					
						
							|  |  |  |     result = client.batch_get_aggregate_resource_config( | 
					
						
							|  |  |  |         ConfigurationAggregatorName="testing", ResourceIdentifiers=identifiers | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |     assert not result["UnprocessedResourceIdentifiers"] | 
					
						
							|  |  |  |     assert ( | 
					
						
							|  |  |  |         len(result["BaseConfigurationItems"]) == 1 | 
					
						
							|  |  |  |         and result["BaseConfigurationItems"][0]["resourceName"] == "bucket1" | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-10-13 11:10:37 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Verify that if the resource name and ID mismatch that we don't get a result: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     identifiers = [ | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             "SourceAccountId": DEFAULT_ACCOUNT_ID, | 
					
						
							|  |  |  |             "SourceRegion": "us-west-2", | 
					
						
							|  |  |  |             "ResourceType": "AWS::S3::Bucket", | 
					
						
							|  |  |  |             "ResourceId": "bucket1", | 
					
						
							|  |  |  |             "ResourceName": "bucket2", | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     ] | 
					
						
							|  |  |  |     result = client.batch_get_aggregate_resource_config( | 
					
						
							|  |  |  |         ConfigurationAggregatorName="testing", ResourceIdentifiers=identifiers | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |     assert not result["BaseConfigurationItems"] | 
					
						
							|  |  |  |     assert len(result["UnprocessedResourceIdentifiers"]) == 1 | 
					
						
							|  |  |  |     assert ( | 
					
						
							|  |  |  |         len(result["UnprocessedResourceIdentifiers"]) == 1 | 
					
						
							|  |  |  |         and result["UnprocessedResourceIdentifiers"][0]["ResourceName"] == "bucket2" | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-10-13 11:10:37 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Verify that if the region is incorrect that we don't get a result: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     identifiers = [ | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             "SourceAccountId": DEFAULT_ACCOUNT_ID, | 
					
						
							|  |  |  |             "SourceRegion": "eu-west-1", | 
					
						
							|  |  |  |             "ResourceType": "AWS::S3::Bucket", | 
					
						
							|  |  |  |             "ResourceId": "bucket1", | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     ] | 
					
						
							|  |  |  |     result = client.batch_get_aggregate_resource_config( | 
					
						
							|  |  |  |         ConfigurationAggregatorName="testing", ResourceIdentifiers=identifiers | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |     assert not result["BaseConfigurationItems"] | 
					
						
							|  |  |  |     assert len(result["UnprocessedResourceIdentifiers"]) == 1 | 
					
						
							|  |  |  |     assert ( | 
					
						
							|  |  |  |         len(result["UnprocessedResourceIdentifiers"]) == 1 | 
					
						
							|  |  |  |         and result["UnprocessedResourceIdentifiers"][0]["SourceRegion"] == "eu-west-1" | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2020-02-24 11:53:27 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_config | 
					
						
							|  |  |  | def test_put_evaluations(): | 
					
						
							|  |  |  |     client = boto3.client("config", region_name="us-west-2") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Try without Evaluations supplied: | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(ClientError) as ce: | 
					
						
							| 
									
										
										
										
											2020-02-24 11:53:27 -06:00
										 |  |  |         client.put_evaluations(Evaluations=[], ResultToken="test", TestMode=True) | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |     assert ce.value.response["Error"]["Code"] == "InvalidParameterValueException" | 
					
						
							| 
									
										
										
										
											2020-02-24 11:53:27 -06:00
										 |  |  |     assert ( | 
					
						
							|  |  |  |         "The Evaluations object in your request cannot be null" | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |         in ce.value.response["Error"]["Message"] | 
					
						
							| 
									
										
										
										
											2020-02-24 11:53:27 -06:00
										 |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Try without a ResultToken supplied: | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(ClientError) as ce: | 
					
						
							| 
									
										
										
										
											2020-02-24 11:53:27 -06:00
										 |  |  |         client.put_evaluations( | 
					
						
							|  |  |  |             Evaluations=[ | 
					
						
							|  |  |  |                 { | 
					
						
							|  |  |  |                     "ComplianceResourceType": "AWS::ApiGateway::RestApi", | 
					
						
							|  |  |  |                     "ComplianceResourceId": "test-api", | 
					
						
							|  |  |  |                     "ComplianceType": "INSUFFICIENT_DATA", | 
					
						
							|  |  |  |                     "OrderingTimestamp": datetime(2015, 1, 1), | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             ], | 
					
						
							|  |  |  |             ResultToken="", | 
					
						
							|  |  |  |             TestMode=True, | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |     assert ce.value.response["Error"]["Code"] == "InvalidResultTokenException" | 
					
						
							| 
									
										
										
										
											2020-02-24 11:53:27 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-02-24 13:01:38 -06:00
										 |  |  |     if os.environ.get("TEST_SERVER_MODE", "false").lower() == "true": | 
					
						
							|  |  |  |         raise SkipTest("Does not work in server mode due to error in Workzeug") | 
					
						
							|  |  |  |     else: | 
					
						
							|  |  |  |         # Try without TestMode supplied: | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |         with pytest.raises(NotImplementedError): | 
					
						
							| 
									
										
										
										
											2020-02-24 13:01:38 -06:00
										 |  |  |             client.put_evaluations( | 
					
						
							|  |  |  |                 Evaluations=[ | 
					
						
							|  |  |  |                     { | 
					
						
							|  |  |  |                         "ComplianceResourceType": "AWS::ApiGateway::RestApi", | 
					
						
							|  |  |  |                         "ComplianceResourceId": "test-api", | 
					
						
							|  |  |  |                         "ComplianceType": "INSUFFICIENT_DATA", | 
					
						
							|  |  |  |                         "OrderingTimestamp": datetime(2015, 1, 1), | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                 ], | 
					
						
							|  |  |  |                 ResultToken="test", | 
					
						
							|  |  |  |             ) | 
					
						
							| 
									
										
										
										
											2020-02-24 11:53:27 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Now with proper params: | 
					
						
							|  |  |  |     response = client.put_evaluations( | 
					
						
							|  |  |  |         Evaluations=[ | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 "ComplianceResourceType": "AWS::ApiGateway::RestApi", | 
					
						
							|  |  |  |                 "ComplianceResourceId": "test-api", | 
					
						
							|  |  |  |                 "ComplianceType": "INSUFFICIENT_DATA", | 
					
						
							|  |  |  |                 "OrderingTimestamp": datetime(2015, 1, 1), | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         ], | 
					
						
							|  |  |  |         TestMode=True, | 
					
						
							|  |  |  |         ResultToken="test", | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # this is hard to match against, so remove it | 
					
						
							|  |  |  |     response["ResponseMetadata"].pop("HTTPHeaders", None) | 
					
						
							|  |  |  |     response["ResponseMetadata"].pop("RetryAttempts", None) | 
					
						
							|  |  |  |     response.should.equal( | 
					
						
							| 
									
										
										
										
											2020-11-11 15:55:37 +00:00
										 |  |  |         {"FailedEvaluations": [], "ResponseMetadata": {"HTTPStatusCode": 200,},} | 
					
						
							| 
									
										
										
										
											2020-02-24 11:53:27 -06:00
										 |  |  |     ) | 
					
						
							| 
									
										
										
										
											2020-07-13 10:30:55 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_config | 
					
						
							|  |  |  | def test_put_organization_conformance_pack(): | 
					
						
							|  |  |  |     # given | 
					
						
							|  |  |  |     client = boto3.client("config", region_name="us-east-1") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # when | 
					
						
							|  |  |  |     response = client.put_organization_conformance_pack( | 
					
						
							|  |  |  |         DeliveryS3Bucket="awsconfigconforms-test-bucket", | 
					
						
							|  |  |  |         OrganizationConformancePackName="test-pack", | 
					
						
							|  |  |  |         TemplateS3Uri="s3://test-bucket/test-pack.yaml", | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # then | 
					
						
							|  |  |  |     arn = response["OrganizationConformancePackArn"] | 
					
						
							|  |  |  |     arn.should.match( | 
					
						
							|  |  |  |         r"arn:aws:config:us-east-1:\d{12}:organization-conformance-pack/test-pack-\w{8}" | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # putting an organization conformance pack with the same name should result in an update | 
					
						
							|  |  |  |     # when | 
					
						
							|  |  |  |     response = client.put_organization_conformance_pack( | 
					
						
							|  |  |  |         DeliveryS3Bucket="awsconfigconforms-test-bucket", | 
					
						
							|  |  |  |         OrganizationConformancePackName="test-pack", | 
					
						
							|  |  |  |         TemplateS3Uri="s3://test-bucket/test-pack-2.yaml", | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # then | 
					
						
							|  |  |  |     response["OrganizationConformancePackArn"].should.equal(arn) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_config | 
					
						
							|  |  |  | def test_put_organization_conformance_pack_errors(): | 
					
						
							|  |  |  |     # given | 
					
						
							|  |  |  |     client = boto3.client("config", region_name="us-east-1") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # when | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(ClientError) as e: | 
					
						
							| 
									
										
										
										
											2020-07-13 10:30:55 +02:00
										 |  |  |         client.put_organization_conformance_pack( | 
					
						
							|  |  |  |             DeliveryS3Bucket="awsconfigconforms-test-bucket", | 
					
						
							|  |  |  |             OrganizationConformancePackName="test-pack", | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # then | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |     ex = e.value | 
					
						
							| 
									
										
										
										
											2020-07-13 10:30:55 +02:00
										 |  |  |     ex.operation_name.should.equal("PutOrganizationConformancePack") | 
					
						
							|  |  |  |     ex.response["ResponseMetadata"]["HTTPStatusCode"].should.equal(400) | 
					
						
							|  |  |  |     ex.response["Error"]["Code"].should.contain("ValidationException") | 
					
						
							|  |  |  |     ex.response["Error"]["Message"].should.equal("Template body is invalid") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # when | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(ClientError) as e: | 
					
						
							| 
									
										
										
										
											2020-07-13 10:30:55 +02:00
										 |  |  |         client.put_organization_conformance_pack( | 
					
						
							|  |  |  |             DeliveryS3Bucket="awsconfigconforms-test-bucket", | 
					
						
							|  |  |  |             OrganizationConformancePackName="test-pack", | 
					
						
							|  |  |  |             TemplateS3Uri="invalid-s3-uri", | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # then | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |     ex = e.value | 
					
						
							| 
									
										
										
										
											2020-07-13 10:30:55 +02:00
										 |  |  |     ex.operation_name.should.equal("PutOrganizationConformancePack") | 
					
						
							|  |  |  |     ex.response["ResponseMetadata"]["HTTPStatusCode"].should.equal(400) | 
					
						
							|  |  |  |     ex.response["Error"]["Code"].should.contain("ValidationException") | 
					
						
							|  |  |  |     ex.response["Error"]["Message"].should.equal( | 
					
						
							|  |  |  |         "1 validation error detected: " | 
					
						
							|  |  |  |         "Value 'invalid-s3-uri' at 'templateS3Uri' failed to satisfy constraint: " | 
					
						
							|  |  |  |         "Member must satisfy regular expression pattern: " | 
					
						
							|  |  |  |         "s3://.*" | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_config | 
					
						
							|  |  |  | def test_describe_organization_conformance_packs(): | 
					
						
							|  |  |  |     # given | 
					
						
							|  |  |  |     client = boto3.client("config", region_name="us-east-1") | 
					
						
							|  |  |  |     arn = client.put_organization_conformance_pack( | 
					
						
							|  |  |  |         DeliveryS3Bucket="awsconfigconforms-test-bucket", | 
					
						
							|  |  |  |         OrganizationConformancePackName="test-pack", | 
					
						
							|  |  |  |         TemplateS3Uri="s3://test-bucket/test-pack.yaml", | 
					
						
							|  |  |  |     )["OrganizationConformancePackArn"] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # when | 
					
						
							|  |  |  |     response = client.describe_organization_conformance_packs( | 
					
						
							|  |  |  |         OrganizationConformancePackNames=["test-pack"] | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # then | 
					
						
							|  |  |  |     response["OrganizationConformancePacks"].should.have.length_of(1) | 
					
						
							|  |  |  |     pack = response["OrganizationConformancePacks"][0] | 
					
						
							|  |  |  |     pack["OrganizationConformancePackName"].should.equal("test-pack") | 
					
						
							|  |  |  |     pack["OrganizationConformancePackArn"].should.equal(arn) | 
					
						
							|  |  |  |     pack["DeliveryS3Bucket"].should.equal("awsconfigconforms-test-bucket") | 
					
						
							|  |  |  |     pack["ConformancePackInputParameters"].should.have.length_of(0) | 
					
						
							|  |  |  |     pack["ExcludedAccounts"].should.have.length_of(0) | 
					
						
							|  |  |  |     pack["LastUpdateTime"].should.be.a("datetime.datetime") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_config | 
					
						
							|  |  |  | def test_describe_organization_conformance_packs_errors(): | 
					
						
							|  |  |  |     # given | 
					
						
							|  |  |  |     client = boto3.client("config", region_name="us-east-1") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # when | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(ClientError) as e: | 
					
						
							| 
									
										
										
										
											2020-07-13 10:30:55 +02:00
										 |  |  |         client.describe_organization_conformance_packs( | 
					
						
							|  |  |  |             OrganizationConformancePackNames=["not-existing"] | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # then | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |     ex = e.value | 
					
						
							| 
									
										
										
										
											2020-07-13 10:30:55 +02:00
										 |  |  |     ex.operation_name.should.equal("DescribeOrganizationConformancePacks") | 
					
						
							|  |  |  |     ex.response["ResponseMetadata"]["HTTPStatusCode"].should.equal(400) | 
					
						
							|  |  |  |     ex.response["Error"]["Code"].should.contain( | 
					
						
							|  |  |  |         "NoSuchOrganizationConformancePackException" | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |     ex.response["Error"]["Message"].should.equal( | 
					
						
							|  |  |  |         "One or more organization conformance packs with specified names are not present. " | 
					
						
							|  |  |  |         "Ensure your names are correct and try your request again later." | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_config | 
					
						
							|  |  |  | def test_describe_organization_conformance_pack_statuses(): | 
					
						
							|  |  |  |     # given | 
					
						
							|  |  |  |     client = boto3.client("config", region_name="us-east-1") | 
					
						
							|  |  |  |     arn = client.put_organization_conformance_pack( | 
					
						
							|  |  |  |         DeliveryS3Bucket="awsconfigconforms-test-bucket", | 
					
						
							|  |  |  |         OrganizationConformancePackName="test-pack", | 
					
						
							|  |  |  |         TemplateS3Uri="s3://test-bucket/test-pack.yaml", | 
					
						
							|  |  |  |     )["OrganizationConformancePackArn"] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # when | 
					
						
							|  |  |  |     response = client.describe_organization_conformance_pack_statuses( | 
					
						
							|  |  |  |         OrganizationConformancePackNames=["test-pack"] | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # then | 
					
						
							|  |  |  |     response["OrganizationConformancePackStatuses"].should.have.length_of(1) | 
					
						
							|  |  |  |     status = response["OrganizationConformancePackStatuses"][0] | 
					
						
							|  |  |  |     status["OrganizationConformancePackName"].should.equal("test-pack") | 
					
						
							|  |  |  |     status["Status"].should.equal("CREATE_SUCCESSFUL") | 
					
						
							|  |  |  |     update_time = status["LastUpdateTime"] | 
					
						
							|  |  |  |     update_time.should.be.a("datetime.datetime") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # when | 
					
						
							|  |  |  |     response = client.describe_organization_conformance_pack_statuses() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # then | 
					
						
							|  |  |  |     response["OrganizationConformancePackStatuses"].should.have.length_of(1) | 
					
						
							|  |  |  |     status = response["OrganizationConformancePackStatuses"][0] | 
					
						
							|  |  |  |     status["OrganizationConformancePackName"].should.equal("test-pack") | 
					
						
							|  |  |  |     status["Status"].should.equal("CREATE_SUCCESSFUL") | 
					
						
							|  |  |  |     status["LastUpdateTime"].should.equal(update_time) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # when | 
					
						
							|  |  |  |     time.sleep(1) | 
					
						
							|  |  |  |     client.put_organization_conformance_pack( | 
					
						
							|  |  |  |         DeliveryS3Bucket="awsconfigconforms-test-bucket", | 
					
						
							|  |  |  |         OrganizationConformancePackName="test-pack", | 
					
						
							|  |  |  |         TemplateS3Uri="s3://test-bucket/test-pack-2.yaml", | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # then | 
					
						
							|  |  |  |     response = client.describe_organization_conformance_pack_statuses( | 
					
						
							|  |  |  |         OrganizationConformancePackNames=["test-pack"] | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |     response["OrganizationConformancePackStatuses"].should.have.length_of(1) | 
					
						
							|  |  |  |     status = response["OrganizationConformancePackStatuses"][0] | 
					
						
							|  |  |  |     status["OrganizationConformancePackName"].should.equal("test-pack") | 
					
						
							|  |  |  |     status["Status"].should.equal("UPDATE_SUCCESSFUL") | 
					
						
							|  |  |  |     status["LastUpdateTime"].should.be.greater_than(update_time) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_config | 
					
						
							|  |  |  | def test_describe_organization_conformance_pack_statuses_errors(): | 
					
						
							|  |  |  |     # given | 
					
						
							|  |  |  |     client = boto3.client("config", region_name="us-east-1") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # when | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(ClientError) as e: | 
					
						
							| 
									
										
										
										
											2020-07-13 10:30:55 +02:00
										 |  |  |         client.describe_organization_conformance_pack_statuses( | 
					
						
							|  |  |  |             OrganizationConformancePackNames=["not-existing"] | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # then | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |     ex = e.value | 
					
						
							| 
									
										
										
										
											2020-07-13 10:30:55 +02:00
										 |  |  |     ex.operation_name.should.equal("DescribeOrganizationConformancePackStatuses") | 
					
						
							|  |  |  |     ex.response["ResponseMetadata"]["HTTPStatusCode"].should.equal(400) | 
					
						
							|  |  |  |     ex.response["Error"]["Code"].should.contain( | 
					
						
							|  |  |  |         "NoSuchOrganizationConformancePackException" | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |     ex.response["Error"]["Message"].should.equal( | 
					
						
							|  |  |  |         "One or more organization conformance packs with specified names are not present. " | 
					
						
							|  |  |  |         "Ensure your names are correct and try your request again later." | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_config | 
					
						
							|  |  |  | def test_get_organization_conformance_pack_detailed_status(): | 
					
						
							|  |  |  |     # given | 
					
						
							|  |  |  |     client = boto3.client("config", region_name="us-east-1") | 
					
						
							|  |  |  |     arn = client.put_organization_conformance_pack( | 
					
						
							|  |  |  |         DeliveryS3Bucket="awsconfigconforms-test-bucket", | 
					
						
							|  |  |  |         OrganizationConformancePackName="test-pack", | 
					
						
							|  |  |  |         TemplateS3Uri="s3://test-bucket/test-pack.yaml", | 
					
						
							|  |  |  |     )["OrganizationConformancePackArn"] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # when | 
					
						
							|  |  |  |     response = client.get_organization_conformance_pack_detailed_status( | 
					
						
							|  |  |  |         OrganizationConformancePackName="test-pack" | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # then | 
					
						
							|  |  |  |     response["OrganizationConformancePackDetailedStatuses"].should.have.length_of(1) | 
					
						
							|  |  |  |     status = response["OrganizationConformancePackDetailedStatuses"][0] | 
					
						
							|  |  |  |     status["AccountId"].should.equal(ACCOUNT_ID) | 
					
						
							|  |  |  |     status["ConformancePackName"].should.equal( | 
					
						
							|  |  |  |         "OrgConformsPack-{}".format(arn[arn.rfind("/") + 1 :]) | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |     status["Status"].should.equal("CREATE_SUCCESSFUL") | 
					
						
							|  |  |  |     update_time = status["LastUpdateTime"] | 
					
						
							|  |  |  |     update_time.should.be.a("datetime.datetime") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # when | 
					
						
							|  |  |  |     time.sleep(1) | 
					
						
							|  |  |  |     client.put_organization_conformance_pack( | 
					
						
							|  |  |  |         DeliveryS3Bucket="awsconfigconforms-test-bucket", | 
					
						
							|  |  |  |         OrganizationConformancePackName="test-pack", | 
					
						
							|  |  |  |         TemplateS3Uri="s3://test-bucket/test-pack-2.yaml", | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # then | 
					
						
							|  |  |  |     response = client.get_organization_conformance_pack_detailed_status( | 
					
						
							|  |  |  |         OrganizationConformancePackName="test-pack" | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |     response["OrganizationConformancePackDetailedStatuses"].should.have.length_of(1) | 
					
						
							|  |  |  |     status = response["OrganizationConformancePackDetailedStatuses"][0] | 
					
						
							|  |  |  |     status["AccountId"].should.equal(ACCOUNT_ID) | 
					
						
							|  |  |  |     status["ConformancePackName"].should.equal( | 
					
						
							|  |  |  |         "OrgConformsPack-{}".format(arn[arn.rfind("/") + 1 :]) | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |     status["Status"].should.equal("UPDATE_SUCCESSFUL") | 
					
						
							|  |  |  |     status["LastUpdateTime"].should.be.greater_than(update_time) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_config | 
					
						
							|  |  |  | def test_get_organization_conformance_pack_detailed_status_errors(): | 
					
						
							|  |  |  |     # given | 
					
						
							|  |  |  |     client = boto3.client("config", region_name="us-east-1") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # when | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(ClientError) as e: | 
					
						
							| 
									
										
										
										
											2020-07-13 10:30:55 +02:00
										 |  |  |         client.get_organization_conformance_pack_detailed_status( | 
					
						
							|  |  |  |             OrganizationConformancePackName="not-existing" | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # then | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |     ex = e.value | 
					
						
							| 
									
										
										
										
											2020-07-13 10:30:55 +02:00
										 |  |  |     ex.operation_name.should.equal("GetOrganizationConformancePackDetailedStatus") | 
					
						
							|  |  |  |     ex.response["ResponseMetadata"]["HTTPStatusCode"].should.equal(400) | 
					
						
							|  |  |  |     ex.response["Error"]["Code"].should.contain( | 
					
						
							|  |  |  |         "NoSuchOrganizationConformancePackException" | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |     ex.response["Error"]["Message"].should.equal( | 
					
						
							|  |  |  |         "One or more organization conformance packs with specified names are not present. " | 
					
						
							|  |  |  |         "Ensure your names are correct and try your request again later." | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_config | 
					
						
							|  |  |  | def test_delete_organization_conformance_pack(): | 
					
						
							|  |  |  |     # given | 
					
						
							|  |  |  |     client = boto3.client("config", region_name="us-east-1") | 
					
						
							|  |  |  |     arn = client.put_organization_conformance_pack( | 
					
						
							|  |  |  |         DeliveryS3Bucket="awsconfigconforms-test-bucket", | 
					
						
							|  |  |  |         OrganizationConformancePackName="test-pack", | 
					
						
							|  |  |  |         TemplateS3Uri="s3://test-bucket/test-pack.yaml", | 
					
						
							|  |  |  |     )["OrganizationConformancePackArn"] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # when | 
					
						
							|  |  |  |     response = client.delete_organization_conformance_pack( | 
					
						
							|  |  |  |         OrganizationConformancePackName="test-pack" | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # then | 
					
						
							|  |  |  |     response = client.describe_organization_conformance_pack_statuses() | 
					
						
							|  |  |  |     response["OrganizationConformancePackStatuses"].should.have.length_of(0) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_config | 
					
						
							|  |  |  | def test_delete_organization_conformance_pack_errors(): | 
					
						
							|  |  |  |     # given | 
					
						
							|  |  |  |     client = boto3.client("config", region_name="us-east-1") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # when | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(ClientError) as e: | 
					
						
							| 
									
										
										
										
											2020-07-13 10:30:55 +02:00
										 |  |  |         client.delete_organization_conformance_pack( | 
					
						
							|  |  |  |             OrganizationConformancePackName="not-existing" | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # then | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |     ex = e.value | 
					
						
							| 
									
										
										
										
											2020-07-13 10:30:55 +02:00
										 |  |  |     ex.operation_name.should.equal("DeleteOrganizationConformancePack") | 
					
						
							|  |  |  |     ex.response["ResponseMetadata"]["HTTPStatusCode"].should.equal(400) | 
					
						
							|  |  |  |     ex.response["Error"]["Code"].should.contain( | 
					
						
							|  |  |  |         "NoSuchOrganizationConformancePackException" | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |     ex.response["Error"]["Message"].should.equal( | 
					
						
							|  |  |  |         "Could not find an OrganizationConformancePack for given request with resourceName not-existing" | 
					
						
							|  |  |  |     ) |