Skip to content

Commit f194648

Browse files
committed
Refactor verification functions in verify_graph.py to return error lists
- Updated verification functions to return lists of errors instead of modifying an external list, improving function clarity and usability. - Introduced asyncio.gather for concurrent execution of verification tasks in verify_graph, enhancing performance. - Adjusted function signatures to reflect the new return types, ensuring consistency across the module. These changes streamline the error handling process and optimize the verification workflow.
1 parent 82bee1e commit f194648

1 file changed

Lines changed: 37 additions & 17 deletions

File tree

state-manager/app/tasks/verify_graph.py

Lines changed: 37 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import asyncio
2+
13
from app.models.db.graph_template_model import GraphTemplate, NodeTemplate
24
from app.models.graph_template_validation_status import GraphTemplateValidationStatus
35
from app.models.db.registered_node import RegisteredNode
@@ -7,26 +9,33 @@
79

810
logger = 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-
234249
async 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

Comments
 (0)