def add(container_id: str, definitions: Mapping[str, Dict], paused: bool = False) -> None: log.debug(f'Adding jobs to container {container_id}.') for job_name, definition in definitions.items(): job_id = generate_id(*definition.get("service_id") or (container_id, ), job_name) definition.update({ 'job_name': job_name, 'job_id': job_id, 'container_id': container_id }) trigger_class, trigger_config = definition['trigger'] scheduler.add_job( func=exec_job, trigger=trigger_class( *trigger_config, timezone=definition['timezone'], jitter=definition['jitter'], ), kwargs=definition, id=job_id, max_instances=definition['max'], next_run_time=None if paused else undefined_runtime, replace_existing=True, ) log.info(f"{container_name(container_id)}: Added " + ("paused " if paused else "") + f"'{job_name}' ({job_id}).")
def _parse_service_id(_labels: dict) -> str: filtered_labels = { k: v for k, v in _labels.items() if k in cfg.service_identifiers } log.debug('Considering labels for service id: %s' % filtered_labels) if not filtered_labels: return '' if len(filtered_labels) != len(cfg.service_identifiers): log.critical('Missing service identity labels: {}'.format( ', '.join(set(cfg.service_identifiers) - set(filtered_labels)))) return '' identifiers = tuple(filtered_labels[x] for x in cfg.service_identifiers) return generate_id(*identifiers)
def handle_die(event: dict) -> None: log.debug('Handling die.') container_id = event['Actor']['ID'] service_id, options, definitions = parse.labels(container_id) if not definitions: return if service_id and 'service' in options: if container_id in locking_container_to_services_map: log.info('Unlocking service id: %s' % service_id) del locking_container_to_services_map[container_id] else: return container_name = cfg.client.containers.get(container_id).name for job_name in definitions: log.info("Removing job '%s' for %s" % (job_name, container_name)) jobs.remove(generate_id(container_id, job_name))
def add(container_id: str, definitions: dict) -> None: container_name = cfg.client.inspect_container(container_id)['Name'] log.debug('Adding jobs for %s.' % container_name) for job_name, definition in definitions.items(): job_id = generate_id(container_id, job_name) trigger = definition['trigger'] definition.update({ 'job_name': job_name, 'job_id': job_id, 'container_id': container_id, 'container_name': container_name }) scheduler.add_job(func=exec_job, trigger=trigger[0](*trigger[1], timezone=definition['timezone']), kwargs=definition, id=job_id, max_instances=definition['max'], replace_existing=True) log.info("Added '%s' for %s" % (job_name, container_name))