Skip to content

Commit a3b2260

Browse files
committed
feat: extend config schema with structured job and resource configs
- Add JobDescriptionConfig with CPU time, priority, and job type constraints - Add InputDataPolicyConfig and ExternalsPolicyConfig - Add ResourcesConfig with Computing.OSCompatibility support - Add field validators for legacy DIRAC CFG format conversion - Ensure platform self-compatibility in OSCompatibility mapping
1 parent 275bc4f commit a3b2260

File tree

1 file changed

+67
-6
lines changed

1 file changed

+67
-6
lines changed

diracx-core/src/diracx/core/config/schema.py

Lines changed: 67 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,14 @@
55
from typing import Annotated, Any, MutableMapping, TypeVar
66

77
from pydantic import BaseModel as _BaseModel
8-
from pydantic import ConfigDict, EmailStr, Field, PrivateAttr, model_validator
8+
from pydantic import (
9+
ConfigDict,
10+
EmailStr,
11+
Field,
12+
PrivateAttr,
13+
field_validator,
14+
model_validator,
15+
)
916
from pydantic.functional_serializers import PlainSerializer
1017

1118
from ..properties import SecurityProperty
@@ -129,19 +136,38 @@ class ServicesConfig(BaseModel):
129136
JobScheduling: JobSchedulingConfig = JobSchedulingConfig()
130137

131138

139+
class JobDescriptionConfig(BaseModel):
140+
DefaultCPUTime: int = 86400
141+
DefaultPriority: int = 1
142+
MinCPUTime: int = 100
143+
MinPriority: int = 0
144+
MaxCPUTime: int = 500000
145+
MaxPriority: int = 10
146+
MaxInputData: int = 100
147+
AllowedJobTypes: list[str] = ["User", "Test", "Hospital"]
148+
149+
150+
class InputDataPolicyConfig(BaseModel):
151+
InputDataModule: str = "LocalInputData"
152+
153+
154+
class ExternalsPolicyConfig(BaseModel):
155+
SoftwareDistModule: str = "LocalSoftwareDist"
156+
157+
132158
class OperationsConfig(BaseModel):
133159
EnableSecurityLogging: bool = False
160+
ExternalsPolicy: ExternalsPolicyConfig = ExternalsPolicyConfig()
161+
InputDataPolicy: InputDataPolicyConfig = InputDataPolicyConfig()
162+
JobDescription: JobDescriptionConfig = JobDescriptionConfig()
134163
Services: ServicesConfig = ServicesConfig()
135164

136165
Cloud: MutableMapping[str, Any] | None = None
137166
DataConsistency: MutableMapping[str, Any] | None = None
138167
DataManagement: MutableMapping[str, Any] | None = None
139168
EMail: MutableMapping[str, Any] | None = None
140-
ExternalsPolicy: MutableMapping[str, Any] | None = None
141169
GaudiExecution: MutableMapping[str, Any] | None = None
142170
Hospital: MutableMapping[str, Any] | None = None
143-
InputDataPolicy: MutableMapping[str, Any] | None = None
144-
JobDescription: MutableMapping[str, Any] | None = None
145171
JobScheduling: MutableMapping[str, Any] | None = None
146172
JobTypeMapping: MutableMapping[str, Any] | None = None
147173
LogFiles: MutableMapping[str, Any] | None = None
@@ -160,15 +186,50 @@ class OperationsConfig(BaseModel):
160186
ResourceStatus: MutableMapping[str, Any] | None = None
161187

162188

189+
class ResourcesComputingConfig(BaseModel):
190+
# TODO: Remove this once the model is extended to support everything
191+
model_config = ConfigDict(extra="ignore", frozen=True)
192+
193+
# TODO: Figure out how to remove this in LHCbDIRAC and then consider
194+
# constraining there to be at least one entry
195+
OSCompatibility: MutableMapping[str, set[str]] = {}
196+
197+
@field_validator("OSCompatibility", mode="before")
198+
@classmethod
199+
def legacy_adaptor_os_compatibility(cls, v: Any) -> Any:
200+
"""Apply transformations to interpret the legacy DIRAC CFG format."""
201+
if not os.environ.get("DIRAC_COMPAT_ENABLE_CS_CONVERSION"):
202+
return v
203+
os_compatibility = v.get("OSCompatibility", {})
204+
for k, v in os_compatibility.items():
205+
os_compatibility[k] = set(v.replace(" ", "").split(","))
206+
return os_compatibility
207+
208+
@field_validator("OSCompatibility")
209+
@classmethod
210+
def ensure_self_compatibility(cls, v: dict[str, set[str]]) -> dict[str, set[str]]:
211+
"""Ensure platforms are compatible with themselves."""
212+
for platform, compatible_platforms in v.items():
213+
compatible_platforms.add(platform)
214+
return v
215+
216+
217+
class ResourcesConfig(BaseModel):
218+
# TODO: Remove this once the model is extended to support everything
219+
model_config = ConfigDict(extra="ignore", frozen=True)
220+
221+
Computing: ResourcesComputingConfig = ResourcesComputingConfig()
222+
223+
163224
class Config(BaseModel):
164-
Registry: MutableMapping[str, RegistryConfig]
165225
DIRAC: DIRACConfig
166226
Operations: MutableMapping[str, OperationsConfig]
227+
Registry: MutableMapping[str, RegistryConfig]
228+
Resources: ResourcesConfig = ResourcesConfig()
167229

168230
LocalSite: Any = None
169231
LogLevel: Any = None
170232
MCTestingDestination: Any = None
171-
Resources: Any = None
172233
Systems: Any | None = None
173234
WebApp: Any = None
174235

0 commit comments

Comments
 (0)