def bounce_status( service: str, instance: str, settings: Any, ): status: Dict[str, Any] = {} job_config = kubernetes_tools.load_kubernetes_service_config( service=service, instance=instance, cluster=settings.cluster, soa_dir=settings.soa_dir, load_deployments=True, ) expected_instance_count = job_config.get_instances() status["expected_instance_count"] = expected_instance_count desired_state = job_config.get_desired_state() status["desired_state"] = desired_state kube_client = settings.kubernetes_client if kube_client is None: raise RuntimeError("Could not load Kubernetes client!") app = kubernetes_tools.get_kubernetes_app_by_name( name=job_config.get_sanitised_deployment_name(), kube_client=kube_client, namespace=job_config.get_kubernetes_namespace(), ) status["running_instance_count"] = (app.status.ready_replicas if app.status.ready_replicas else 0) deploy_status, message = kubernetes_tools.get_kubernetes_app_deploy_status( app=app, desired_instances=(expected_instance_count if desired_state != "stop" else 0), ) status["deploy_status"] = kubernetes_tools.KubernetesDeployStatus.tostring( deploy_status) if job_config.get_persistent_volumes(): version_objects = kubernetes_tools.controller_revisions_for_service_instance( service=job_config.service, instance=job_config.instance, kube_client=kube_client, namespace=job_config.get_kubernetes_namespace(), ) else: replicasets = kubernetes_tools.replicasets_for_service_instance( service=job_config.service, instance=job_config.instance, kube_client=kube_client, namespace=job_config.get_kubernetes_namespace(), ) version_objects = filter_actually_running_replicasets(replicasets) active_shas = kubernetes_tools.get_active_shas_for_service( [app, *version_objects], ) status["active_shas"] = list(active_shas) status["app_count"] = len(active_shas) return status
async def job_status( kstatus: MutableMapping[str, Any], client: kubernetes_tools.KubeClient, job_config: LongRunningServiceConfig, pod_list: Sequence[V1Pod], replicaset_list: Sequence[V1ReplicaSet], verbose: int, namespace: str, ) -> None: app_id = job_config.get_sanitised_deployment_name() kstatus["app_id"] = app_id kstatus["pods"] = [] kstatus["replicasets"] = [] if verbose > 0: num_tail_lines = calculate_tail_lines(verbose) kstatus["pods"] = await asyncio.gather( *[pod_info(pod, client, num_tail_lines) for pod in pod_list] ) for replicaset in replicaset_list: kstatus["replicasets"].append( { "name": replicaset.metadata.name, "replicas": replicaset.spec.replicas, "ready_replicas": ready_replicas_from_replicaset(replicaset), "create_timestamp": replicaset.metadata.creation_timestamp.timestamp(), "git_sha": replicaset.metadata.labels.get("paasta.yelp.com/git_sha"), "config_sha": replicaset.metadata.labels.get( "paasta.yelp.com/config_sha" ), } ) kstatus["expected_instance_count"] = job_config.get_instances() app = kubernetes_tools.get_kubernetes_app_by_name( name=app_id, kube_client=client, namespace=namespace ) desired_instances = ( job_config.get_instances() if job_config.get_desired_state() != "stop" else 0 ) deploy_status, message = kubernetes_tools.get_kubernetes_app_deploy_status( app=app, desired_instances=desired_instances, ) kstatus["deploy_status"] = kubernetes_tools.KubernetesDeployStatus.tostring( deploy_status ) kstatus["deploy_status_message"] = message kstatus["running_instance_count"] = ( app.status.ready_replicas if app.status.ready_replicas else 0 ) kstatus["create_timestamp"] = app.metadata.creation_timestamp.timestamp() kstatus["namespace"] = app.metadata.namespace
def kubernetes_job_status( kstatus: MutableMapping[str, Any], client: kubernetes_tools.KubeClient, job_config: kubernetes_tools.KubernetesDeploymentConfig, pod_list: Sequence[V1Pod], replicaset_list: Sequence[V1ReplicaSet], verbose: int, ) -> None: app_id = job_config.get_sanitised_deployment_name() kstatus["app_id"] = app_id kstatus["pods"] = [] kstatus["replicasets"] = [] if verbose > 0: for pod in pod_list: kstatus["pods"].append({ "name": pod.metadata.name, "host": pod.spec.node_name, "deployed_timestamp": pod.metadata.creation_timestamp.timestamp(), "phase": pod.status.phase, }) for replicaset in replicaset_list: kstatus["replicasets"].append({ "name": replicaset.metadata.name, "replicas": replicaset.spec.replicas, "ready_replicas": replicaset.status.ready_replicas, "create_timestamp": replicaset.metadata.creation_timestamp.timestamp(), }) kstatus["expected_instance_count"] = job_config.get_instances() app = kubernetes_tools.get_kubernetes_app_by_name(app_id, client) deploy_status = kubernetes_tools.get_kubernetes_app_deploy_status( client, app, job_config.get_instances()) kstatus[ "deploy_status"] = kubernetes_tools.KubernetesDeployStatus.tostring( deploy_status) kstatus["running_instance_count"] = (app.status.ready_replicas if app.status.ready_replicas else 0) kstatus["create_timestamp"] = app.metadata.creation_timestamp.timestamp() kstatus["namespace"] = app.metadata.namespace
def kubernetes_job_status( kstatus: MutableMapping[str, Any], client: kubernetes_tools.KubeClient, job_config: kubernetes_tools.KubernetesDeploymentConfig, pod_list: Sequence[V1Pod], verbose: bool, ) -> None: app_id = job_config.get_sanitised_deployment_name() kstatus['app_id'] = app_id if verbose is True: kstatus['slaves'] = [ pod.spec.node_name for pod in pod_list ] kstatus['expected_instance_count'] = job_config.get_instances() app = kubernetes_tools.get_kubernetes_app_by_name(app_id, client) deploy_status = kubernetes_tools.get_kubernetes_app_deploy_status(client, app, job_config.get_instances()) kstatus['deploy_status'] = kubernetes_tools.KubernetesDeployStatus.tostring(deploy_status) kstatus['running_instance_count'] = app.status.ready_replicas if app.status.ready_replicas else 0
async def job_status( kstatus: MutableMapping[str, Any], client: kubernetes_tools.KubeClient, job_config: LongRunningServiceConfig, pod_list: Sequence[V1Pod], replicaset_list: Sequence[V1ReplicaSet], verbose: int, namespace: str, ) -> None: app_id = job_config.get_sanitised_deployment_name() kstatus["app_id"] = app_id kstatus["pods"] = [] kstatus["replicasets"] = [] if verbose > 0: num_tail_lines = calculate_tail_lines(verbose) for pod in pod_list: container_statuses = pod.status.container_statuses or [] containers = [ dict( name=container.name, tail_lines=await get_tail_lines_for_kubernetes_container( client, pod, container, num_tail_lines, ), ) for container in container_statuses ] kstatus["pods"].append( { "name": pod.metadata.name, "host": kubernetes_tools.get_pod_hostname(client, pod), "deployed_timestamp": pod.metadata.creation_timestamp.timestamp(), "phase": pod.status.phase, "ready": kubernetes_tools.is_pod_ready(pod), "containers": containers, "reason": pod.status.reason, "message": pod.status.message, } ) for replicaset in replicaset_list: try: ready_replicas = replicaset.status.ready_replicas if ready_replicas is None: ready_replicas = 0 except AttributeError: ready_replicas = 0 kstatus["replicasets"].append( { "name": replicaset.metadata.name, "replicas": replicaset.spec.replicas, "ready_replicas": ready_replicas, "create_timestamp": replicaset.metadata.creation_timestamp.timestamp(), } ) kstatus["expected_instance_count"] = job_config.get_instances() app = kubernetes_tools.get_kubernetes_app_by_name( name=app_id, kube_client=client, namespace=namespace ) deploy_status = kubernetes_tools.get_kubernetes_app_deploy_status( app=app, desired_instances=job_config.get_instances() ) kstatus["deploy_status"] = kubernetes_tools.KubernetesDeployStatus.tostring( deploy_status ) kstatus["running_instance_count"] = ( app.status.ready_replicas if app.status.ready_replicas else 0 ) kstatus["create_timestamp"] = app.metadata.creation_timestamp.timestamp() kstatus["namespace"] = app.metadata.namespace