Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions infrahub_sdk/node/node.py
Original file line number Diff line number Diff line change
Expand Up @@ -565,7 +565,7 @@ def _build_rel_query_data(
property: bool,
include_metadata: bool,
) -> dict[str, Any] | None:
if rel_schema.cardinality == "one":
if rel_schema.cardinality == RelationshipCardinality.ONE:
rel_data = RelatedNodeBase._generate_query_data(
peer_data=peer_data, property=property, include_metadata=include_metadata
)
Expand All @@ -578,7 +578,7 @@ def _build_rel_query_data(
rel_data["node"] = {}
rel_data["node"][f"...on {rel_schema.peer}"] = data_node
return rel_data
if rel_schema.cardinality == "many":
if rel_schema.cardinality == RelationshipCardinality.MANY:
return RelationshipManagerBase._generate_query_data(
peer_data=peer_data, property=property, include_metadata=include_metadata
)
Expand Down Expand Up @@ -643,7 +643,7 @@ def _init_relationships(self, data: dict | RelatedNode | None = None) -> None:
for rel_schema in self._schema.relationships:
rel_data = data.get(rel_schema.name, None) if isinstance(data, dict) else None

if rel_schema.cardinality == "one":
if rel_schema.cardinality == RelationshipCardinality.ONE:
if isinstance(rel_data, RelatedNode):
peer_id_data: dict[str, Any] = {
key: value
Expand Down Expand Up @@ -1460,7 +1460,7 @@ def _init_relationships(self, data: dict | None = None) -> None:
for rel_schema in self._schema.relationships:
rel_data = data.get(rel_schema.name, None) if isinstance(data, dict) else None

if rel_schema.cardinality == "one":
if rel_schema.cardinality == RelationshipCardinality.ONE:
if isinstance(rel_data, RelatedNodeSync):
peer_id_data: dict[str, Any] = {
key: value
Expand Down
3 changes: 2 additions & 1 deletion infrahub_sdk/protocols_generator/generator.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
NodeSchema,
NodeSchemaAPI,
ProfileSchemaAPI,
RelationshipCardinality,
RelationshipSchemaAPI,
TemplateSchemaAPI,
)
Expand Down Expand Up @@ -128,7 +129,7 @@ def _jinja2_filter_render_relationship(value: RelationshipSchemaAPI, sync: bool
cardinality = value.cardinality

type_ = "RelatedNode"
if cardinality == "many":
if cardinality == RelationshipCardinality.MANY:
type_ = "RelationshipManager"

if sync:
Expand Down
4 changes: 2 additions & 2 deletions infrahub_sdk/schema/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -217,10 +217,10 @@ def generate_payload_create(
elif key in schema.relationship_names:
rel = schema.get_relationship(name=key)
if rel:
if rel.cardinality == "one":
if rel.cardinality == RelationshipCardinality.ONE:
obj_data[key] = {"id": str(value)}
obj_data[key].update(item_metadata)
elif rel.cardinality == "many":
elif rel.cardinality == RelationshipCardinality.MANY:
obj_data[key] = [{"id": str(item)} for item in value]
for item in obj_data[key]:
item.update(item_metadata)
Expand Down
23 changes: 13 additions & 10 deletions infrahub_sdk/spec/object.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
from pydantic import BaseModel, Field

from ..exceptions import ObjectValidationError, ValidationError
from ..schema import GenericSchemaAPI, RelationshipKind, RelationshipSchema
from ..schema import GenericSchemaAPI, RelationshipCardinality, RelationshipKind, RelationshipSchema
from ..utils import is_valid_uuid
from ..yaml import InfrahubFile, InfrahubFileKind
from .models import InfrahubObjectParameters
Expand Down Expand Up @@ -102,7 +102,10 @@ def is_mandatory(self) -> bool:
# For hierarchical node, currently the relationship to the parent is always optional in the schema even if it's mandatory
# In order to build the tree from top to bottom, we need to consider it as mandatory
# While it should technically work bottom-up, it created some unexpected behavior while loading the menu
if self.peer_rel.cardinality == "one" and self.peer_rel.kind == RelationshipKind.HIERARCHY:
if (
self.peer_rel.cardinality == RelationshipCardinality.ONE
and self.peer_rel.kind == RelationshipKind.HIERARCHY
):
return True
return not self.peer_rel.optional

Expand All @@ -116,9 +119,9 @@ def is_reference(self) -> bool:

def get_context(self, value: Any) -> dict:
"""Return a dict to insert to the context if the relationship is mandatory"""
if self.peer_rel and self.is_mandatory and self.peer_rel.cardinality == "one":
if self.peer_rel and self.is_mandatory and self.peer_rel.cardinality == RelationshipCardinality.ONE:
return {self.peer_rel.name: value}
if self.peer_rel and self.is_mandatory and self.peer_rel.cardinality == "many":
if self.peer_rel and self.is_mandatory and self.peer_rel.cardinality == RelationshipCardinality.MANY:
return {self.peer_rel.name: [value]}
return {}

Expand Down Expand Up @@ -162,21 +165,21 @@ async def get_relationship_info(
id=rel_schema.identifier or "", direction=rel_schema.direction
)

if rel_schema.cardinality == "one" and isinstance(value, list):
if rel_schema.cardinality == RelationshipCardinality.ONE and isinstance(value, list):
# validate the list is composed of string
if validate_list_of_scalars(value):
info.format = RelationshipDataFormat.ONE_REF
else:
info.reason_relationship_not_valid = "Too many objects provided for a relationship of cardinality one"

elif rel_schema.cardinality == "one" and isinstance(value, str):
elif rel_schema.cardinality == RelationshipCardinality.ONE and isinstance(value, str):
info.format = RelationshipDataFormat.ONE_REF

elif rel_schema.cardinality == "one" and isinstance(value, dict) and "data" in value:
elif rel_schema.cardinality == RelationshipCardinality.ONE and isinstance(value, dict) and "data" in value:
info.format = RelationshipDataFormat.ONE_OBJ

elif (
rel_schema.cardinality == "many"
rel_schema.cardinality == RelationshipCardinality.MANY
and isinstance(value, dict)
and "data" in value
and validate_list_of_objects(value["data"])
Expand All @@ -185,11 +188,11 @@ async def get_relationship_info(
# it's helpful if there is only one type of object to manage
info.format = RelationshipDataFormat.MANY_OBJ_DICT_LIST

elif rel_schema.cardinality == "many" and isinstance(value, dict) and "data" not in value:
elif rel_schema.cardinality == RelationshipCardinality.MANY and isinstance(value, dict) and "data" not in value:
info.reason_relationship_not_valid = "Invalid structure for a relationship of cardinality many,"
" either provide a dict with data as a list or a list of objects"

elif rel_schema.cardinality == "many" and isinstance(value, list):
elif rel_schema.cardinality == RelationshipCardinality.MANY and isinstance(value, list):
if validate_list_of_data_dicts(value):
info.format = RelationshipDataFormat.MANY_OBJ_LIST_DICT
elif validate_list_of_hfids(value):
Expand Down
8 changes: 6 additions & 2 deletions infrahub_sdk/transfer/importer/json.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@

from ...exceptions import GraphQLError
from ...node import InfrahubNode, RelatedNode, RelationshipManager
from ...schema import RelationshipCardinality
from ..exceptions import TransferFileNotFoundError
from .interface import ImporterInterface

Expand Down Expand Up @@ -130,11 +131,14 @@ async def update_optional_relationships(self) -> None:
relationship_schema = self.optional_relationships_schemas_by_node_kind[node_kind][relationship_attr]

# Check if we are in a many-many relationship, ignore importing it if it is
if relationship_schema.cardinality == "many":
if relationship_schema.cardinality == RelationshipCardinality.MANY:
if relationship_schema.peer not in self.schemas_by_kind:
continue
for peer_relationship in self.schemas_by_kind[relationship_schema.peer].relationships:
if peer_relationship.cardinality == "many" and peer_relationship.peer == node_kind:
if (
peer_relationship.cardinality == RelationshipCardinality.MANY
and peer_relationship.peer == node_kind
):
ignore = True

if not ignore:
Expand Down