def paasta_status_on_api_endpoint(cluster, service, instance, system_paasta_config, verbose): client = get_paasta_api_client(cluster, system_paasta_config) if not client: paasta_print('Cannot get a paasta-api client') exit(1) try: status = client.service.status_instance(service=service, instance=instance).result() except HTTPError as exc: paasta_print(exc.response.text) return exc.status_code paasta_print('instance: %s' % PaastaColors.blue(instance)) paasta_print('Git sha: %s (desired)' % status.git_sha) marathon_status = status.marathon if marathon_status is None: paasta_print( "Not implemented: Looks like %s is not a Marathon instance" % instance) return 0 elif marathon_status.error_message: paasta_print(marathon_status.error_message) return 1 bouncing_status = bouncing_status_human( marathon_status.app_count, marathon_status.bounce_method, ) desired_state = desired_state_human( marathon_status.desired_state, marathon_status.expected_instance_count, ) paasta_print("State: %s - Desired state: %s" % (bouncing_status, desired_state)) status = MarathonDeployStatus.fromstring(marathon_status.deploy_status) if status != MarathonDeployStatus.NotRunning: if status == MarathonDeployStatus.Delayed: deploy_status = marathon_app_deploy_status_human( status, marathon_status.backoff_seconds) else: deploy_status = marathon_app_deploy_status_human(status) else: deploy_status = 'NotRunning' paasta_print( status_marathon_job_human( service=service, instance=instance, deploy_status=deploy_status, desired_app_id=marathon_status.app_id, app_count=marathon_status.app_count, running_instances=marathon_status.running_instance_count, normal_instance_count=marathon_status.expected_instance_count, ), ) return 0
def paasta_status_on_api_endpoint(cluster, service, instance, system_paasta_config, verbose): client = get_paasta_api_client(cluster, system_paasta_config) if not client: paasta_print('Cannot get a paasta-api client') exit(1) try: status = client.service.status_instance(service=service, instance=instance).result() except HTTPError as exc: paasta_print(exc.response.text) return exc.status_code paasta_print('instance: %s' % PaastaColors.blue(instance)) paasta_print('Git sha: %s (desired)' % status.git_sha) marathon_status = status.marathon if marathon_status is None: paasta_print("Not implemented: Looks like %s is not a Marathon instance" % instance) return 0 elif marathon_status.error_message: paasta_print(marathon_status.error_message) return 1 bouncing_status = bouncing_status_human(marathon_status.app_count, marathon_status.bounce_method) desired_state = desired_state_human(marathon_status.desired_state, marathon_status.expected_instance_count) paasta_print("State: %s - Desired state: %s" % (bouncing_status, desired_state)) status = MarathonDeployStatus.fromstring(marathon_status.deploy_status) if status != MarathonDeployStatus.NotRunning: if status == MarathonDeployStatus.Delayed: deploy_status = marathon_app_deploy_status_human(status, marathon_status.backoff_seconds) else: deploy_status = marathon_app_deploy_status_human(status) else: deploy_status = 'NotRunning' paasta_print( status_marathon_job_human( service, instance, deploy_status, marathon_status.app_id, marathon_status.running_instance_count, marathon_status.expected_instance_count, ) ) return 0
def marathon_app_status_human(app_id, app_status) -> List[str]: output = [] if app_status.dashboard_url: output.append(f"Dashboard: {PaastaColors.blue(app_status.dashboard_url)}") else: output.append(f"App ID: {PaastaColors.blue(app_id)}") output.append( " " + " ".join( [ f"{app_status.tasks_running} running,", f"{app_status.tasks_healthy} healthy,", f"{app_status.tasks_staged} staged", f"out of {app_status.tasks_total}", ] ) ) create_datetime = datetime.fromtimestamp(app_status.create_timestamp) output.append( " App created: {} ({})".format( create_datetime, humanize.naturaltime(create_datetime) ) ) deploy_status = MarathonDeployStatus.fromstring(app_status.deploy_status) deploy_status_human = marathon_app_deploy_status_human( deploy_status, app_status.backoff_seconds ) output.append(f" Status: {deploy_status_human}") if app_status.tasks: output.append(" Tasks:") tasks_table = format_marathon_task_table(app_status.tasks) output.extend([f" {line}" for line in tasks_table]) if app_status.unused_offer_reason_counts is not None: output.append(" Possibly stalled for:") output.extend( [ f" {reason}: {count}" for reason, count in app_status.unused_offer_reason_counts.items() ] ) return output
def print_marathon_status( service: str, instance: str, output: List[str], marathon_status, ) -> int: if marathon_status.error_message: output.append(marathon_status.error_message) return 1 bouncing_status = bouncing_status_human( marathon_status.app_count, marathon_status.bounce_method, ) desired_state = desired_state_human( marathon_status.desired_state, marathon_status.expected_instance_count, ) output.append( f" State: {bouncing_status} - Desired state: {desired_state}") status = MarathonDeployStatus.fromstring(marathon_status.deploy_status) if status != MarathonDeployStatus.NotRunning: if status == MarathonDeployStatus.Delayed: deploy_status = marathon_app_deploy_status_human( status, marathon_status.backoff_seconds) else: deploy_status = marathon_app_deploy_status_human(status) else: deploy_status = 'NotRunning' output.append( " {}".format( status_marathon_job_human( service=service, instance=instance, deploy_status=deploy_status, desired_app_id=marathon_status.app_id, app_count=marathon_status.app_count, running_instances=marathon_status.running_instance_count, normal_instance_count=marathon_status.expected_instance_count, ), ), ) return 0
def marathon_job_status(mstatus, client, job_config): try: app_id = job_config.format_marathon_app_dict()['id'] except NoDockerImageError: error_msg = "Docker image is not in deployments.json." mstatus['error_message'] = error_msg return if marathon_tools.is_app_id_running(app_id, client): app = client.get_app(app_id) deploy_status, _ = get_marathon_app_deploy_status(app, app_id, client) mstatus['deploy_status'] = MarathonDeployStatus.tostring(deploy_status) # by comparing running count with expected count, callers can figure # out if the instance is in Healthy, Warning or Critical state. mstatus['running_instance_count'] = app.tasks_running mstatus['expected_instance_count'] = job_config.get_instances() else: mstatus['deploy_status'] = 'Not Running'
def paasta_status_on_api_endpoint(cluster, service, instance, system_paasta_config, verbose): client = get_paasta_api_client(cluster, system_paasta_config) if not client: print 'Cannot get a paasta-api client' exit(1) try: status = client.service.status_instance(service=service, instance=instance).result() except HTTPError as exc: print exc.response.text return print 'instance: %s' % PaastaColors.blue(instance) print 'Git sha: %s (desired)' % status.git_sha marathon_status = status.marathon if marathon_status.error_message: print marathon_status.error_message return bouncing_status = bouncing_status_human(marathon_status.app_count, marathon_status.bounce_method) desired_state = desired_state_human(marathon_status.desired_state, marathon_status.expected_instance_count) print "State: %s - Desired state: %s" % (bouncing_status, desired_state) status = MarathonDeployStatus.fromstring(marathon_status.deploy_status) if status != MarathonDeployStatus.NotRunning: if status == MarathonDeployStatus.Delayed: deploy_status = marathon_app_deploy_status_human(status, marathon_status.backoff_seconds) else: deploy_status = marathon_app_deploy_status_human(status) else: deploy_status = 'NotRunning' print status_marathon_job_human(service, instance, deploy_status, marathon_status.app_id, marathon_status.running_instance_count, marathon_status.expected_instance_count)