55from typing import Annotated , Any , MutableMapping , TypeVar
66
77from 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+ )
916from pydantic .functional_serializers import PlainSerializer
1017
1118from ..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+
132158class 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+
163224class 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