示例#1
0
    def setUp(self):
        self.db = MagicMock(spec=FlotillaSchedulerDynamo)
        self.elb = MagicMock()
        self.service = {
            'service_name': SERVICE,
            REV: 1,
            'cf_outputs': {
                'Elb': 'test-elb',
                'InstanceSg': 'sg-123456'
            }
        }
        self.db.get_service.return_value = self.service

        self.doctor = ServiceDoctor(self.db, self.elb)
示例#2
0
def wait_for_deployment(dynamo_cache, regions, service_name, rev_hash, timeout):
    logger.info('Waiting for %s in %s regions...', rev_hash, len(regions))

    # There can be only one!
    doctor_cache = {}
    for region in regions:
        tables = dynamo_cache[region]
        tables.setup(['status'])
        db = FlotillaSchedulerDynamo(None, None, tables.services, None,
                                     tables.status)
        elb = boto3.client('elb', region)
        doctor = ServiceDoctor(db, elb)
        doctor_cache[region] = doctor

    start_time = time()
    while True:
        all_healthy = True
        try:
            for region, doctor in doctor_cache.items():
                healthy = doctor.is_healthy_revision(service_name, rev_hash)
                if not healthy:
                    all_healthy = False
                    logger.info('Waiting for %s in %s...', rev_hash, region)
                    continue
                logger.info('Region %s has a health %s instance!', region,
                            rev_hash)
                doctor.db.make_only_revision(service_name, rev_hash)
        except ValueError:
            break

        if all_healthy:
            logger.info('All regions have a health %s instance!', rev_hash)
            return True
        if time() - start_time > timeout:
            break
        sleep(5)

    wait_time = time() - start_time
    logger.info('Revision %s not stable after %s seconds.', rev_hash, wait_time)
    for region, doctor in doctor_cache.items():
        service_item = doctor.db.get_service(service_name)
        if rev_hash in service_item and service_item[rev_hash] > 0:
            service_item[rev_hash] *= -1
            doctor.db.set_services([service_item])