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)
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])