1+ import asyncio
2+
13from app .models .db .graph_template_model import GraphTemplate , NodeTemplate
24from app .models .graph_template_validation_status import GraphTemplateValidationStatus
35from app .models .db .registered_node import RegisteredNode
79
810logger = LogsManager ().get_logger ()
911
10- async def verify_nodes_names (nodes : list [NodeTemplate ], errors : list [str ]):
12+ async def verify_nodes_names (nodes : list [NodeTemplate ]) -> list [str ]:
13+ errors = []
1114 for node in nodes :
1215 if node .node_name is None or node .node_name == "" :
13- errors .append (f"Node { node .identifier } has no name" )
16+ errors .append (f"Node { node .identifier } has no name" )
17+ return errors
1418
15- async def verify_nodes_namespace (nodes : list [NodeTemplate ], graph_namespace : str , errors : list [str ]):
19+ async def verify_nodes_namespace (nodes : list [NodeTemplate ], graph_namespace : str ) -> list [str ]:
20+ errors = []
1621 for node in nodes :
1722 if node .namespace != graph_namespace and node .namespace != "exospherehost" :
1823 errors .append (f"Node { node .identifier } has invalid namespace '{ node .namespace } '. Must match graph namespace '{ graph_namespace } ' or use universal namespace 'exospherehost'" )
24+ return errors
1925
20- async def verify_node_exists (nodes : list [NodeTemplate ], database_nodes : list [RegisteredNode ], errors : list [str ]):
26+ async def verify_node_exists (nodes : list [NodeTemplate ], database_nodes : list [RegisteredNode ]) -> list [str ]:
27+ errors = []
2128 template_nodes_set = set ([(node .node_name , node .namespace ) for node in nodes ])
2229 database_nodes_set = set ([(node .name , node .namespace ) for node in database_nodes ])
2330
2431 nodes_not_found = template_nodes_set - database_nodes_set
2532
2633 for node in nodes_not_found :
2734 errors .append (f"Node { node [0 ]} in namespace { node [1 ]} does not exist." )
35+ return errors
2836
29- async def verify_node_identifiers (nodes : list [NodeTemplate ], errors : list [str ]):
37+ async def verify_node_identifiers (nodes : list [NodeTemplate ]) -> list [str ]:
38+ errors = []
3039 identifier_to_nodes = {}
3140
3241 # First pass: collect all nodes by identifier
@@ -54,7 +63,10 @@ async def verify_node_identifiers(nodes: list[NodeTemplate], errors: list[str]):
5463 if next_node not in valid_identifiers :
5564 errors .append (f"Node { node .node_name } in namespace { node .namespace } has a next node { next_node } that does not exist in the graph" )
5665
57- async def verify_secrets (graph_template : GraphTemplate , database_nodes : list [RegisteredNode ], errors : list [str ]):
66+ return errors
67+
68+ async def verify_secrets (graph_template : GraphTemplate , database_nodes : list [RegisteredNode ]) -> list [str ]:
69+ errors = []
5870 required_secrets_set = set ()
5971
6072 for node in database_nodes :
@@ -71,9 +83,10 @@ async def verify_secrets(graph_template: GraphTemplate, database_nodes: list[Reg
7183
7284 for secret_name in missing_secrets_set :
7385 errors .append (f"Secret { secret_name } is required but not present in the graph template" )
74-
86+
87+ return errors
7588
76- async def get_database_nodes (nodes : list [NodeTemplate ], graph_namespace : str ):
89+ async def get_database_nodes (nodes : list [NodeTemplate ], graph_namespace : str ) -> list [ RegisteredNode ] :
7790 graph_namespace_node_names = [
7891 node .node_name for node in nodes if node .namespace == graph_namespace
7992 ]
@@ -91,7 +104,8 @@ async def get_database_nodes(nodes: list[NodeTemplate], graph_namespace: str):
91104 return graph_namespace_database_nodes + exospherehost_database_nodes
92105
93106
94- async def verify_inputs (graph_nodes : list [NodeTemplate ], database_nodes : list [RegisteredNode ], dependency_graph : dict [str , list [str ]], errors : list [str ]):
107+ async def verify_inputs (graph_nodes : list [NodeTemplate ], database_nodes : list [RegisteredNode ], dependency_graph : dict [str , list [str ]]) -> list [str ]:
108+ errors = []
95109 look_up_table = {}
96110 for node in graph_nodes :
97111 look_up_table [node .identifier ] = {"graph_node" : node }
@@ -146,8 +160,10 @@ async def verify_inputs(graph_nodes: list[NodeTemplate], database_nodes: list[Re
146160
147161 except Exception as e :
148162 errors .append (f"Error creating input model for node { node .identifier } : { str (e )} " )
163+
164+ return errors
149165
150- async def build_dependencies_graph (graph_nodes : list [NodeTemplate ]):
166+ async def build_dependencies_graph (graph_nodes : list [NodeTemplate ]) -> dict [ str , set [ str ]] :
151167 dependency_graph = {}
152168 for node in graph_nodes :
153169 dependency_graph [node .identifier ] = set ()
@@ -230,21 +246,25 @@ async def verify_unites(graph_nodes: list[NodeTemplate], dependency_graph: dict
230246 if node .unites .identifier not in dependency_graph [node .identifier ]:
231247 errors .append (f"Node { node .identifier } depends on { node .unites .identifier } which is not a dependency of { node .identifier } " )
232248
233-
234249async def verify_graph (graph_template : GraphTemplate ):
235250 try :
236251 errors = []
237252 database_nodes = await get_database_nodes (graph_template .nodes , graph_template .namespace )
238253
239- await verify_nodes_names (graph_template .nodes , errors )
240- await verify_nodes_namespace (graph_template .nodes , graph_template .namespace , errors )
241- await verify_node_exists (graph_template .nodes , database_nodes , errors )
242- await verify_node_identifiers (graph_template .nodes , errors )
243- await verify_secrets (graph_template , database_nodes , errors )
254+ basic_verify_tasks = [
255+ verify_nodes_names (graph_template .nodes ),
256+ verify_nodes_namespace (graph_template .nodes , graph_template .namespace ),
257+ verify_node_exists (graph_template .nodes , database_nodes ),
258+ verify_node_identifiers (graph_template .nodes ),
259+ verify_secrets (graph_template , database_nodes )
260+ ]
261+ errors .extend (await asyncio .gather (* basic_verify_tasks ))
262+
244263 dependency_graph = await verify_topology (graph_template .nodes , errors )
245264
246265 if dependency_graph is not None and len (errors ) == 0 :
247- await verify_inputs (graph_template .nodes , database_nodes , dependency_graph , errors )
266+ inputs_errors = await verify_inputs (graph_template .nodes , database_nodes , dependency_graph )
267+ errors .extend (inputs_errors )
248268
249269 await verify_unites (graph_template .nodes , dependency_graph , errors )
250270
0 commit comments