Skip to content

Commit 9d81ab4

Browse files
committed
Add group trackingé
1 parent 9d619b7 commit 9d81ab4

File tree

5 files changed

+101
-4
lines changed

5 files changed

+101
-4
lines changed

backend/infrahub/core/protocols.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -493,6 +493,11 @@ class CoreRepository(LineageOwner, LineageSource, CoreGenericRepository, CoreTas
493493
commit: StringOptional
494494

495495

496+
class CoreRepositoryGroup(CoreGroup):
497+
content: Dropdown
498+
repository: RelationshipManager
499+
500+
496501
class CoreRepositoryValidator(CoreValidator):
497502
repository: RelationshipManager
498503

backend/infrahub/core/schema/definitions/core/__init__.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,13 @@
2828
from .core import core_node, core_task_target
2929
from .generator import core_generator_definition, core_generator_instance
3030
from .graphql_query import core_graphql_query
31-
from .group import core_generator_group, core_graphql_query_group, core_group, core_standard_group
31+
from .group import (
32+
core_generator_group,
33+
core_graphql_query_group,
34+
core_group,
35+
core_repository_group,
36+
core_standard_group,
37+
)
3238
from .ipam import builtin_ip_address, builtin_ip_prefix, builtin_ipam, core_ipam_namespace
3339
from .lineage import lineage_owner, lineage_source
3440
from .menu import generic_menu_item, menu_item
@@ -109,6 +115,7 @@
109115
core_standard_group,
110116
core_generator_group,
111117
core_graphql_query_group,
118+
core_repository_group,
112119
builtin_tag,
113120
core_account,
114121
core_account_token,

backend/infrahub/core/schema/definitions/core/group.py

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
)
55
from infrahub.core.constants import RelationshipCardinality as Cardinality
66
from infrahub.core.constants import RelationshipKind as RelKind
7+
from infrahub.core.schema.dropdown import DropdownChoice
78

89
from ...attribute_schema import AttributeSchema as Attr
910
from ...generic_schema import GenericSchema
@@ -80,6 +81,10 @@
8081
generate_profile=False,
8182
)
8283

84+
# TODO add a CoreRepositoryObjectsGroup, attriute: kind="Objects" or "Menu", relationship: repository
85+
# TODO s'assurer que le client.log.... log bien dans infrahub.tasks
86+
87+
8388
core_graphql_query_group = NodeSchema(
8489
name="GraphQLQueryGroup",
8590
namespace="Core",
@@ -106,3 +111,47 @@
106111
),
107112
],
108113
)
114+
115+
116+
core_repository_group = NodeSchema(
117+
name="RepositoryGroup",
118+
namespace="Core",
119+
description="Group of nodes associated with a given repository.",
120+
include_in_menu=False,
121+
icon="mdi:account-group",
122+
label="Repository Group",
123+
default_filter="name__value",
124+
order_by=["name__value"],
125+
display_labels=["name__value"],
126+
branch=BranchSupportType.AGNOSTIC,
127+
inherit_from=[InfrahubKind.GENERICGROUP],
128+
generate_profile=False,
129+
attributes=[
130+
Attr(
131+
name="content",
132+
kind="Dropdown",
133+
description="The value_match defines how the update will be evaluated, if it has to match the new value, the previous value or both",
134+
choices=[
135+
DropdownChoice(
136+
name="Objects",
137+
label="Objects",
138+
description="Objects",
139+
),
140+
DropdownChoice(
141+
name="Menu",
142+
label="Menu",
143+
description="Menu",
144+
),
145+
],
146+
optional=False,
147+
),
148+
],
149+
relationships=[
150+
Rel(
151+
name="repository",
152+
peer=InfrahubKind.GENERICREPOSITORY,
153+
optional=False,
154+
cardinality=Cardinality.ONE,
155+
),
156+
],
157+
)

backend/infrahub/git/integrator.py

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,8 @@ async def import_objects_from_files(
191191
branch_name=infrahub_branch_name, commit=commit, config_file=config_file
192192
) # type: ignore[misc]
193193

194+
await self.import_objects(branch_name=infrahub_branch_name, commit=commit, config_file=config_file) # type: ignore[misc]
195+
194196
await self.import_all_python_files( # type: ignore[call-overload]
195197
branch_name=infrahub_branch_name, commit=commit, config_file=config_file
196198
) # type: ignore[misc]
@@ -200,7 +202,9 @@ async def import_objects_from_files(
200202
await self.import_artifact_definitions(
201203
branch_name=infrahub_branch_name, commit=commit, config_file=config_file
202204
) # type: ignore[misc]
203-
await self.import_objects(branch_name=infrahub_branch_name, commit=commit, config_file=config_file) # type: ignore[misc]
205+
206+
# TODO: import menu, check def load() in menu.^y + add a deidcated group for menu, work as for objects
207+
# "CoreRepositoryMenuGroup"
204208

205209
except Exception as exc:
206210
sync_status = RepositorySyncStatus.ERROR_IMPORT
@@ -838,16 +842,35 @@ async def _load_objects(
838842
for file in files:
839843
await file.validate_format(client=self.client, branch=branch)
840844
for file in files:
845+
# check if we log by default otherwise log
846+
847+
# TODO: do not create if no hfid/default_filter
841848
await file.process(client=self.client, branch=branch)
842849

843850
@task(name="import-objects", task_run_name="Import Objects", cache_policy=NONE) # type: ignore[arg-type]
844851
async def import_objects(self, branch_name: str, commit: str, config_file: InfrahubRepositoryConfig) -> None:
845852
branch_wt = self.get_worktree(identifier=commit or branch_name)
846853

847854
file_pathes = [branch_wt.directory / obj.file_path for obj in config_file.objects]
848-
await self._load_objects(paths=file_pathes, branch=branch_name)
849855

850-
# TODO attach to a group?
856+
# do not clone for now, assume only one import at a time
857+
if self.client is None:
858+
raise ValueError("Client is not set")
859+
860+
if self.is_read_only:
861+
sdk_repo_obj = await self.client.get(
862+
kind=InfrahubKind.READONLYREPOSITORY, id=str(self.id), raise_when_missing=True
863+
)
864+
else:
865+
sdk_repo_obj = await self.client.get(kind=InfrahubKind.REPOSITORY, id=str(self.id), raise_when_missing=True)
866+
867+
async with self.client.start_tracking(
868+
identifier=f"group-repo-{self.id}",
869+
delete_unused_nodes=True,
870+
group_type="CoreRepositoryGroup",
871+
group_params={"content": "Objects", "repository": sdk_repo_obj},
872+
):
873+
await self._load_objects(paths=file_pathes, branch=branch_name)
851874

852875
@task(name="check-definition-get", task_run_name="Get Check Definition", cache_policy=NONE) # type: ignore[arg-type]
853876
async def get_check_definition(

backend/tests/integration/git/test_repository.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,19 @@ async def test_create_repository(
8383
assert manufacturer_mercedes.name.value == "Mercedes"
8484
assert list((await manufacturer_mercedes.customers.get_peers(db=db)).values())[0].name.value == "Ethan Carter"
8585

86+
repository_group = await NodeManager.get_one_by_default_filter(
87+
db=db,
88+
id=f"group-repo-{repository.id}",
89+
kind="CoreRepositoryGroup",
90+
raise_on_error=True,
91+
prefetch_relationships=True,
92+
)
93+
assert repository_group.content.value == "Objects"
94+
members = (await repository_group.members.get_peers(db=db)).values()
95+
assert len(members) == 4
96+
assert manufacturer_mercedes.id in {m.id for m in members}
97+
assert person_ethan.id in {m.id for m in members}
98+
8699
# TODO add a test with invalid yml file OR invalid order of objects in the yml file, and make sure the repository ends
87100
# up in error import state
88101

0 commit comments

Comments
 (0)