Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion app/routers/account/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ class User(IRIBaseModel):
id: str = Field(..., description="Unique identifier of the user.", example="user-123")
name: str = Field(..., description="Name of the user.", example="Jane Doe")
api_key: str = Field(..., description="API key associated with this user.", example="AKIAIOSFODNN7EXAMPLE")
client_ip: str = Field(default=None, description="IP address from which the user connects.", example="192.0.2.10")
client_ip: str|None = Field(default=None, description="IP address from which the user connects.", example="192.0.2.10")
# we could expose more fields here (eg. email) but it might be against policy


Expand Down
12 changes: 6 additions & 6 deletions app/routers/compute/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -121,14 +121,14 @@ class JobState(str, Enum):
class JobStatus(IRIBaseModel):
"""Represents the status of a job."""
state: JobState = Field(..., description="Current state of the job", example="queued")
time: float = Field(default=None, description="Timestamp associated with the status (seconds since epoch)", example=1708531200.0)
message: str = Field(default=None, description="Human-readable status message", example="Job is waiting in queue")
exit_code: int = Field(default=None, description="Process exit code if the job has finished", example=0)
meta_data: dict[str, object] = Field(default=None, description="Backend-specific metadata associated with the job status")
time: float|None = Field(default=None, description="Timestamp associated with the status (seconds since epoch)", example=1708531200.0)
message: str|None = Field(default=None, description="Human-readable status message", example="Job is waiting in queue")
exit_code: int|None = Field(default=None, description="Process exit code if the job has finished", example=0)
meta_data: dict[str, object]|None = Field(default=None, description="Backend-specific metadata associated with the job status")


class Job(IRIBaseModel):
"""Represents a job in the system."""
id: str = Field(..., description="Unique identifier of the job", example="job-12345")
status: JobStatus = Field(default=None, description="Current status of the job")
job_spec: JobSpec = Field(default=None, description="Specification used to create the job")
status: JobStatus|None = Field(default=None, description="Current status of the job")
job_spec: JobSpec|None = Field(default=None, description="Specification used to create the job")
4 changes: 2 additions & 2 deletions app/routers/error_handlers.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,8 @@ class Problem(BaseModel):
model_config = ConfigDict(extra="allow", json_schema_extra={"description": 'Error structure for REST interface based on RFC 9457, "Problem Details for HTTP APIs."'})
type: str = Field(..., description="A URI reference that identifies the problem type.", example="https://example.com/notFound", json_schema_extra={"format": "uri", "default": "about:blank"})
status: int = Field(..., ge=100, le=599, description="The HTTP status code for this occurrence.", example=404)
title: str = Field(default=None, description="Short human-readable summary.", example="Not Found")
detail: str = Field(default=None, description="Human-readable explanation.", example="Descriptive text.")
title: str|None = Field(default=None, description="Short human-readable summary.", example="Not Found")
detail: str|None = Field(default=None, description="Human-readable explanation.", example="Descriptive text.")
instance: str = Field(..., description="A URI reference identifying this occurrence.", example="http://localhost/api/v1/resource/123")


Expand Down
26 changes: 13 additions & 13 deletions app/routers/facility/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,16 +10,16 @@ class Site(NamedObject):
def _self_path(self) -> str:
return f"/facility/sites/{self.id}"

short_name: str = Field(default=None, description="Common or short name of the Site.", example="NERSC")
operating_organization: str = Field(..., description="Organization operating the Site.", example="Lawrence Berkeley National Laboratory")
country_name: str = Field(default=None, description="Country name of the Location.", example="United States")
locality_name: str = Field(default=None, description="City or locality name of the Location.", example="Berkeley")
state_or_province_name: str = Field(default=None, description="State or province name of the Location.", example="California")
street_address: str = Field(default=None, description="Street address of the Location.", example="1 Cyclotron Rd")
unlocode: str = Field(default=None, description="United Nations trade and transport location code.", example="USOAK")
altitude: float = Field(default=None, description="Altitude of the Location.", example=52.0)
latitude: float = Field(default=None, description="Latitude of the Location.", example=37.8762)
longitude: float = Field(default=None, description="Longitude of the Location.", example=-122.2506)
short_name: str|None = Field(default=None, description="Common or short name of the Site.", example="NERSC")
operating_organization: str|None = Field(..., description="Organization operating the Site.", example="Lawrence Berkeley National Laboratory")
country_name: str|None = Field(default=None, description="Country name of the Location.", example="United States")
locality_name: str|None = Field(default=None, description="City or locality name of the Location.", example="Berkeley")
state_or_province_name: str|None = Field(default=None, description="State or province name of the Location.", example="California")
street_address: str|None = Field(default=None, description="Street address of the Location.", example="1 Cyclotron Rd")
unlocode: str|None = Field(default=None, description="United Nations trade and transport location code.", example="USOAK")
altitude: float|None = Field(default=None, description="Altitude of the Location.", example=52.0)
latitude: float|None = Field(default=None, description="Latitude of the Location.", example=37.8762)
longitude: float|None = Field(default=None, description="Longitude of the Location.", example=-122.2506)
resource_ids: list[str] = Field(default_factory=list, exclude=True)

@computed_field(description="URIs of Resources hosted at this Site.")
Expand All @@ -44,9 +44,9 @@ class Facility(NamedObject):
def _self_path(self) -> str:
return "/facility"

short_name: str = Field(default=None, description="Common or short name of the Facility.", example="ESnet")
organization_name: str = Field(default=None, description="Operating organization's name.", example="Energy Sciences Network")
support_uri: HttpUrl = Field(default=None, description="Link to facility support portal.", example="https://support.es.net")
short_name: str|None = Field(default=None, description="Common or short name of the Facility.", example="ESnet")
organization_name: str|None = Field(default=None, description="Operating organization's name.", example="Energy Sciences Network")
support_uri: HttpUrl|None = Field(default=None, description="Link to facility support portal.", example="https://support.es.net")
site_ids: list[str] = Field(default_factory=list, exclude=True)

@computed_field(description="URIs of associated Sites.")
Expand Down
50 changes: 25 additions & 25 deletions app/routers/filesystem/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ class File(BaseModel):
"""Represents a file or directory in the filesystem."""
name: str = Field(..., description="File name", example="file.txt")
type: str = Field(..., description="File type", example="file")
link_target: str = Field(default=None, description="Target path if the file is a symbolic link", example="/data/file.txt")
link_target: str|None = Field(default=None, description="Target path if the file is a symbolic link", example="/data/file.txt")
user: str = Field(..., description="Owner username", example="user")
group: str = Field(..., description="Owner group", example="users")
permissions: str = Field(..., description="POSIX permission string", example="rwxr-xr-x")
Expand Down Expand Up @@ -76,55 +76,55 @@ class PatchFile(BaseModel):

class PatchFileMetadataRequest(BaseModel):
"""Represents a request to update file metadata."""
new_filename: str = Field(default=None, description="New file name", example="file.new")
new_permissions: str = Field(default=None, description="New permissions", example="755")
new_owner: str = Field(default=None, description="New owner", example="user")
new_filename: str|None = Field(default=None, description="New file name", example="file.new")
new_permissions: str|None = Field(default=None, description="New permissions", example="755")
new_owner: str|None = Field(default=None, description="New owner", example="user")


class GetDirectoryLsResponse(BaseModel):
"""Represents the response for a directory listing."""
output: list[File] = Field(default=None, description="Directory listing")
output: list[File]|None = Field(default=None, description="Directory listing")


class GetFileHeadResponse(BaseModel):
"""Represents the response for reading the beginning of a file."""
output: FileContent = Field(default=None, description="File content from the beginning")
output: FileContent|None = Field(default=None, description="File content from the beginning")


class GetFileTailResponse(BaseModel):
"""Represents the response for reading the end of a file."""
output: FileContent = Field(default=None, description="File content from the end")
output: FileContent|None = Field(default=None, description="File content from the end")


class GetFileChecksumResponse(BaseModel):
"""Represents the response for getting file checksum information."""
output: FileChecksum = Field(default=None, description="File checksum information")
output: FileChecksum|None = Field(default=None, description="File checksum information")


class GetFileTypeResponse(BaseModel):
"""Represents the response for getting the type of a file."""
output: str = Field(default=None, description="Type of the file", example="directory")
output: str|None = Field(default=None, description="Type of the file", example="directory")


class GetFileStatResponse(BaseModel):
"""Represents the response for getting file metadata information."""
output: FileStat = Field(default=None, description="File stat information")
output: FileStat|None = Field(default=None, description="File stat information")


class GetFileDownloadResponse(BaseModel):
"""Represents the response for downloading a file."""
output: str = Field(default=None, description="Download URL or identifier", example="https://example.com/download/file")
output: str|None = Field(default=None, description="Download URL or identifier", example="https://example.com/download/file")


class PatchFileMetadataResponse(BaseModel):
"""Represents the response for updating file metadata."""
output: PatchFile = Field(default=None, description="Updated file metadata")
output: PatchFile|None = Field(default=None, description="Updated file metadata")


class FilesystemRequestBase(BaseModel):
"""Base class for filesystem operation requests."""
# Should we allow both: path and source_path? Or just one of them?
path: str = Field(default=None, validation_alias=AliasChoices("path", "source_path"), description="Source file or directory path", example="/home/user/dir")
path: str|None = Field(default=None, validation_alias=AliasChoices("path", "source_path"), description="Source file or directory path", example="/home/user/dir")


class PutFileChmodRequest(FilesystemRequestBase):
Expand All @@ -135,7 +135,7 @@ class PutFileChmodRequest(FilesystemRequestBase):

class PutFileChmodResponse(BaseModel):
"""Represents the response for changing file permissions."""
output: File = Field(default=None, description="Updated file metadata")
output: File|None = Field(default=None, description="Updated file metadata")


class PutFileChownRequest(FilesystemRequestBase):
Expand All @@ -157,12 +157,12 @@ class PutFileChownRequest(FilesystemRequestBase):

class PutFileChownResponse(BaseModel):
"""Represents the response for changing file ownership."""
output: File = Field(default=None, description="Updated file metadata")
output: File|None = Field(default=None, description="Updated file metadata")


class PutFileUploadResponse(BaseModel):
"""Represents the response for uploading a file."""
output: str = Field(default=None, description="Upload result or identifier")
output: str|None = Field(default=None, description="Upload result or identifier")


class PostMakeDirRequest(FilesystemRequestBase):
Expand All @@ -179,28 +179,28 @@ class PostFileSymlinkRequest(FilesystemRequestBase):

class PostFileSymlinkResponse(BaseModel):
"""Represents the response for creating a symbolic link."""
output: File = Field(default=None, description="Created symlink metadata")
output: File|None = Field(default=None, description="Created symlink metadata")


class GetViewFileResponse(BaseModel):
"""Represents the response for viewing a file."""
output: str = Field(default=None, description="File content")
output: str|None = Field(default=None, description="File content")


class PostMkdirResponse(BaseModel):
"""Represents the response for creating a directory."""
output: File = Field(default=None, description="Created directory metadata")
output: File|None = Field(default=None, description="Created directory metadata")


class PostCompressResponse(BaseModel):
"""Represents the response for compressing a file."""
output: File = Field(default=None, description="Compressed file metadata")
output: File|None = Field(default=None, description="Compressed file metadata")


class PostCompressRequest(FilesystemRequestBase):
"""Represents a request to compress a file."""
target_path: str = Field(..., description="Path to the compressed file", example="/home/user/file.tar.gz")
match_pattern: str = Field(default=None, description="Regex pattern to filter files to compress", example=".*\\.txt$")
match_pattern: str|None = Field(default=None, description="Regex pattern to filter files to compress", example=".*\\.txt$")
dereference: bool = Field(default=False, description="If set to `true`, it follows symbolic links and archive the files they point to instead of the links themselves.", example=True)
compression: CompressionType = Field(default="gzip", description="Defines the type of compression to be used. By default gzip is used.", example="gzip")
model_config = {
Expand All @@ -220,7 +220,7 @@ class PostCompressRequest(FilesystemRequestBase):

class PostExtractResponse(BaseModel):
"""Represents the response for extracting a compressed file."""
output: File = Field(default=None, description="Extracted file metadata")
output: File|None = Field(default=None, description="Extracted file metadata")


class PostExtractRequest(FilesystemRequestBase):
Expand Down Expand Up @@ -259,7 +259,7 @@ class PostCopyRequest(FilesystemRequestBase):

class PostCopyResponse(BaseModel):
"""Represents the response for copying a file."""
output: File = Field(default=None, description="Copied file metadata")
output: File|None = Field(default=None, description="Copied file metadata")


class PostMoveRequest(FilesystemRequestBase):
Expand All @@ -279,9 +279,9 @@ class PostMoveRequest(FilesystemRequestBase):

class PostMoveResponse(BaseModel):
"""Represents the response for moving a file."""
output: File = Field(default=None, description="Moved file metadata")
output: File|None = Field(default=None, description="Moved file metadata")


class RemoveResponse(BaseModel):
"""Represents the response for removing a file or directory."""
output: str = Field(default=None, description="Removal result message")
output: str|None = Field(default=None, description="Removal result message")
6 changes: 2 additions & 4 deletions app/routers/status/facility_adapter.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
import datetime
from abc import ABC, abstractmethod

from fastapi import Query

from ...types.models import Capability
from . import models as status_models

Expand All @@ -23,8 +21,8 @@ async def get_resources(
description: str | None = None,
group: str | None = None,
modified_since: datetime.datetime | None = None,
resource_type: status_models.ResourceType = Query(default=None),
current_status: status_models.Status = Query(default=None),
resource_type: status_models.ResourceType|None = None,
current_status: status_models.Status|None = None,
capability: Capability | None = None,
site_id: str | None = None,
) -> list[status_models.Resource]:
Expand Down
8 changes: 4 additions & 4 deletions app/routers/status/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,8 @@ def _self_path(self) -> str:

site_id: str = Field(..., description="The site identifier this resource is located at", exclude=True, example="site-1")
capability_ids: list[str] = Field(default_factory=list, exclude=True)
group: str = Field(default=None, description="Logical grouping of the resource", example="frontend")
current_status: Status = Field(default=None, description="The current status comes from the status of the last event for this resource", example="up")
group: str|None = Field(default=None, description="Logical grouping of the resource", example="frontend")
current_status: Status|None = Field(default=None, description="The current status comes from the status of the last event for this resource", example="up")
resource_type: ResourceType = Field(..., description="Type of the resource", example="service")

@computed_field(description="URI of the site where this resource is located")
Expand Down Expand Up @@ -83,7 +83,7 @@ def _norm_dt_field(cls, v):
occurred_at: datetime.datetime = Field(..., description="Timestamp when the event occurred", example="2026-02-21T12:00:00Z")
status: Status = Field(..., description="Status of the resource at the time of the event", example="down")
resource_id: str = Field(..., exclude=True, description="Identifier of the affected resource", example="res-1")
incident_id: str = Field(default=None, exclude=True, description="Identifier of the related incident", example="inc-1")
incident_id: str|None = Field(default=None, exclude=True, description="Identifier of the related incident", example="inc-1")

@computed_field(description="The resource belonging to this event")
@property
Expand Down Expand Up @@ -152,7 +152,7 @@ def _norm_dt_field(cls, v):
resource_ids: list[str] = Field(default_factory=list, exclude=True)
event_ids: list[str] = Field(default_factory=list, exclude=True)
start: datetime.datetime = Field(..., description="Incident start time", example="2026-02-21T12:00:00Z")
end: datetime.datetime = Field(default=None, description="Incident end time", example="2026-02-21T14:00:00Z")
end: datetime.datetime|None = Field(default=None, description="Incident end time", example="2026-02-21T14:00:00Z")
type: IncidentType = Field(..., description="Type of incident", example="planned")
resolution: Resolution = Field(..., description="Resolution status of the incident", example="pending")

Expand Down
4 changes: 2 additions & 2 deletions app/routers/task/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,5 +37,5 @@ class Task(BaseModel):
"""Represents a task in the system."""
id: str = Field(..., description="Unique identifier of the task", example="task-123")
status: TaskStatus = Field(default=TaskStatus.pending, description="Current status of the task", example="pending")
result: Any = Field(default=None, description="Result of the task execution, if available")
command: TaskCommand = Field(default=None, description="Command associated with this task")
result: Any|None = Field(default=None, description="Result of the task execution, if available")
command: TaskCommand|None = Field(default=None, description="Command associated with this task")
Loading