def terminate_instance(host_uuid):
    host = Host.get(uuid=host_uuid)

    conn = connect_ec2()
    terminated_instances = conn.terminate_instances(instance_ids=[host.instance_id])
    addresses = conn.get_all_addresses(filters={'private_ip_address': [host.private_ip]})
    for address in addresses:
        address.disassociate()
        address.release()
    for instance in terminated_instances:
        Host.soft_delete(instance_id=instance.id)
def check_instance_for_configuration(host_uuid, service_uuid):
    conn = connect_ec2()
    host = Host.get(uuid=host_uuid)
    reservations = conn.get_all_instances(instance_ids=[host.instance_id])
    if len(reservations) == 0 or len(reservations[0].instances) == 0:
        raise Exception('There are no AWS instances for this host.')
    instance = reservations[0].instances[0]
    if instance.state == 'running':
        queue().enqueue_call(func=configure_instance, args=[host_uuid, service_uuid])
        return
    time.sleep(5)
    queue().enqueue_call(func=check_instance_for_configuration, args=[host_uuid, service_uuid], timeout=120)
    def __init__(self, host_uuid, service_uuid):
        self.succeeded = True

        self.host = Host.get(uuid=host_uuid)
        self.service = Service.get(uuid=service_uuid)
        self.host_deploy = self.host.get_current_deploy(self.service.uuid)
        self.service_files = self.service.get_files()
        self.f = open('{}/deploys/{}.log'.format(config.LOG_PATH, self.host.instance_id), 'w')

        env.user = self.host.username or 'ec2-user'
        env.forward_agent = True
        env.warn_only = True
        if self.host.public_dns:
            env.host_string = self.host.public_dns
        else:
            env.host_string = self.host.private_ip
        env.key_filename = ['./keys/awsSSH.pem']