@@ -135,18 +135,18 @@ async def _delete(_: Request, user: base_models.APIUser, resource_pool_id: int,
135135
136136 return "/resource_pools/<resource_pool_id>/classes/<class_id>/cost" , ["DELETE" ], _delete
137137
138+ def _extract_date (self , req : Request , name : str ) -> date | None :
139+ datestr = req .args .get (name )
140+ return datetime .strptime (datestr , "%Y-%m-%d" ) if datestr is not None else None
141+
138142 def get_pool_usage (self ) -> BlueprintFactoryResponse :
139143 """Get usage of a pool."""
140144
141- def extract_date (req : Request , name : str ) -> date | None :
142- datestr = req .args .get (name )
143- return datetime .strptime (datestr , "%Y-%m-%d" ) if datestr is not None else None
144-
145145 @authenticate (self .authenticator )
146146 @validate_db_ids
147147 async def _get (req : Request , user : base_models .APIUser , resource_pool_id : int ) -> HTTPResponse :
148- start_date = extract_date (req , "start_date" )
149- end_date = extract_date (req , "end_date" )
148+ start_date = self . _extract_date (req , "start_date" )
149+ end_date = self . _extract_date (req , "end_date" )
150150 result : model .ResourcePoolUsage | None = None
151151 if start_date :
152152 result = await self .rr_svc .get_for_date (resource_pool_id , user .id or "" , start_date , end_date )
@@ -174,3 +174,42 @@ async def _get(req: Request, user: base_models.APIUser, resource_pool_id: int) -
174174 raise errors .MissingResourceError ()
175175
176176 return "/resource_pools/<resource_pool_id>/usage" , ["GET" ], _get
177+
178+ def get_admin_pool_usage (self ) -> BlueprintFactoryResponse :
179+ """Get usage of a pool."""
180+
181+ @authenticate (self .authenticator )
182+ @only_admins
183+ @validate_db_ids
184+ async def _get (req : Request , user : base_models .APIUser , resource_pool_id : int ) -> HTTPResponse :
185+ start_date = self ._extract_date (req , "start_date" )
186+ end_date = self ._extract_date (req , "end_date" )
187+ user_id = req .args .get ("user_id" )
188+ uid = str (user_id ) if user_id else user .id or ""
189+ result : model .ResourcePoolUsage | None = None
190+ if start_date :
191+ result = await self .rr_svc .get_for_date (resource_pool_id , uid , start_date , end_date )
192+ else :
193+ result = await self .rr_svc .get_running_week (resource_pool_id , uid )
194+ if result :
195+ output = apispec .ResourcePoolUsage (
196+ total_usage = apispec .ResourceUsageSummary (
197+ runtime = result .total_usage .runtime_hours , cost = result .total_usage .cost .value
198+ ),
199+ pool_limits = apispec .ResourcePoolLimits (
200+ pool_id = result .pool_limits .pool_id ,
201+ total_limit = result .pool_limits .total_limit .value ,
202+ user_limit = result .pool_limits .user_limit .value ,
203+ ),
204+ user_usage = apispec .ResourceUsageSummary (
205+ runtime = result .user_usage .runtime_hours , cost = result .user_usage .cost .value
206+ ),
207+ )
208+ return validated_json (
209+ apispec .ResourcePoolUsage ,
210+ output ,
211+ )
212+ else :
213+ raise errors .MissingResourceError ()
214+
215+ return "/resource_pools/<resource_pool_id>/admin_usage" , ["GET" ], _get
0 commit comments