def _format_parents_verbose(job): parents = job.get('parents', []) # create (service,instance) pairs for the parent names parent_service_instances = [ tuple(chronos_tools.decompose_job_id(parent)) for parent in parents ] # find matching parent jobs parent_jobs = [ chronos_tools.get_jobs_for_service_instance(*service_instance, include_disabled=True, include_temporary=False)[0] for service_instance in parent_service_instances ] # get the status of the last run of each parent job parent_statuses = [(parent, _format_last_result(job)) for parent in parent_jobs] formatted_lines = [("\n" " - %(job_name)s\n" " Last Run: %(status)s (%(last_run)s)" % { "job_name": parent['name'], "last_run": status_parent[1], "status": status_parent[0], }) for (parent, status_parent) in parent_statuses] return '\n'.join(formatted_lines)
def format_chronos_job_status(client, job, running_tasks, verbose=0): """Given a job, returns a pretty-printed human readable output regarding the status of the job. :param job: dictionary of the job status :param running_tasks: a list of Mesos tasks associated with ``job``, e.g. the result of ``mesos_tools.get_running_tasks_from_active_frameworks()``. :param verbose: int verbosity level """ job_name = _format_job_name(job) is_temporary = chronos_tools.is_temporary_job(job) if 'name' in job else 'UNKNOWN' job_name = modify_string_for_rerun_status(job_name, is_temporary) disabled_state = _format_disabled_status(job) service, instance = chronos_tools.decompose_job_id(job['name']) chronos_state = chronos_tools.get_chronos_status_for_job(client, service, instance) (last_result, formatted_time) = _format_last_result(job) job_type = chronos_tools.get_job_type(job) schedule_type = _get_schedule_field_for_job_type(job_type) schedule_formatter = get_schedule_formatter(job_type, verbose) schedule_value = schedule_formatter(job) command = _format_command(job) mesos_status = _format_mesos_status(job, running_tasks) if verbose > 0: tail_lines = calculate_tail_lines(verbose_level=verbose) mesos_status_verbose = status_mesos_tasks_verbose( job_id=job["name"], get_short_task_id=get_short_task_id, tail_lines=tail_lines, ) mesos_status = "%s\n%s" % (mesos_status, mesos_status_verbose) return ( "Job: %(job_name)s\n" " Status: %(disabled_state)s (%(chronos_state)s)" " Last: %(last_result)s (%(formatted_time)s)\n" " %(schedule_type)s: %(schedule_value)s\n" " Command: %(command)s\n" " Mesos: %(mesos_status)s" % { "job_name": job_name, "is_temporary": is_temporary, "schedule_type": schedule_type, "chronos_state": PaastaColors.grey(chronos_state), "disabled_state": disabled_state, "last_result": last_result, "formatted_time": formatted_time, "schedule_value": schedule_value, "command": command, "mesos_status": mesos_status, } )
def format_chronos_job_status(client, job, running_tasks, verbose=0): """Given a job, returns a pretty-printed human readable output regarding the status of the job. :param job: dictionary of the job status :param running_tasks: a list of Mesos tasks associated with ``job``, e.g. the result of ``mesos_tools.get_running_tasks_from_active_frameworks()``. :param verbose: int verbosity level """ job_name = _format_job_name(job) is_temporary = chronos_tools.is_temporary_job( job) if 'name' in job else 'UNKNOWN' job_name = modify_string_for_rerun_status(job_name, is_temporary) disabled_state = _format_disabled_status(job) service, instance = chronos_tools.decompose_job_id(job['name']) chronos_state = chronos_tools.get_chronos_status_for_job( client, service, instance) (last_result, formatted_time) = _format_last_result(job) job_type = chronos_tools.get_job_type(job) schedule_type = _get_schedule_field_for_job_type(job_type) schedule_formatter = get_schedule_formatter(job_type, verbose) schedule_value = schedule_formatter(job) command = _format_command(job) mesos_status = _format_mesos_status(job, running_tasks) if verbose > 0: tail_lines = calculate_tail_lines(verbose_level=verbose) mesos_status_verbose = status_mesos_tasks_verbose( job_id=job["name"], get_short_task_id=get_short_task_id, tail_lines=tail_lines, ) mesos_status = "%s\n%s" % (mesos_status, mesos_status_verbose) return ("Job: %(job_name)s\n" " Status: %(disabled_state)s (%(chronos_state)s)" " Last: %(last_result)s (%(formatted_time)s)\n" " %(schedule_type)s: %(schedule_value)s\n" " Command: %(command)s\n" " Mesos: %(mesos_status)s" % { "job_name": job_name, "is_temporary": is_temporary, "schedule_type": schedule_type, "chronos_state": PaastaColors.grey(chronos_state), "disabled_state": disabled_state, "last_result": last_result, "formatted_time": formatted_time, "schedule_value": schedule_value, "command": command, "mesos_status": mesos_status, })
def perform_command(command, service, instance, cluster, verbose, soa_dir): chronos_config = chronos_tools.load_chronos_config() client = chronos_tools.get_chronos_client(chronos_config) 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, instance, job_id, client, cluster, complete_job_config, emergency=True) elif command == "stop": matching_jobs = chronos_tools.lookup_chronos_jobs( service=service, instance=instance, client=client, include_disabled=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, instance, job_id, client, cluster, matching_jobs, complete_job_config, emergency=True ) elif command == "status": # Setting up transparent cache for http API calls requests_cache.install_cache("paasta_serviceinit", backend="memory") # Verbose mode shows previous versions. if verbose: git_hash = None config_hash = None # Non-verbose shows only the version specified via # create_complete_config. else: (_, __, git_hash, config_hash) = chronos_tools.decompose_job_id(job_id) matching_jobs = chronos_tools.lookup_chronos_jobs( service=service, instance=instance, git_hash=git_hash, config_hash=config_hash, 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 ) print status_chronos_jobs(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 _format_parents_verbose(job): parents = job.get('parents', []) # create (service,instance) pairs for the parent names parent_service_instances = [tuple(chronos_tools.decompose_job_id(parent)) for parent in parents] # find matching parent jobs parent_jobs = [chronos_tools.get_job_for_service_instance(*service_instance) for service_instance in parent_service_instances] # get the status of the last run of each parent job parent_statuses = [(parent, _format_last_result(job)) for parent in parent_jobs] formatted_lines = [("\n" " - %(job_name)s\n" " Last Run: %(status)s (%(last_run)s)" % { "job_name": parent['name'], "last_run": status_parent[1], "status": status_parent[0], }) for (parent, status_parent) in parent_statuses] return '\n'.join(formatted_lines)
def _format_config_hash(job): config_hash = PaastaColors.red("UNKNOWN") job_id = job.get("name", None) if job_id: (_, __, ___, config_hash) = chronos_tools.decompose_job_id(job_id) return config_hash
def perform_command(command, service, instance, cluster, verbose, soa_dir): chronos_config = chronos_tools.load_chronos_config() client = chronos_tools.get_chronos_client(chronos_config) 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, instance, job_id, client, cluster, complete_job_config, emergency=True) elif command == "stop": matching_jobs = chronos_tools.lookup_chronos_jobs( service=service, instance=instance, client=client, include_disabled=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, instance, job_id, client, cluster, matching_jobs, complete_job_config, emergency=True, ) elif command == "status": # Setting up transparent cache for http API calls requests_cache.install_cache("paasta_serviceinit", backend="memory") # Verbose mode shows previous versions. if verbose: git_hash = None config_hash = None # Non-verbose shows only the version specified via # create_complete_config. else: (_, __, git_hash, config_hash) = chronos_tools.decompose_job_id(job_id) matching_jobs = chronos_tools.lookup_chronos_jobs( service=service, instance=instance, git_hash=git_hash, config_hash=config_hash, 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, ) print status_chronos_jobs(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