@@ -69,6 +69,26 @@ def is_valid(self) -> bool:
6969 def is_reference (self ) -> bool :
7070 return self .format in [RelationshipDataFormat .ONE_REF , RelationshipDataFormat .MANY_REF ]
7171
72+ def get_context (self , value : Any ) -> dict :
73+ """Return a dict to insert to the context if the relationship is mandatory"""
74+ if self .peer_rel and self .is_mandatory and self .peer_rel .cardinality == "one" :
75+ return {self .peer_rel .name : value }
76+ if self .peer_rel and self .is_mandatory and self .peer_rel .cardinality == "many" :
77+ return {self .peer_rel .name : [value ]}
78+ return {}
79+
80+ def find_matching_relationship (
81+ self , peer_schema : MainSchemaTypesAPI , force : bool = False
82+ ) -> RelationshipSchema | None :
83+ """Find the matching relationship on the other side of the relationship"""
84+ if self .peer_rel and not force :
85+ return self .peer_rel
86+
87+ self .peer_rel = peer_schema .get_matching_relationship (
88+ id = self .rel_schema .identifier or "" , direction = self .rel_schema .direction
89+ )
90+ return self .peer_rel
91+
7292
7393async def get_relationship_info (
7494 client : InfrahubClient , schema : MainSchemaTypesAPI , name : str , value : Any , branch : str | None = None
@@ -202,12 +222,6 @@ async def validate_object(
202222 )
203223 )
204224
205- # If there is a peer relationship, we add a placeholder for the related node
206- if rel_info .peer_rel and rel_info .is_mandatory and rel_info .peer_rel .cardinality == "one" :
207- context [rel_info .peer_rel .name ] = "placeholder"
208- elif rel_info .peer_rel and rel_info .is_mandatory and rel_info .peer_rel .cardinality == "many" :
209- context [rel_info .peer_rel .name ] = ["placeholder" ]
210-
211225 errors .extend (
212226 await cls .validate_related_nodes (
213227 client = client ,
@@ -243,6 +257,10 @@ async def validate_related_nodes(
243257 if isinstance (data , dict ) and rel_info .format == RelationshipDataFormat .ONE_OBJ :
244258 peer_kind = data .get ("kind" ) or rel_info .peer_kind
245259 peer_schema = await client .schema .get (kind = peer_kind , branch = branch )
260+
261+ rel_info .find_matching_relationship (peer_schema = peer_schema )
262+ context .update (rel_info .get_context (value = "placeholder" ))
263+
246264 errors .extend (
247265 await cls .validate_object (
248266 client = client ,
@@ -259,6 +277,9 @@ async def validate_related_nodes(
259277 peer_kind = data .get ("kind" ) or rel_info .peer_kind
260278 peer_schema = await client .schema .get (kind = peer_kind , branch = branch )
261279
280+ rel_info .find_matching_relationship (peer_schema = peer_schema )
281+ context .update (rel_info .get_context (value = "placeholder" ))
282+
262283 for idx , peer_data in enumerate (data ["data" ]):
263284 context ["list_index" ] = idx
264285 errors .extend (
@@ -278,6 +299,10 @@ async def validate_related_nodes(
278299 context ["list_index" ] = idx
279300 peer_kind = item .get ("kind" ) or rel_info .peer_kind
280301 peer_schema = await client .schema .get (kind = peer_kind , branch = branch )
302+
303+ rel_info .find_matching_relationship (peer_schema = peer_schema )
304+ context .update (rel_info .get_context (value = "placeholder" ))
305+
281306 errors .extend (
282307 await cls .validate_object (
283308 client = client ,
0 commit comments