def test_we_return_false_if_at_least_one_is_not_running(self, mock_httplib, mock_landlord, mock_ec2): project = {'name': 'MyProject', 'version': 'v34', 'type': 'play2'} mock_landlord.Tenant = StubLandlord mock_connection = Mock() mock_ec2.connect_to_region.return_value = mock_connection instance1 = Mock() instance1.id = 'i-938372' instance1.public_dns_name = 'my.awesome.dns.com' instance1.update.return_value = 'running' instance2 = Mock() instance2.id = 'i-542211' instance2.public_dns_name = 'my.awesome2.dns.com' instance2.update.return_value = 'stopped' mock_connection.get_only_instances.return_value = [instance1, instance2] instances = ['i-278219', 'i-82715'] url_connection = Mock() response = Mock(status=200) url_connection.getresponse.return_value = response mock_httplib.HTTPConnection.return_value = url_connection self.assertEquals(False, ec2.is_running(None, None)) self.assertEquals(False, ec2.is_running(None, {})) result = ec2.is_running(instances, project) mock_ec2.connect_to_region.assert_called_with('deploy.region', aws_access_key_id='aws.id', aws_secret_access_key='aws.secret') mock_connection.get_only_instances.assert_called_with(instances) self.assertEquals(True, instance1.update.called) self.assertEquals(True, instance2.update.called) self.assertEquals(False, result)
def test_we_capture_the_checkurl_exception_and_return_false(self, mock_landlord, mock_ec2): properties = {'region': 'myRegion', 'environment': 'STAGE', 'domain': 'this.is.awesome'} project = {'name': 'MyProject', 'version': 'v34', 'type': 'play2'} instances_ids = ['blah'] mock_landlord.Tenant = StubNameLandlord mock_connection = Mock() mock_ec2.connect_to_region.return_value = mock_connection instance1 = Mock() instance1.id = 'i-938372' instance1.ip_address = '192.1.11.1' instance1.state = 'running' instance1.launch_time = datetime.date.today().isoformat() instance1.tags = {'Name': 'STAGE-Instance-1', 'Project': 'Instance', 'Version': 'v43'} instance2 = Mock() instance2.id = 'i-542211' instance2.state = 'stopped' instance2.ip_address = None instance2.launch_time = datetime.date.today().isoformat() instance2.tags = {'Name': 'STAGE-Instance-2', 'Project': 'Instance', 'Version': 'v43'} mock_connection.get_only_instances.return_value = [instance1, instance2] real_function = ec2.check_url ec2.check_url = Mock(side_effect=[Exception('BOOM!','I have created an instance and you are wasting money... muahahaha')]) result = ec2.is_running(instances_ids, project) self.assertEquals(False, result) ec2.check_url = real_function
def test_we_return_the_running_status_from_the_instances(self, mock_httplib, mock_landlord, mock_ec2): properties = {'region': 'myRegion', 'environment': 'STAGE', 'domain': 'this.is.awesome'} project = {'name': 'MyProject', 'version': 'v34', 'type': 'play2'} mock_landlord.Tenant = StubLandlord mock_connection = Mock() mock_ec2.connect_to_region.return_value = mock_connection instance1 = Mock() instance1.id = 'i-938372' instance1.public_dns_name = 'my.awesome.dns.com' instance1.update.return_value = 'running' instance1.ip_address = '127.0.0.1' instance2 = Mock() instance2.id = 'i-542211' instance2.public_dns_name = 'my.awesome2.dns.com' instance2.update.return_value = 'running' instance2.ip_address = '127.0.0.1' mock_connection.get_only_instances.return_value = [instance1, instance2] instances = ['i-278219', 'i-82715'] url_connection = Mock() response = Mock(status=200) url_connection.getresponse.return_value = response mock_httplib.HTTPConnection.return_value = url_connection self.assertEquals(False, ec2.is_running(None, None)) self.assertEquals(False, ec2.is_running(None, {})) result = ec2.is_running(instances, project) mock_ec2.connect_to_region.assert_called_with('deploy.region', aws_access_key_id='aws.id', aws_secret_access_key='aws.secret') mock_connection.get_only_instances.assert_called_with(instances) # mock_httplib.HTTPConnection.request.assert_called_with("GET", "/ping") mock_httplib.HTTPConnection.assert_called_with("my.awesome2.dns.com", 9000) self.assertEquals(True, instance1.update.called) self.assertEquals(True, instance2.update.called) self.assertEquals(True, result)
def deploy(job): job.set_status(JobStatus.running) project_attributes = job.get_project() new_instances = ec2.create_and_start_instances(project_attributes) if ec2.is_running(new_instances, project_attributes): if project_attributes.get('environment_tier') == EnvironmentTier.WORKER.value: old_instances = ec2.get_instances(filters={'tag:Project': project_attributes['name']}) old_instance_ids = list(set([instance.id for instance in old_instances]) - set(new_instances)) else: load_balancer = loadbalancer.get_loadbalancer(project_attributes) old_instance_ids = [instance.id for instance in load_balancer.instances] loadbalancer.attach(load_balancer, new_instances) loadbalancer.dettach(load_balancer, old_instance_ids) ec2.terminate(old_instance_ids) job.set_status(JobStatus.done) else: ec2.terminate(new_instances) job.set_status(JobStatus.failed)