Source code for ray.dashboard.modules.job.pydantic_models
from enum import Enum
from typing import Any, Dict, Optional
from ray._common.pydantic_compat import PYDANTIC_INSTALLED, BaseModel, Field
from ray.dashboard.modules.job.common import JobStatus
from ray.util.annotations import PublicAPI
# Pydantic is not part of the minimal Ray installation.
if PYDANTIC_INSTALLED:
[docs]
    @PublicAPI(stability="beta")
    class DriverInfo(BaseModel):
        """A class for recording information about the driver related to the job."""
        id: str = Field(..., description="The id of the driver")
        node_ip_address: str = Field(
            ..., description="The IP address of the node the driver is running on."
        )
        pid: str = Field(
            ..., description="The PID of the worker process the driver is using."
        ) 
        # TODO(aguo): Add node_id as a field.
[docs]
    @PublicAPI(stability="beta")
    class JobType(str, Enum):
        """An enumeration for describing the different job types.
        NOTE:
            This field is still experimental and may change in the future.
        """
        #: A job that was initiated by the Ray Jobs API.
        SUBMISSION = "SUBMISSION"
        #: A job that was initiated by a driver script.
        DRIVER = "DRIVER" 
[docs]
    @PublicAPI(stability="beta")
    class JobDetails(BaseModel):
        """
        Job data with extra details about its driver and its submission.
        """
        type: JobType = Field(..., description="The type of job.")
        job_id: Optional[str] = Field(
            None,
            description="The job ID. An ID that is created for every job that is "
            "launched in Ray. This can be used to fetch data about jobs using Ray "
            "Core APIs.",
        )
        submission_id: Optional[str] = Field(
            None,
            description="A submission ID is an ID created for every job submitted via"
            "the Ray Jobs API. It can "
            "be used to fetch data about jobs using the Ray Jobs API.",
        )
        driver_info: Optional[DriverInfo] = Field(
            None,
            description="The driver related to this job. For jobs submitted via "
            "the Ray Jobs API, "
            "it is the last driver launched by that job submission, "
            "or None if there is no driver.",
        )
        # The following fields are copied from JobInfo.
        # TODO(aguo): Inherit from JobInfo once it's migrated to pydantic.
        status: JobStatus = Field(..., description="The status of the job.")
        entrypoint: str = Field(..., description="The entrypoint command for this job.")
        message: Optional[str] = Field(
            None, description="A message describing the status in more detail."
        )
        error_type: Optional[str] = Field(
            None, description="Internal error or user script error."
        )
        start_time: Optional[int] = Field(
            None,
            description="The time when the job was started. A Unix timestamp in ms.",
        )
        end_time: Optional[int] = Field(
            None,
            description="The time when the job moved into a terminal state. "
            "A Unix timestamp in ms.",
        )
        metadata: Optional[Dict[str, str]] = Field(
            None, description="Arbitrary user-provided metadata for the job."
        )
        runtime_env: Optional[Dict[str, Any]] = Field(
            None, description="The runtime environment for the job."
        )
        # the node info where the driver running on.
        #     - driver_agent_http_address: this node's agent http address
        #     - driver_node_id: this node's id.
        driver_agent_http_address: Optional[str] = Field(
            None,
            description="The HTTP address of the JobAgent on the node the job "
            "entrypoint command is running on.",
        )
        driver_node_id: Optional[str] = Field(
            None,
            description="The ID of the node the job entrypoint command is running on.",
        )
        driver_exit_code: Optional[int] = Field(
            None,
            description="The driver process exit code after the driver executed. "
            "Return None if driver doesn't finish executing.",
        ) 
else:
    DriverInfo = None
    JobType = None
    JobDetails = None