diff --git a/src/ansys/hps/client/rms/models.py b/src/ansys/hps/client/rms/models.py index 51b298366..77fd7101a 100644 --- a/src/ansys/hps/client/rms/models.py +++ b/src/ansys/hps/client/rms/models.py @@ -157,6 +157,7 @@ class ShutdownStatus(Enum): normal = "normal" aborted = "aborted" crash = "crash" + failed = "failed" class EvaluatorRegistration(DictModel): @@ -400,8 +401,14 @@ class MockupBackend(DictModel): class Node(DictModel): name: str | None = Field(None, description="Node name.", title="Name") - total_memory_mb: int | None = Field(..., description="Total memory.", title="Total Memory Mb") - total_cores: int | None = Field(..., description="Number of cores.", title="Total Cores") + total_memory_mb: int | None = Field(None, description="Total memory.", title="Total Memory Mb") + used_memory_mb: int | None = Field(None, description="Used memory.", title="Used Memory Mb") + total_cores: int | None = Field(None, description="Number of cores.", title="Total Cores") + reserved_cores: int | None = Field( + None, + description="Cores currently allocated by scheduler.", + title="Reserved Cores", + ) additional_props: dict[str, Any] | None = Field({}, title="Additional Props") @@ -510,6 +517,20 @@ class Queue(DictModel): additional_props: dict[str, Any] | None = Field({}, title="Additional Props") +class QueueLoad(DictModel): + name: str | None = Field(None, description="Queue name.", title="Name") + total_cores: int | None = Field(None, description="Total number of cores.", title="Total Cores") + reserved_cores: int | None = Field( + None, + description="Cores currently allocated by scheduler.", + title="Reserved Cores", + ) + total_memory_mb: int | None = Field(None, description="Total memory.", title="Total Memory Mb") + used_memory_mb: int | None = Field( + None, description="Memory currently in use.", title="Used Memory Mb" + ) + + class Resources(DictModel): num_cores: int | None = Field(None, description="Number of cores.", title="Num Cores") platform: PlatformEnum | None = Field( @@ -729,11 +750,20 @@ class ClusterInfo(DictModel): id: str | None = Field(None, description="Unique ID for the database.", title="Id") crs_id: str | None = Field(None, description="Compute resource set ID.", title="Crs Id") name: str | None = Field(None, description="Cluster name.", title="Name") - queues: list[Queue] | None = Field(default_factory=list, title="Queues") - nodes: list[Node] | None = Field(default_factory=list, title="Nodes") + queues: list[Queue] | None = Field([], title="Queues", validate_default=True) + nodes: list[Node] | None = Field([], title="Nodes", validate_default=True) additional_props: dict[str, dict[str, Any]] | None = Field({}, title="Additional Props") +class ClusterLoadSnapshot(DictModel): + id: str | None = Field(None, description="Unique ID for the database", title="Id") + crs_id: str | None = Field(None, description="Compute resource set ID", title="Crs Id") + timestamp: datetime | None = Field( + None, description="Timestamp of this load data", title="Timestamp" + ) + queue_loads: list[QueueLoad] | None = Field([], title="Queue Loads", validate_default=True) + + class Context(DictModel): custom: dict[str, int | bool | str | float | None] | None = Field( {}, description="Custom runtime properties.", title="Custom" @@ -849,12 +879,11 @@ class OrchestrationInterfacesBackend(DictModel): process_runner: ( ServiceUserProcessRunner | ProcessLauncherProcessRunner | RestLauncherProcessRunner | None ) = Field( - default_factory=lambda: ServiceUserProcessRunner.model_validate( - {"plugin_name": "service_user_module"} - ), + {"plugin_name": "service_user_module"}, description="Process runner to execute commands.", discriminator="plugin_name", title="Process Runner", + validate_default=True, ) create_workdir: bool | None = Field( True, @@ -879,6 +908,12 @@ class AnalyzeResponse(DictModel): scalers: list[AnalyzeResponseScaler] = Field(..., title="Scalers") +class ClusterLoadHistoryResponse(DictModel): + cluster_load_history: list[ClusterLoadSnapshot] = Field( + ..., description="Cluster load history", title="Cluster Load History" + ) + + class ComputeResourceSet(DictModel): name: str | None = Field( "default", description="Name of the compute resource set.", title="Name" @@ -900,33 +935,33 @@ class ComputeResourceSet(DictModel): | MockupBackend | None ) = Field( - default_factory=lambda: KubernetesKedaBackend.model_validate( - {"plugin_name": "local", "debug": False} - ), + {"plugin_name": "local", "debug": False}, description="Backend to use in the compute resource set.", discriminator="plugin_name", title="Backend", + validate_default=True, ) scaling_strategy: MaxAvailableResourceScaling | KubernetesResourceScaling | None = Field( - default_factory=lambda: MaxAvailableResourceScaling.model_validate( - { - "plugin_name": "max_available_resource_scaling", - "scaling_factor": 1, - "match_all_requirements": False, - } - ), + { + "plugin_name": "max_available_resource_scaling", + "scaling_factor": 1, + "match_all_requirements": False, + }, description="Scaling strategy to use in the compute resource set.", discriminator="plugin_name", title="Scaling Strategy", + validate_default=True, ) available_resources: Resources | None = Field( - default_factory=lambda: Resources.model_validate({"custom": {}}), + {"custom": {}}, description="Available resources in the compute resource set.", + validate_default=True, ) available_applications: list[ScalerApplicationInfo] | None = Field( - default_factory=list, + [], description="List of available applications.", title="Available Applications", + validate_default=True, ) evaluator_requirements_matching: bool | None = Field( False, @@ -987,9 +1022,7 @@ class EvaluatorConfiguration(DictModel): task_directory_cleanup: TaskDirectoryCleanup | None = Field( None, title="Task Directory Cleanup" ) - resources: EvaluatorResources | None = Field( - default_factory=lambda: EvaluatorResources.model_validate({"custom": {}}) - ) + resources: EvaluatorResources | None = Field({"custom": {}}, validate_default=True) task_manager_type: str | None = Field(None, title="Task Manager Type") loop_interval: float | None = Field( 5.0, @@ -1002,9 +1035,10 @@ class EvaluatorConfiguration(DictModel): title="Local File Cache", ) applications: list[ApplicationInfo] | None = Field( - default_factory=list, + [], description="List of available applications.", title="Applications", + validate_default=True, ) project_server_select: bool | None = Field( True, @@ -1022,8 +1056,9 @@ class EvaluatorConfiguration(DictModel): title="Project Assignment Mode", ) context: Context | None = Field( - default_factory=lambda: Context.model_validate({"custom": {}, "use_local_scratch": False}), + {"custom": {}, "use_local_scratch": False}, description="Runtime properties to pass to executed tasks.", + validate_default=True, ) @@ -1047,9 +1082,7 @@ class EvaluatorConfigurationUpdate(DictModel): task_directory_cleanup: TaskDirectoryCleanup | None = Field( None, title="Task Directory Cleanup" ) - resources: EvaluatorResources | None = Field( - default_factory=lambda: EvaluatorResources.model_validate({"custom": {}}) - ) + resources: EvaluatorResources | None = Field({"custom": {}}, validate_default=True) name: str | None = Field( None, description="Update the name of the evaluator, which updates the registration.", @@ -1066,7 +1099,10 @@ class EvaluatorConfigurationUpdate(DictModel): title="Local File Cache", ) applications: list[ApplicationInfo] | None = Field( - [], description="List of available applications.", title="Applications" + [], + description="List of available applications.", + title="Applications", + validate_default=True, ) project_list: list[str] | None = Field( None, @@ -1079,8 +1115,9 @@ class EvaluatorConfigurationUpdate(DictModel): title="Project Assignment Mode", ) context: ContextUpdate | None = Field( - default_factory=lambda: ContextUpdate.model_validate({"custom": {}}), + {"custom": {}}, description="Runtime properties to pass to executed tasks.", + validate_default=True, )