def build_service_job_mapping(client, configured_jobs): """ :param client: A Chronos client used for getting the list of running jobs :param configured_jobs: A list of jobs configured in Paasta, i.e. jobs we expect to be able to find :returns: A dict of {(service, instance): [(chronos job, lastrunstate)]} where the chronos job is any with a matching (service, instance) in its name and disabled == False """ service_job_mapping = {} for job in configured_jobs: # find all the jobs belonging to each service matching_jobs = chronos_tools.lookup_chronos_jobs( service=job[0], instance=job[1], client=client, include_disabled=True, ) matching_jobs = chronos_tools.sort_jobs(matching_jobs) # Only consider the most recent one if len(matching_jobs) > 0: matching_jobs = [matching_jobs[0]] with_states = last_run_state_for_jobs(matching_jobs) service_job_mapping[job] = with_states return service_job_mapping
def build_service_job_mapping(client, configured_jobs): """ :param client: A Chronos client used for getting the list of running jobs :param configured_jobs: A list of jobs configured in Paasta, i.e. jobs we expect to be able to find :returns: A dict of {(service, instance): last_chronos_job} where last_chronos_job is the latest job matching (service, instance) or None if there is no such job """ service_job_mapping = {} all_chronos_jobs = client.list() for job in configured_jobs: # find all the jobs belonging to each service matching_jobs = chronos_tools.filter_chronos_jobs( jobs=all_chronos_jobs, service=job[0], instance=job[1], include_disabled=True, include_temporary=True, ) matching_jobs = chronos_tools.sort_jobs(matching_jobs) # Only consider the most recent one service_job_mapping[job] = matching_jobs[0] if len( matching_jobs) > 0 else None return service_job_mapping
def setup_job(service, instance, chronos_job_config, complete_job_config, client, cluster): job_id = complete_job_config['name'] # Sort this initial list since other lists of jobs will come from it (with # their orders preserved by list comprehensions) and since we'll care about # ordering by recency when we go calculate jobs_to_delete. all_existing_jobs = chronos_tools.sort_jobs(chronos_tools.lookup_chronos_jobs( service=service, instance=instance, client=client, )) old_jobs = [job for job in all_existing_jobs if job["name"] != job_id] enabled_old_jobs = [job for job in old_jobs if not job["disabled"]] if all_existing_jobs == old_jobs: job_to_create = complete_job_config else: job_to_create = None number_of_old_jobs_to_keep = 5 return bounce_chronos_job( service=service, instance=instance, cluster=cluster, jobs_to_disable=enabled_old_jobs, jobs_to_delete=old_jobs[number_of_old_jobs_to_keep:], job_to_create=job_to_create, client=client, )
def setup_job(service, instance, chronos_job_config, complete_job_config, client, cluster): job_id = complete_job_config['name'] # Sort this initial list since other lists of jobs will come from it (with # their orders preserved by list comprehensions) and since we'll care about # ordering by recency when we go calculate jobs_to_delete. all_existing_jobs = chronos_tools.sort_jobs( chronos_tools.lookup_chronos_jobs( service=service, instance=instance, client=client, )) old_jobs = [job for job in all_existing_jobs if job["name"] != job_id] enabled_old_jobs = [job for job in old_jobs if not job["disabled"]] if all_existing_jobs == old_jobs: job_to_create = complete_job_config else: job_to_create = None number_of_old_jobs_to_keep = 5 return bounce_chronos_job( service=service, instance=instance, cluster=cluster, jobs_to_disable=enabled_old_jobs, jobs_to_delete=old_jobs[number_of_old_jobs_to_keep:], job_to_create=job_to_create, client=client, )
def perform_command(command, service, instance, cluster, verbose, soa_dir): """Performs a start/stop/restart/status on an instance :param command: String of start, stop, restart, status or scale :param service: service name :param instance: instance name, like "main" or "canary" :param cluster: cluster name :param verbose: int verbosity level :returns: A unix-style return code """ chronos_config = chronos_tools.load_chronos_config() client = chronos_tools.get_chronos_client(chronos_config) job_config = chronos_tools.load_chronos_job_config( service=service, instance=instance, cluster=cluster, soa_dir=soa_dir, ) complete_job_config = chronos_tools.create_complete_config(service, instance, soa_dir=soa_dir) job_id = complete_job_config["name"] if command == "start": start_chronos_job( service=service, instance=instance, job_id=job_id, client=client, cluster=cluster, job_config=job_config, complete_job_config=complete_job_config, emergency=True, ) elif command == "stop": matching_jobs = chronos_tools.lookup_chronos_jobs( service=service, instance=instance, client=client, include_disabled=True, include_temporary=True) stop_chronos_job(service, instance, client, cluster, matching_jobs, emergency=True) elif command == "restart": matching_jobs = chronos_tools.lookup_chronos_jobs( service=service, instance=instance, client=client, include_disabled=True, ) restart_chronos_job( service=service, instance=instance, job_id=job_id, client=client, cluster=cluster, matching_jobs=matching_jobs, job_config=job_config, complete_job_config=complete_job_config, emergency=True, ) elif command == "status": # Verbose mode shows previous versions. matching_jobs = chronos_tools.lookup_chronos_jobs( service=service, instance=instance, client=client, include_disabled=True, ) sorted_matching_jobs = chronos_tools.sort_jobs(matching_jobs) job_config = chronos_tools.load_chronos_job_config( service=service, instance=instance, cluster=cluster, soa_dir=soa_dir, ) paasta_print( status_chronos_jobs(client, sorted_matching_jobs, job_config, verbose)) else: # The command parser shouldn't have let us get this far... raise NotImplementedError("Command %s is not implemented!" % command) return 0
def perform_command(command, service, instance, cluster, verbose, soa_dir): """Performs a start/stop/restart/status on an instance :param command: String of start, stop, restart, status or scale :param service: service name :param instance: instance name, like "main" or "canary" :param cluster: cluster name :param verbose: int verbosity level :returns: A unix-style return code """ chronos_config = chronos_tools.load_chronos_config() client = chronos_tools.get_chronos_client(chronos_config) job_config = chronos_tools.load_chronos_job_config( service=service, instance=instance, cluster=cluster, soa_dir=soa_dir, ) complete_job_config = chronos_tools.create_complete_config(service, instance, soa_dir=soa_dir) job_id = complete_job_config["name"] if command == "start": start_chronos_job( service=service, instance=instance, job_id=job_id, client=client, cluster=cluster, job_config=job_config, complete_job_config=complete_job_config, emergency=True, ) elif command == "stop": matching_jobs = chronos_tools.lookup_chronos_jobs( service=service, instance=instance, client=client, include_disabled=True, include_temporary=True ) stop_chronos_job(service, instance, client, cluster, matching_jobs, emergency=True) elif command == "restart": matching_jobs = chronos_tools.lookup_chronos_jobs( service=service, instance=instance, client=client, include_disabled=True, ) restart_chronos_job( service=service, instance=instance, job_id=job_id, client=client, cluster=cluster, matching_jobs=matching_jobs, job_config=job_config, complete_job_config=complete_job_config, emergency=True, ) elif command == "status": # Verbose mode shows previous versions. matching_jobs = chronos_tools.lookup_chronos_jobs( service=service, instance=instance, client=client, include_disabled=True, ) sorted_matching_jobs = chronos_tools.sort_jobs(matching_jobs) job_config = chronos_tools.load_chronos_job_config( service=service, instance=instance, cluster=cluster, soa_dir=soa_dir, ) paasta_print(status_chronos_jobs(client, sorted_matching_jobs, job_config, verbose)) else: # The command parser shouldn't have let us get this far... raise NotImplementedError("Command %s is not implemented!" % command) return 0