Esempio n. 1
0
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}).")
Esempio n. 2
0
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)
Esempio n. 3
0
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))
Esempio n. 4
0
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))