Add SNS topics to cloudformation.
This commit is contained in:
		
							parent
							
								
									f19fdc9802
								
							
						
					
					
						commit
						c22ea3014b
					
				| @ -9,6 +9,7 @@ from moto.elb import models as elb_models | |||||||
| from moto.iam import models as iam_models | from moto.iam import models as iam_models | ||||||
| from moto.rds import models as rds_models | from moto.rds import models as rds_models | ||||||
| from moto.route53 import models as route53_models | from moto.route53 import models as route53_models | ||||||
|  | from moto.sns import models as sns_models | ||||||
| from moto.sqs import models as sqs_models | from moto.sqs import models as sqs_models | ||||||
| from .utils import random_suffix | from .utils import random_suffix | ||||||
| from .exceptions import MissingParameterError, UnformattedGetAttTemplateException | from .exceptions import MissingParameterError, UnformattedGetAttTemplateException | ||||||
| @ -41,6 +42,7 @@ MODEL_MAP = { | |||||||
|     "AWS::Route53::HostedZone": route53_models.FakeZone, |     "AWS::Route53::HostedZone": route53_models.FakeZone, | ||||||
|     "AWS::Route53::RecordSet": route53_models.RecordSet, |     "AWS::Route53::RecordSet": route53_models.RecordSet, | ||||||
|     "AWS::Route53::RecordSetGroup": route53_models.RecordSetGroup, |     "AWS::Route53::RecordSetGroup": route53_models.RecordSetGroup, | ||||||
|  |     "AWS::SNS::Topic": sns_models.Topic, | ||||||
|     "AWS::SQS::Queue": sqs_models.Queue, |     "AWS::SQS::Queue": sqs_models.Queue, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -45,6 +45,22 @@ class Topic(object): | |||||||
|             return self.name |             return self.name | ||||||
|         raise UnformattedGetAttTemplateException() |         raise UnformattedGetAttTemplateException() | ||||||
| 
 | 
 | ||||||
|  |     @property | ||||||
|  |     def physical_resource_id(self): | ||||||
|  |         return self.arn | ||||||
|  | 
 | ||||||
|  |     @classmethod | ||||||
|  |     def create_from_cloudformation_json(cls, resource_name, cloudformation_json, region_name): | ||||||
|  |         sns_backend = sns_backends[region_name] | ||||||
|  |         properties = cloudformation_json['Properties'] | ||||||
|  | 
 | ||||||
|  |         topic = sns_backend.create_topic( | ||||||
|  |             properties.get("TopicName") | ||||||
|  |         ) | ||||||
|  |         for subscription in properties.get("Subscription", []): | ||||||
|  |             sns_backend.subscribe(topic.arn, subscription['Endpoint'], subscription['Protocol']) | ||||||
|  |         return topic | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| class Subscription(object): | class Subscription(object): | ||||||
|     def __init__(self, topic, endpoint, protocol): |     def __init__(self, topic, endpoint, protocol): | ||||||
|  | |||||||
| @ -8,6 +8,7 @@ import boto.ec2.autoscale | |||||||
| import boto.ec2.elb | import boto.ec2.elb | ||||||
| from boto.exception import BotoServerError | from boto.exception import BotoServerError | ||||||
| import boto.iam | import boto.iam | ||||||
|  | import boto.sns | ||||||
| import boto.sqs | import boto.sqs | ||||||
| import boto.vpc | import boto.vpc | ||||||
| import sure  # noqa | import sure  # noqa | ||||||
| @ -20,6 +21,7 @@ from moto import ( | |||||||
|     mock_iam, |     mock_iam, | ||||||
|     mock_rds, |     mock_rds, | ||||||
|     mock_route53, |     mock_route53, | ||||||
|  |     mock_sns, | ||||||
|     mock_sqs, |     mock_sqs, | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| @ -825,7 +827,7 @@ def test_route53_ec2_instance_with_public_ip(): | |||||||
| 
 | 
 | ||||||
|     template_json = json.dumps(route53_ec2_instance_with_public_ip.template) |     template_json = json.dumps(route53_ec2_instance_with_public_ip.template) | ||||||
|     conn = boto.cloudformation.connect_to_region("us-west-1") |     conn = boto.cloudformation.connect_to_region("us-west-1") | ||||||
|     stack = conn.create_stack( |     conn.create_stack( | ||||||
|         "test_stack", |         "test_stack", | ||||||
|         template_body=template_json, |         template_body=template_json, | ||||||
|     ) |     ) | ||||||
| @ -855,7 +857,7 @@ def test_route53_associate_health_check(): | |||||||
| 
 | 
 | ||||||
|     template_json = json.dumps(route53_health_check.template) |     template_json = json.dumps(route53_health_check.template) | ||||||
|     conn = boto.cloudformation.connect_to_region("us-west-1") |     conn = boto.cloudformation.connect_to_region("us-west-1") | ||||||
|     stack = conn.create_stack( |     conn.create_stack( | ||||||
|         "test_stack", |         "test_stack", | ||||||
|         template_body=template_json, |         template_body=template_json, | ||||||
|     ) |     ) | ||||||
| @ -881,3 +883,56 @@ def test_route53_associate_health_check(): | |||||||
| 
 | 
 | ||||||
|     record_set = rrsets[0] |     record_set = rrsets[0] | ||||||
|     record_set.health_check.should.equal(health_check_id) |     record_set.health_check.should.equal(health_check_id) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | @mock_cloudformation() | ||||||
|  | @mock_sns() | ||||||
|  | def test_sns_topic(): | ||||||
|  |     dummy_template = { | ||||||
|  |         "AWSTemplateFormatVersion": "2010-09-09", | ||||||
|  |         "Resources": { | ||||||
|  |             "MySNSTopic": { | ||||||
|  |                 "Type": "AWS::SNS::Topic", | ||||||
|  |                 "Properties": { | ||||||
|  |                     "Subscription": [ | ||||||
|  |                         {"Endpoint": "https://example.com", "Protocol": "https"}, | ||||||
|  |                     ], | ||||||
|  |                     "TopicName": "my_topics", | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         }, | ||||||
|  |         "Outputs": { | ||||||
|  |             "topic_name": { | ||||||
|  |                 "Value": {"Fn::GetAtt": ["MySNSTopic", "TopicName"]} | ||||||
|  |             }, | ||||||
|  |             "topic_arn": { | ||||||
|  |                 "Value": {"Ref": "MySNSTopic"} | ||||||
|  |             }, | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     template_json = json.dumps(dummy_template) | ||||||
|  |     conn = boto.cloudformation.connect_to_region("us-west-1") | ||||||
|  |     stack = conn.create_stack( | ||||||
|  |         "test_stack", | ||||||
|  |         template_body=template_json, | ||||||
|  |     ) | ||||||
|  | 
 | ||||||
|  |     sns_conn = boto.sns.connect_to_region("us-west-1") | ||||||
|  |     topics = sns_conn.get_all_topics()["ListTopicsResponse"]["ListTopicsResult"]["Topics"] | ||||||
|  |     topics.should.have.length_of(1) | ||||||
|  |     topic_arn = topics[0]['TopicArn'] | ||||||
|  |     topic_arn.should.contain("my_topics") | ||||||
|  | 
 | ||||||
|  |     subscriptions = sns_conn.get_all_subscriptions()["ListSubscriptionsResponse"]["ListSubscriptionsResult"]["Subscriptions"] | ||||||
|  |     subscriptions.should.have.length_of(1) | ||||||
|  |     subscription = subscriptions[0] | ||||||
|  |     subscription["TopicArn"].should.equal(topic_arn) | ||||||
|  |     subscription["Protocol"].should.equal("https") | ||||||
|  |     subscription["SubscriptionArn"].should.contain(topic_arn) | ||||||
|  |     subscription["Endpoint"].should.equal("https://example.com") | ||||||
|  | 
 | ||||||
|  |     stack = conn.describe_stacks()[0] | ||||||
|  |     topic_name_output = [x for x in stack.outputs if x.key == 'topic_name'][0] | ||||||
|  |     topic_name_output.value.should.equal("my_topics") | ||||||
|  |     topic_arn_output = [x for x in stack.outputs if x.key == 'topic_arn'][0] | ||||||
|  |     topic_arn_output.value.should.equal(topic_arn) | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user