142 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			142 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| import boto3
 | |
| import json
 | |
| import sure  # noqa
 | |
| 
 | |
| from moto import mock_cloudformation, mock_ec2, mock_elb
 | |
| from tests import EXAMPLE_AMI_ID
 | |
| 
 | |
| 
 | |
| @mock_ec2
 | |
| @mock_elb
 | |
| @mock_cloudformation
 | |
| def test_stack_elb_integration_with_attached_ec2_instances():
 | |
|     elb_template = {
 | |
|         "AWSTemplateFormatVersion": "2010-09-09",
 | |
|         "Resources": {
 | |
|             "MyELB": {
 | |
|                 "Type": "AWS::ElasticLoadBalancing::LoadBalancer",
 | |
|                 "Properties": {
 | |
|                     "Instances": [{"Ref": "Ec2Instance1"}],
 | |
|                     "LoadBalancerName": "test-elb",
 | |
|                     "AvailabilityZones": ["us-east-1"],
 | |
|                     "Listeners": [
 | |
|                         {
 | |
|                             "InstancePort": "80",
 | |
|                             "LoadBalancerPort": "80",
 | |
|                             "Protocol": "HTTP",
 | |
|                         }
 | |
|                     ],
 | |
|                 },
 | |
|             },
 | |
|             "Ec2Instance1": {
 | |
|                 "Type": "AWS::EC2::Instance",
 | |
|                 "Properties": {"ImageId": EXAMPLE_AMI_ID, "UserData": "some user data"},
 | |
|             },
 | |
|         },
 | |
|     }
 | |
|     elb_template_json = json.dumps(elb_template)
 | |
| 
 | |
|     cf = boto3.client("cloudformation", region_name="us-west-1")
 | |
|     cf.create_stack(StackName="elb_stack", TemplateBody=elb_template_json)
 | |
| 
 | |
|     elb = boto3.client("elb", region_name="us-west-1")
 | |
|     load_balancer = elb.describe_load_balancers()["LoadBalancerDescriptions"][0]
 | |
| 
 | |
|     ec2 = boto3.client("ec2", region_name="us-west-1")
 | |
|     reservations = ec2.describe_instances()["Reservations"][0]
 | |
|     ec2_instance = reservations["Instances"][0]
 | |
| 
 | |
|     load_balancer["Instances"][0]["InstanceId"].should.equal(ec2_instance["InstanceId"])
 | |
|     load_balancer["AvailabilityZones"].should.equal(["us-east-1"])
 | |
| 
 | |
| 
 | |
| @mock_elb
 | |
| @mock_cloudformation
 | |
| def test_stack_elb_integration_with_health_check():
 | |
|     elb_template = {
 | |
|         "AWSTemplateFormatVersion": "2010-09-09",
 | |
|         "Resources": {
 | |
|             "MyELB": {
 | |
|                 "Type": "AWS::ElasticLoadBalancing::LoadBalancer",
 | |
|                 "Properties": {
 | |
|                     "LoadBalancerName": "test-elb",
 | |
|                     "AvailabilityZones": ["us-west-1"],
 | |
|                     "HealthCheck": {
 | |
|                         "HealthyThreshold": "3",
 | |
|                         "Interval": "5",
 | |
|                         "Target": "HTTP:80/healthcheck",
 | |
|                         "Timeout": "4",
 | |
|                         "UnhealthyThreshold": "2",
 | |
|                     },
 | |
|                     "Listeners": [
 | |
|                         {
 | |
|                             "InstancePort": "80",
 | |
|                             "LoadBalancerPort": "80",
 | |
|                             "Protocol": "HTTP",
 | |
|                         }
 | |
|                     ],
 | |
|                 },
 | |
|             }
 | |
|         },
 | |
|     }
 | |
|     elb_template_json = json.dumps(elb_template)
 | |
| 
 | |
|     cf = boto3.client("cloudformation", region_name="us-west-1")
 | |
|     cf.create_stack(StackName="elb_stack", TemplateBody=elb_template_json)
 | |
| 
 | |
|     elb = boto3.client("elb", region_name="us-west-1")
 | |
|     load_balancer = elb.describe_load_balancers()["LoadBalancerDescriptions"][0]
 | |
|     health_check = load_balancer["HealthCheck"]
 | |
| 
 | |
|     health_check.should.have.key("HealthyThreshold").equal(3)
 | |
|     health_check.should.have.key("Interval").equal(5)
 | |
|     health_check.should.have.key("Target").equal("HTTP:80/healthcheck")
 | |
|     health_check.should.have.key("Timeout").equal(4)
 | |
|     health_check.should.have.key("UnhealthyThreshold").equal(2)
 | |
| 
 | |
| 
 | |
| @mock_elb
 | |
| @mock_cloudformation
 | |
| def test_stack_elb_integration_with_update():
 | |
|     elb_template = {
 | |
|         "AWSTemplateFormatVersion": "2010-09-09",
 | |
|         "Resources": {
 | |
|             "MyELB": {
 | |
|                 "Type": "AWS::ElasticLoadBalancing::LoadBalancer",
 | |
|                 "Properties": {
 | |
|                     "LoadBalancerName": "test-elb",
 | |
|                     "AvailabilityZones": ["us-west-1a"],
 | |
|                     "Listeners": [
 | |
|                         {
 | |
|                             "InstancePort": "80",
 | |
|                             "LoadBalancerPort": "80",
 | |
|                             "Protocol": "HTTP",
 | |
|                         }
 | |
|                     ],
 | |
|                     "Policies": {"Ref": "AWS::NoValue"},
 | |
|                 },
 | |
|             }
 | |
|         },
 | |
|     }
 | |
|     elb_template_json = json.dumps(elb_template)
 | |
| 
 | |
|     # when
 | |
|     cf = boto3.client("cloudformation", region_name="us-west-1")
 | |
|     cf.create_stack(StackName="elb_stack", TemplateBody=elb_template_json)
 | |
| 
 | |
|     # then
 | |
|     elb = boto3.client("elb", region_name="us-west-1")
 | |
|     load_balancer = elb.describe_load_balancers()["LoadBalancerDescriptions"][0]
 | |
|     load_balancer["AvailabilityZones"].should.equal(["us-west-1a"])
 | |
| 
 | |
|     # when
 | |
|     elb_template["Resources"]["MyELB"]["Properties"]["AvailabilityZones"] = [
 | |
|         "us-west-1b"
 | |
|     ]
 | |
|     elb_template_json = json.dumps(elb_template)
 | |
|     cf.update_stack(StackName="elb_stack", TemplateBody=elb_template_json)
 | |
| 
 | |
|     # then
 | |
|     load_balancer = elb.describe_load_balancers()["LoadBalancerDescriptions"][0]
 | |
|     load_balancer["AvailabilityZones"].should.equal(["us-west-1b"])
 |