class_docstr: A class for recording information associated with a job and its execution.
  
  Please keep this in sync with the JobsAPIInfo proto in src/ray/protobuf/gcs.proto.
code: def __post_init__(self):
      if isinstance(self.status, str):
          self.status = JobStatus(self.status)
      if self.message is None:
          if self.status == JobStatus.PENDING:
              self.message = "Job has not started yet."
              if any(
                  [
                      self.entrypoint_num_cpus is not None
                      and self.entrypoint_num_cpus > 0,
                      self.entrypoint_num_gpus is not None
                      and self.entrypoint_num_gpus > 0,
                      self.entrypoint_memory is not None
                      and self.entrypoint_memory > 0,
                      self.entrypoint_resources not in [None, {}],
                  ]
              ):
                  self.message += (
                      " It may be waiting for resources "
                      "(CPUs, GPUs, memory, custom resources) to become available."
                  )
              if self.runtime_env not in [None, {}]:
                  self.message += " It may be waiting for the runtime environment to be set up."
          elif self.status == JobStatus.RUNNING:
              self.message = "Job is currently running."
          elif self.status == JobStatus.STOPPED:
              self.message = "Job was intentionally stopped."
          elif self.status == JobStatus.SUCCEEDED:
              self.message = "Job finished successfully."
          elif self.status == JobStatus.FAILED:
              self.message = "Job failed."
  
imports: import asyncio
  import json
  import time
  from dataclasses import dataclass, replace, asdict
  from enum import Enum
  from pathlib import Path
  from typing import Any, Dict, Optional, Tuple, Union
  from ray._private import ray_constants
  from ray._private.gcs_utils import GcsAioClient
  from ray._private.runtime_env.packaging import parse_uri
  from ray.util.annotations import PublicAPI
label_desc: Use image node_id 1 for calling the JobInfo obj's underlying member method code with example usage: obj.__post_init__() without return types