@@ -602,6 +602,88 @@ async def check(self) -> ExecutionResult:
602602 error = str (e ),
603603 )
604604
605+ async def check_entities (self , entities : list [str ]) -> ExecutionResult :
606+ """Perform health checks for specific entities by probing their list or get operations.
607+
608+ For each entity, looks up (entity_name, Action.LIST) in the operation index.
609+ If not found, falls back to (entity_name, Action.GET). Runs all probes
610+ concurrently and returns per-entity results.
611+
612+ Args:
613+ entities: List of entity names to check.
614+
615+ Returns:
616+ ExecutionResult with per-entity health check results.
617+ """
618+ logging .debug ("check_entities: probing entities %s" , entities )
619+
620+ standard_handler = next (
621+ (h for h in self ._operation_handlers if isinstance (h , _StandardOperationHandler )),
622+ None ,
623+ )
624+
625+ if standard_handler is None :
626+ entity_results = [
627+ {"entity" : name , "status" : "skipped" , "error" : "No standard handler available" , "checked_action" : None }
628+ for name in entities
629+ ]
630+ return ExecutionResult (
631+ success = not entities ,
632+ data = {"entity_results" : entity_results , "status" : "unhealthy" if entities else "healthy" },
633+ )
634+
635+ tasks = [self ._probe_entity (name , standard_handler ) for name in entities ]
636+ entity_results = await asyncio .gather (* tasks )
637+
638+ all_healthy = all (r ["status" ] == "healthy" for r in entity_results )
639+ failed = [r for r in entity_results if r ["status" ] != "healthy" ]
640+ error = None
641+ if failed :
642+ names = ", " .join (r ["entity" ] for r in failed )
643+ error = f"Entity check failed for: { names } "
644+ return ExecutionResult (
645+ success = all_healthy ,
646+ data = {
647+ "entity_results" : list (entity_results ),
648+ "status" : "healthy" if all_healthy else "unhealthy" ,
649+ },
650+ error = error ,
651+ )
652+
653+ async def _probe_entity (self , entity_name : str , standard_handler : _StandardOperationHandler ) -> dict [str , Any ]:
654+ """Probe a single entity's health by executing its list or get operation."""
655+ endpoint = self ._operation_index .get ((entity_name , Action .LIST ))
656+ action = Action .LIST
657+ if endpoint is None :
658+ endpoint = self ._operation_index .get ((entity_name , Action .GET ))
659+ action = Action .GET
660+ if endpoint is None :
661+ return {
662+ "entity" : entity_name ,
663+ "status" : "failed" ,
664+ "error" : f"Entity '{ entity_name } ' has no list or get operation available for checking" ,
665+ "status_code" : None ,
666+ "checked_action" : None ,
667+ }
668+ try :
669+ params = {"limit" : 1 } if action == Action .LIST else {}
670+ await standard_handler .execute_operation (entity_name , action , params )
671+ return {
672+ "entity" : entity_name ,
673+ "status" : "healthy" ,
674+ "error" : None ,
675+ "status_code" : None ,
676+ "checked_action" : action .value ,
677+ }
678+ except Exception as e :
679+ return {
680+ "entity" : entity_name ,
681+ "status" : "unhealthy" ,
682+ "error" : str (e ),
683+ "status_code" : getattr (e , "status_code" , None ),
684+ "checked_action" : action .value ,
685+ }
686+
605687 async def _execute_operation (
606688 self ,
607689 entity : str ,
0 commit comments