from pydantic import BaseModel, Field from typing import Dict, Any, List, Optional class JobSpecification(BaseModel): """ Nomad job specification. This is a simplified schema as the actual Nomad job spec is quite complex and varies by job type. """ id: Optional[str] = Field(None, description="Job ID") ID: Optional[str] = Field(None, description="Job ID (Nomad format)") name: Optional[str] = Field(None, description="Job name") Name: Optional[str] = Field(None, description="Job name (Nomad format)") type: Optional[str] = Field(None, description="Job type (service, batch, system)") Type: Optional[str] = Field(None, description="Job type (Nomad format)") datacenters: Optional[List[str]] = Field(None, description="List of datacenters") Datacenters: Optional[List[str]] = Field(None, description="List of datacenters (Nomad format)") task_groups: Optional[List[Dict[str, Any]]] = Field(None, description="Task groups") TaskGroups: Optional[List[Dict[str, Any]]] = Field(None, description="Task groups (Nomad format)") meta: Optional[Dict[str, str]] = Field(None, description="Job metadata") Meta: Optional[Dict[str, str]] = Field(None, description="Job metadata (Nomad format)") # Allow additional fields (to handle the complete Nomad job spec) class Config: extra = "allow" class JobOperation(BaseModel): """Response after a job operation (start, stop, etc.)""" job_id: str = Field(..., description="The ID of the job") eval_id: Optional[str] = Field(None, description="The evaluation ID") status: str = Field(..., description="The status of the operation") warnings: Optional[str] = Field(None, description="Any warnings from Nomad") class JobResponse(BaseModel): """ Job response schema. This is a simplified version as the actual Nomad job response is quite complex and varies by job type. """ ID: str = Field(..., description="Job ID") Name: str = Field(..., description="Job name") Status: str = Field(..., description="Job status") Type: str = Field(..., description="Job type") repository: Optional[str] = Field(None, description="Associated repository if any") # Allow additional fields (to handle the complete Nomad job response) class Config: extra = "allow" class TaskGroup(BaseModel): """Task group schema.""" Name: str Count: int Tasks: List[Dict[str, Any]] class Config: extra = "allow" class Task(BaseModel): """Task schema.""" Name: str Driver: str Config: Dict[str, Any] class Config: extra = "allow" class Allocation(BaseModel): """Allocation schema.""" ID: str JobID: str TaskGroup: str ClientStatus: str class Config: extra = "allow"