From a25bbf7a24df81549decc17e1382d6f6e4b5b743 Mon Sep 17 00:00:00 2001 From: Patrick Ogenstad Date: Mon, 5 May 2025 12:59:12 +0200 Subject: [PATCH] Allow recursive convertion to InfrahubNode objects Fixes #389 --- infrahub_sdk/node/node.py | 24 +++++++++++++++++++++++- infrahub_sdk/operation.py | 2 +- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/infrahub_sdk/node/node.py b/infrahub_sdk/node/node.py index 5cb6a99a..d8b8ffbe 100644 --- a/infrahub_sdk/node/node.py +++ b/infrahub_sdk/node/node.py @@ -888,7 +888,12 @@ async def update( await self._process_mutation_result(mutation_name=mutation_name, response=response, timeout=timeout) async def _process_relationships( - self, node_data: dict[str, Any], branch: str, related_nodes: list[InfrahubNode], timeout: int | None = None + self, + node_data: dict[str, Any], + branch: str, + related_nodes: list[InfrahubNode], + timeout: int | None = None, + recursive: bool = False, ) -> None: """Processes the Relationships of a InfrahubNode and add Related Nodes to a list. @@ -907,6 +912,10 @@ async def _process_relationships( client=self._client, branch=branch, data=relation, timeout=timeout ) related_nodes.append(related_node) + if recursive: + await related_node._process_relationships( + node_data=relation, branch=branch, related_nodes=related_nodes, recursive=recursive + ) elif rel and isinstance(rel, RelationshipManager): peers = node_data["node"].get(rel_name, None) if peers and peers["edges"]: @@ -915,6 +924,10 @@ async def _process_relationships( client=self._client, branch=branch, data=peer, timeout=timeout ) related_nodes.append(related_node) + if recursive: + await related_node._process_relationships( + node_data=peer, branch=branch, related_nodes=related_nodes, recursive=recursive + ) async def get_pool_allocated_resources(self, resource: InfrahubNode) -> list[InfrahubNode]: """Fetch all nodes that were allocated for the pool and a given resource. @@ -1416,6 +1429,7 @@ def _process_relationships( branch: str, related_nodes: list[InfrahubNodeSync], timeout: int | None = None, + recursive: bool = False, ) -> None: """Processes the Relationships of a InfrahubNodeSync and add Related Nodes to a list. @@ -1435,6 +1449,10 @@ def _process_relationships( client=self._client, branch=branch, data=relation, timeout=timeout ) related_nodes.append(related_node) + if recursive: + related_node._process_relationships( + node_data=relation, branch=branch, related_nodes=related_nodes, recursive=recursive + ) elif rel and isinstance(rel, RelationshipManagerSync): peers = node_data["node"].get(rel_name) if peers: @@ -1443,6 +1461,10 @@ def _process_relationships( client=self._client, branch=branch, data=peer, timeout=timeout ) related_nodes.append(related_node) + if recursive: + related_node._process_relationships( + node_data=peer, branch=branch, related_nodes=related_nodes, recursive=recursive + ) def get_pool_allocated_resources(self, resource: InfrahubNodeSync) -> list[InfrahubNodeSync]: """Fetch all nodes that were allocated for the pool and a given resource. diff --git a/infrahub_sdk/operation.py b/infrahub_sdk/operation.py index f52db43d..81d11678 100644 --- a/infrahub_sdk/operation.py +++ b/infrahub_sdk/operation.py @@ -72,7 +72,7 @@ async def process_nodes(self, data: dict) -> None: ) self._nodes.append(node) await node._process_relationships( - node_data=result, branch=self.branch_name, related_nodes=self._related_nodes + node_data=result, branch=self.branch_name, related_nodes=self._related_nodes, recursive=True ) for node in self._nodes + self._related_nodes: