infrahub-server 1.3.2__py3-none-any.whl → 1.3.3__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. infrahub/cli/db.py +194 -13
  2. infrahub/core/branch/enums.py +8 -0
  3. infrahub/core/branch/models.py +28 -5
  4. infrahub/core/branch/tasks.py +5 -7
  5. infrahub/core/diff/coordinator.py +32 -34
  6. infrahub/core/diff/diff_locker.py +26 -0
  7. infrahub/core/graph/__init__.py +1 -1
  8. infrahub/core/initialization.py +4 -3
  9. infrahub/core/merge.py +31 -16
  10. infrahub/core/migrations/graph/__init__.py +24 -0
  11. infrahub/core/migrations/graph/m012_convert_account_generic.py +4 -3
  12. infrahub/core/migrations/graph/m013_convert_git_password_credential.py +4 -3
  13. infrahub/core/migrations/graph/m032_cleanup_orphaned_branch_relationships.py +105 -0
  14. infrahub/core/migrations/graph/m033_deduplicate_relationship_vertices.py +97 -0
  15. infrahub/core/node/__init__.py +3 -0
  16. infrahub/core/node/resource_manager/ip_address_pool.py +5 -3
  17. infrahub/core/node/resource_manager/ip_prefix_pool.py +7 -4
  18. infrahub/core/node/resource_manager/number_pool.py +3 -1
  19. infrahub/core/node/standard.py +4 -0
  20. infrahub/core/query/branch.py +25 -56
  21. infrahub/core/query/node.py +78 -24
  22. infrahub/core/query/relationship.py +11 -8
  23. infrahub/core/relationship/model.py +10 -5
  24. infrahub/dependencies/builder/diff/coordinator.py +3 -0
  25. infrahub/dependencies/builder/diff/locker.py +8 -0
  26. infrahub/graphql/mutations/main.py +7 -2
  27. infrahub/graphql/mutations/tasks.py +2 -0
  28. {infrahub_server-1.3.2.dist-info → infrahub_server-1.3.3.dist-info}/METADATA +1 -1
  29. {infrahub_server-1.3.2.dist-info → infrahub_server-1.3.3.dist-info}/RECORD +35 -30
  30. infrahub_testcontainers/container.py +1 -1
  31. infrahub_testcontainers/docker-compose-cluster.test.yml +3 -0
  32. infrahub_testcontainers/docker-compose.test.yml +1 -0
  33. {infrahub_server-1.3.2.dist-info → infrahub_server-1.3.3.dist-info}/LICENSE.txt +0 -0
  34. {infrahub_server-1.3.2.dist-info → infrahub_server-1.3.3.dist-info}/WHEEL +0 -0
  35. {infrahub_server-1.3.2.dist-info → infrahub_server-1.3.3.dist-info}/entry_points.txt +0 -0
@@ -10,6 +10,7 @@ from typing import TYPE_CHECKING, Any, AsyncIterator, Generator
10
10
  from infrahub import config
11
11
  from infrahub.core import registry
12
12
  from infrahub.core.constants import (
13
+ GLOBAL_BRANCH_NAME,
13
14
  AttributeDBNodeType,
14
15
  RelationshipDirection,
15
16
  RelationshipHierarchyDirection,
@@ -128,7 +129,7 @@ class NodeCreateAllQuery(NodeQuery):
128
129
 
129
130
  raise_error_if_empty: bool = True
130
131
 
131
- async def query_init(self, db: InfrahubDatabase, **kwargs) -> None: # noqa: ARG002
132
+ async def query_init(self, db: InfrahubDatabase, **kwargs) -> None: # noqa: ARG002, PLR0915
132
133
  at = self.at or self.node._at
133
134
  self.params["uuid"] = self.node.id
134
135
  self.params["branch"] = self.branch.name
@@ -151,11 +152,19 @@ class NodeCreateAllQuery(NodeQuery):
151
152
  else:
152
153
  attributes.append(attr_data)
153
154
 
155
+ deepest_branch_name = self.branch.name
156
+ deepest_branch_level = self.branch.hierarchy_level
154
157
  relationships: list[RelationshipCreateData] = []
155
158
  for rel_name in self.node._relationships:
156
159
  rel_manager: RelationshipManager = getattr(self.node, rel_name)
157
160
  for rel in rel_manager._relationships:
158
- relationships.append(await rel.get_create_data(db=db))
161
+ rel_create_data = await rel.get_create_data(db=db, at=at)
162
+ if rel_create_data.peer_branch_level > deepest_branch_level or (
163
+ deepest_branch_name == GLOBAL_BRANCH_NAME and rel_create_data.peer_branch == registry.default_branch
164
+ ):
165
+ deepest_branch_name = rel_create_data.peer_branch
166
+ deepest_branch_level = rel_create_data.peer_branch_level
167
+ relationships.append(rel_create_data)
159
168
 
160
169
  self.params["attrs"] = [attr.model_dump() for attr in attributes]
161
170
  self.params["attrs_iphost"] = [attr.model_dump() for attr in attributes_iphost]
@@ -216,6 +225,8 @@ class NodeCreateAllQuery(NodeQuery):
216
225
  CREATE (a)-[:HAS_VALUE { branch: attr.branch, branch_level: attr.branch_level, status: attr.status, from: $at }]->(av)
217
226
  MERGE (ip:Boolean { value: attr.is_protected })
218
227
  MERGE (iv:Boolean { value: attr.is_visible })
228
+ WITH a, ip, iv
229
+ LIMIT 1
219
230
  CREATE (a)-[:IS_PROTECTED { branch: attr.branch, branch_level: attr.branch_level, status: attr.status, from: $at }]->(ip)
220
231
  CREATE (a)-[:IS_VISIBLE { branch: attr.branch, branch_level: attr.branch_level, status: attr.status, from: $at }]->(iv)
221
232
  FOREACH ( prop IN attr.source_prop |
@@ -230,9 +241,8 @@ class NodeCreateAllQuery(NodeQuery):
230
241
 
231
242
  attrs_iphost_query = """
232
243
  WITH distinct n
233
- UNWIND $attrs_iphost AS attr_iphost
234
- CALL (n, attr_iphost) {
235
- WITH n, attr_iphost AS attr
244
+ UNWIND $attrs_iphost AS attr
245
+ CALL (n, attr) {
236
246
  CREATE (a:Attribute { uuid: attr.uuid, name: attr.name, branch_support: attr.branch_support })
237
247
  CREATE (n)-[:HAS_ATTRIBUTE { branch: attr.branch, branch_level: attr.branch_level, status: attr.status, from: $at }]->(a)
238
248
  MERGE (av:AttributeValue:AttributeIPHost { %(iphost_prop)s })
@@ -241,6 +251,8 @@ class NodeCreateAllQuery(NodeQuery):
241
251
  CREATE (a)-[:HAS_VALUE { branch: attr.branch, branch_level: attr.branch_level, status: attr.status, from: $at }]->(av)
242
252
  MERGE (ip:Boolean { value: attr.is_protected })
243
253
  MERGE (iv:Boolean { value: attr.is_visible })
254
+ WITH a, ip, iv
255
+ LIMIT 1
244
256
  CREATE (a)-[:IS_PROTECTED { branch: attr.branch, branch_level: attr.branch_level, status: attr.status, from: $at }]->(ip)
245
257
  CREATE (a)-[:IS_VISIBLE { branch: attr.branch, branch_level: attr.branch_level, status: attr.status, from: $at }]->(iv)
246
258
  FOREACH ( prop IN attr.source_prop |
@@ -256,9 +268,8 @@ class NodeCreateAllQuery(NodeQuery):
256
268
 
257
269
  attrs_ipnetwork_query = """
258
270
  WITH distinct n
259
- UNWIND $attrs_ipnetwork AS attr_ipnetwork
260
- CALL (n, attr_ipnetwork) {
261
- WITH n, attr_ipnetwork AS attr
271
+ UNWIND $attrs_ipnetwork AS attr
272
+ CALL (n, attr) {
262
273
  CREATE (a:Attribute { uuid: attr.uuid, name: attr.name, branch_support: attr.branch_support })
263
274
  CREATE (n)-[:HAS_ATTRIBUTE { branch: attr.branch, branch_level: attr.branch_level, status: attr.status, from: $at }]->(a)
264
275
  MERGE (av:AttributeValue:AttributeIPNetwork { %(ipnetwork_prop)s })
@@ -267,6 +278,8 @@ class NodeCreateAllQuery(NodeQuery):
267
278
  CREATE (a)-[:HAS_VALUE { branch: attr.branch, branch_level: attr.branch_level, status: attr.status, from: $at }]->(av)
268
279
  MERGE (ip:Boolean { value: attr.is_protected })
269
280
  MERGE (iv:Boolean { value: attr.is_visible })
281
+ WITH a, ip, iv
282
+ LIMIT 1
270
283
  CREATE (a)-[:IS_PROTECTED { branch: attr.branch, branch_level: attr.branch_level, status: attr.status, from: $at }]->(ip)
271
284
  CREATE (a)-[:IS_VISIBLE { branch: attr.branch, branch_level: attr.branch_level, status: attr.status, from: $at }]->(iv)
272
285
  FOREACH ( prop IN attr.source_prop |
@@ -280,16 +293,55 @@ class NodeCreateAllQuery(NodeQuery):
280
293
  }
281
294
  """ % {"ipnetwork_prop": ", ".join(ipnetwork_prop_list)}
282
295
 
296
+ deepest_branch = await registry.get_branch(db=db, branch=deepest_branch_name)
297
+ branch_filter, branch_params = deepest_branch.get_query_filter_path(at=self.at)
298
+ self.params.update(branch_params)
299
+ self.params["global_branch_name"] = GLOBAL_BRANCH_NAME
300
+ self.params["default_branch_name"] = registry.default_branch
301
+
302
+ dest_node_subquery = """
303
+ CALL (rel) {
304
+ MATCH (dest_node:Node { uuid: rel.destination_id })-[r:IS_PART_OF]->(root:Root)
305
+ WHERE (
306
+ // if the relationship is on a branch, use the regular filter
307
+ (rel.peer_branch_level = 2 AND %(branch_filter)s)
308
+ // simplified filter for the global branch
309
+ OR (
310
+ rel.peer_branch_level = 1
311
+ AND rel.peer_branch = $global_branch_name
312
+ AND r.branch = $global_branch_name
313
+ AND r.from <= $at AND (r.to IS NULL or r.to > $at)
314
+ )
315
+ // simplified filter for the default branch
316
+ OR (
317
+ rel.peer_branch_level = 1 AND
318
+ rel.peer_branch = $default_branch_name AND
319
+ r.branch IN [$default_branch_name, $global_branch_name]
320
+ AND r.from <= $at AND (r.to IS NULL or r.to > $at)
321
+ )
322
+ )
323
+ // r.status is a tie-breaker when there are nodes with the same UUID added/deleted at the same time
324
+ ORDER BY r.branch_level DESC, r.from DESC, r.status ASC
325
+ WITH dest_node, r
326
+ LIMIT 1
327
+ WITH dest_node, r
328
+ WHERE r.status = "active"
329
+ RETURN dest_node
330
+ }
331
+ """ % {"branch_filter": branch_filter}
332
+
283
333
  rels_bidir_query = """
284
334
  WITH distinct n
285
335
  UNWIND $rels_bidir AS rel
286
- CALL (n, rel) {
287
- MERGE (d:Node { uuid: rel.destination_id })
336
+ %(dest_node_subquery)s
337
+ CALL (n, rel, dest_node) {
288
338
  CREATE (rl:Relationship { uuid: rel.uuid, name: rel.name, branch_support: rel.branch_support })
289
339
  CREATE (n)-[:IS_RELATED %(rel_prop)s ]->(rl)
290
- CREATE (d)-[:IS_RELATED %(rel_prop)s ]->(rl)
340
+ CREATE (dest_node)-[:IS_RELATED %(rel_prop)s ]->(rl)
291
341
  MERGE (ip:Boolean { value: rel.is_protected })
292
342
  MERGE (iv:Boolean { value: rel.is_visible })
343
+ WITH rl, ip, iv
344
+ LIMIT 1
293
345
  CREATE (rl)-[:IS_PROTECTED { branch: rel.branch, branch_level: rel.branch_level, status: rel.status, from: $at }]->(ip)
294
346
  CREATE (rl)-[:IS_VISIBLE { branch: rel.branch, branch_level: rel.branch_level, status: rel.status, from: $at }]->(iv)
295
347
  FOREACH ( prop IN rel.source_prop |
@@ -301,19 +353,20 @@ class NodeCreateAllQuery(NodeQuery):
301
353
  CREATE (rl)-[:HAS_OWNER { branch: rel.branch, branch_level: rel.branch_level, status: rel.status, from: $at }]->(peer)
302
354
  )
303
355
  }
304
- """ % {"rel_prop": rel_prop_str}
356
+ """ % {"rel_prop": rel_prop_str, "dest_node_subquery": dest_node_subquery}
305
357
 
306
358
  rels_out_query = """
307
359
  WITH distinct n
308
- UNWIND $rels_out AS rel_out
309
- CALL (n, rel_out) {
310
- WITH n, rel_out as rel
311
- MERGE (d:Node { uuid: rel.destination_id })
360
+ UNWIND $rels_out AS rel
361
+ %(dest_node_subquery)s
362
+ CALL (n, rel, dest_node) {
312
363
  CREATE (rl:Relationship { uuid: rel.uuid, name: rel.name, branch_support: rel.branch_support })
313
364
  CREATE (n)-[:IS_RELATED %(rel_prop)s ]->(rl)
314
- CREATE (d)<-[:IS_RELATED %(rel_prop)s ]-(rl)
365
+ CREATE (dest_node)<-[:IS_RELATED %(rel_prop)s ]-(rl)
315
366
  MERGE (ip:Boolean { value: rel.is_protected })
316
367
  MERGE (iv:Boolean { value: rel.is_visible })
368
+ WITH rl, ip, iv
369
+ LIMIT 1
317
370
  CREATE (rl)-[:IS_PROTECTED { branch: rel.branch, branch_level: rel.branch_level, status: rel.status, from: $at }]->(ip)
318
371
  CREATE (rl)-[:IS_VISIBLE { branch: rel.branch, branch_level: rel.branch_level, status: rel.status, from: $at }]->(iv)
319
372
  FOREACH ( prop IN rel.source_prop |
@@ -325,19 +378,20 @@ class NodeCreateAllQuery(NodeQuery):
325
378
  CREATE (rl)-[:HAS_OWNER { branch: rel.branch, branch_level: rel.branch_level, status: rel.status, from: $at }]->(peer)
326
379
  )
327
380
  }
328
- """ % {"rel_prop": rel_prop_str}
381
+ """ % {"rel_prop": rel_prop_str, "dest_node_subquery": dest_node_subquery}
329
382
 
330
383
  rels_in_query = """
331
384
  WITH distinct n
332
- UNWIND $rels_in AS rel_in
333
- CALL (n, rel_in) {
334
- WITH n, rel_in AS rel
335
- MERGE (d:Node { uuid: rel.destination_id })
385
+ UNWIND $rels_in AS rel
386
+ %(dest_node_subquery)s
387
+ CALL (n, rel, dest_node) {
336
388
  CREATE (rl:Relationship { uuid: rel.uuid, name: rel.name, branch_support: rel.branch_support })
337
389
  CREATE (n)<-[:IS_RELATED %(rel_prop)s ]-(rl)
338
- CREATE (d)-[:IS_RELATED %(rel_prop)s ]->(rl)
390
+ CREATE (dest_node)-[:IS_RELATED %(rel_prop)s ]->(rl)
339
391
  MERGE (ip:Boolean { value: rel.is_protected })
340
392
  MERGE (iv:Boolean { value: rel.is_visible })
393
+ WITH rl, ip, iv
394
+ LIMIT 1
341
395
  CREATE (rl)-[:IS_PROTECTED { branch: rel.branch, branch_level: rel.branch_level, status: rel.status, from: $at }]->(ip)
342
396
  CREATE (rl)-[:IS_VISIBLE { branch: rel.branch, branch_level: rel.branch_level, status: rel.status, from: $at }]->(iv)
343
397
  FOREACH ( prop IN rel.source_prop |
@@ -349,7 +403,7 @@ class NodeCreateAllQuery(NodeQuery):
349
403
  CREATE (rl)-[:HAS_OWNER { branch: rel.branch, branch_level: rel.branch_level, status: rel.status, from: $at }]->(peer)
350
404
  )
351
405
  }
352
- """ % {"rel_prop": rel_prop_str}
406
+ """ % {"rel_prop": rel_prop_str, "dest_node_subquery": dest_node_subquery}
353
407
 
354
408
  query = f"""
355
409
  MATCH (root:Root)
@@ -206,16 +206,18 @@ class RelationshipQuery(Query):
206
206
  self.params["source_id"] = self.source_id or self.source.get_id()
207
207
  if source_branch.is_global or source_branch.is_default:
208
208
  source_query_match = """
209
- MATCH (s:Node { uuid: $source_id })
209
+ MATCH (s:Node { uuid: $source_id })-[source_e:IS_PART_OF {branch: $source_branch, status: "active"}]->(:Root)
210
+ WHERE source_e.from <= $at AND (source_e.to IS NULL OR source_e.to > $at)
210
211
  OPTIONAL MATCH (s)-[delete_edge:IS_PART_OF {status: "deleted", branch: $source_branch}]->(:Root)
211
212
  WHERE delete_edge.from <= $at
212
213
  WITH *, s WHERE delete_edge IS NULL
213
214
  """
214
215
  self.params["source_branch"] = source_branch.name
215
- source_filter, source_filter_params = source_branch.get_query_filter_path(
216
- at=self.at, variable_name="r", params_prefix="src_"
217
- )
218
- source_query_match = """
216
+ else:
217
+ source_filter, source_filter_params = source_branch.get_query_filter_path(
218
+ at=self.at, variable_name="r", params_prefix="src_"
219
+ )
220
+ source_query_match = """
219
221
  MATCH (s:Node { uuid: $source_id })
220
222
  CALL (s) {
221
223
  MATCH (s)-[r:IS_PART_OF]->(:Root)
@@ -225,15 +227,16 @@ class RelationshipQuery(Query):
225
227
  LIMIT 1
226
228
  }
227
229
  WITH *, s WHERE s_is_active = TRUE
228
- """ % {"source_filter": source_filter}
229
- self.params.update(source_filter_params)
230
+ """ % {"source_filter": source_filter}
231
+ self.params.update(source_filter_params)
230
232
  self.add_to_query(source_query_match)
231
233
 
232
234
  def add_dest_match_to_query(self, destination_branch: Branch, destination_id: str) -> None:
233
235
  self.params["destination_id"] = destination_id
234
236
  if destination_branch.is_global or destination_branch.is_default:
235
237
  destination_query_match = """
236
- MATCH (d:Node { uuid: $destination_id })
238
+ MATCH (d:Node { uuid: $destination_id })-[dest_e:IS_PART_OF {branch: $destination_branch, status: "active"}]->(:Root)
239
+ WHERE dest_e.from <= $at AND (dest_e.to IS NULL OR dest_e.to > $at)
237
240
  OPTIONAL MATCH (d)-[delete_edge:IS_PART_OF {status: "deleted", branch: $destination_branch}]->(:Root)
238
241
  WHERE delete_edge.from <= $at
239
242
  WITH *, d WHERE delete_edge IS NULL
@@ -63,9 +63,11 @@ class RelationshipCreateData(BaseModel):
63
63
  uuid: str
64
64
  name: str
65
65
  destination_id: str
66
- branch: str | None = None
66
+ branch: str
67
67
  branch_level: int
68
68
  branch_support: str | None = None
69
+ peer_branch: str
70
+ peer_branch_level: int
69
71
  direction: str
70
72
  status: str
71
73
  is_protected: bool
@@ -420,7 +422,7 @@ class Relationship(FlagPropertyMixin, NodePropertyMixin):
420
422
  )
421
423
  await delete_query.execute(db=db)
422
424
 
423
- async def resolve(self, db: InfrahubDatabase) -> None:
425
+ async def resolve(self, db: InfrahubDatabase, at: Timestamp | None = None) -> None:
424
426
  """Resolve the peer of the relationship."""
425
427
 
426
428
  if self._peer is not None:
@@ -470,7 +472,7 @@ class Relationship(FlagPropertyMixin, NodePropertyMixin):
470
472
  if hfid_str:
471
473
  data_from_pool["identifier"] = f"hfid={hfid_str} rel={self.name}"
472
474
 
473
- assigned_peer: Node = await pool.get_resource(db=db, branch=self.branch, **data_from_pool) # type: ignore[attr-defined]
475
+ assigned_peer: Node = await pool.get_resource(db=db, branch=self.branch, at=at, **data_from_pool) # type: ignore[attr-defined]
474
476
  await self.set_peer(value=assigned_peer)
475
477
  self.set_source(value=pool.id)
476
478
 
@@ -526,16 +528,19 @@ class Relationship(FlagPropertyMixin, NodePropertyMixin):
526
528
 
527
529
  return response
528
530
 
529
- async def get_create_data(self, db: InfrahubDatabase) -> RelationshipCreateData:
531
+ async def get_create_data(self, db: InfrahubDatabase, at: Timestamp | None = None) -> RelationshipCreateData:
530
532
  branch = self.get_branch_based_on_support_type()
531
533
 
532
- await self.resolve(db=db)
534
+ await self.resolve(db=db, at=at)
533
535
 
534
536
  peer = await self.get_peer(db=db)
537
+ peer_branch = peer.get_branch()
535
538
  data = RelationshipCreateData(
536
539
  uuid=str(UUIDT()),
537
540
  name=self.schema.get_identifier(),
538
541
  branch=branch.name,
542
+ peer_branch=peer_branch.name,
543
+ peer_branch_level=peer_branch.hierarchy_level,
539
544
  destination_id=peer.id,
540
545
  status="active",
541
546
  direction=self.schema.direction.value,
@@ -1,4 +1,5 @@
1
1
  from infrahub.core.diff.coordinator import DiffCoordinator
2
+ from infrahub.dependencies.builder.diff.locker import DiffLockerDependency
2
3
  from infrahub.dependencies.interface import DependencyBuilder, DependencyBuilderContext
3
4
 
4
5
  from .calculator import DiffCalculatorDependency
@@ -15,6 +16,7 @@ class DiffCoordinatorDependency(DependencyBuilder[DiffCoordinator]):
15
16
  @classmethod
16
17
  def build(cls, context: DependencyBuilderContext) -> DiffCoordinator:
17
18
  return DiffCoordinator(
19
+ db=context.db,
18
20
  diff_repo=DiffRepositoryDependency.build(context=context),
19
21
  diff_calculator=DiffCalculatorDependency.build(context=context),
20
22
  diff_combiner=DiffCombinerDependency.build(context=context),
@@ -23,4 +25,5 @@ class DiffCoordinatorDependency(DependencyBuilder[DiffCoordinator]):
23
25
  labels_enricher=DiffLabelsEnricherDependency.build(context=context),
24
26
  data_check_synchronizer=DiffDataCheckSynchronizerDependency.build(context=context),
25
27
  conflict_transferer=DiffConflictTransfererDependency.build(context=context),
28
+ diff_locker=DiffLockerDependency.build(context=context),
26
29
  )
@@ -0,0 +1,8 @@
1
+ from infrahub.core.diff.diff_locker import DiffLocker
2
+ from infrahub.dependencies.interface import DependencyBuilder, DependencyBuilderContext
3
+
4
+
5
+ class DiffLockerDependency(DependencyBuilder[DiffLocker]):
6
+ @classmethod
7
+ def build(cls, context: DependencyBuilderContext) -> DiffLocker: # noqa: ARG003
8
+ return DiffLocker()
@@ -376,8 +376,13 @@ class InfrahubMutationMixin:
376
376
  return updated_obj, mutation, False
377
377
 
378
378
  try:
379
- dict_data.pop("hfid", "unused") # `hfid` is invalid for creation.
380
- created_obj, mutation = await cls.mutate_create(info=info, data=dict_data, branch=branch)
379
+ # This is a hack to avoid sitatuions where a node has an attribute or relationship called "pop"
380
+ # which would have overridden the `pop` method of the InputObjectType object and as such would have
381
+ # caused an error when trying to call `data.pop("hfid", None)`.
382
+ # TypeError: 'NoneType' object is not callable
383
+ data._pop = dict.pop.__get__(data, dict)
384
+ data._pop("hfid", None) # `hfid` is invalid for creation.
385
+ created_obj, mutation = await cls.mutate_create(info=info, data=data, branch=branch)
381
386
  return created_obj, mutation, True
382
387
  except HFIDViolatedError as exc:
383
388
  # Only the HFID constraint has been violated, it means the node exists and we can update without rerunning constraints
@@ -6,6 +6,7 @@ from infrahub.context import InfrahubContext # noqa: TC001 needed for prefect
6
6
  from infrahub.core import registry
7
7
  from infrahub.core.branch import Branch
8
8
  from infrahub.core.diff.coordinator import DiffCoordinator
9
+ from infrahub.core.diff.diff_locker import DiffLocker
9
10
  from infrahub.core.diff.merger.merger import DiffMerger
10
11
  from infrahub.core.diff.repository.repository import DiffRepository
11
12
  from infrahub.core.merge import BranchMerger
@@ -50,6 +51,7 @@ async def merge_branch_mutation(branch: str, context: InfrahubContext, service:
50
51
  diff_merger=diff_merger,
51
52
  diff_repository=diff_repository,
52
53
  source_branch=obj,
54
+ diff_locker=DiffLocker(),
53
55
  service=service,
54
56
  )
55
57
  candidate_schema = merger.get_candidate_schema()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: infrahub-server
3
- Version: 1.3.2
3
+ Version: 1.3.3
4
4
  Summary: Infrahub is taking a new approach to Infrastructure Management by providing a new generation of datastore to organize and control all the data that defines how an infrastructure should run.
5
5
  License: AGPL-3.0-only
6
6
  Author: OpsMill
@@ -38,7 +38,7 @@ infrahub/branch/triggers.py,sha256=4sywoEX79fY2NkaGe6tTHnmytf4k6gXDm2FJHkkRJOw,7
38
38
  infrahub/cli/__init__.py,sha256=zQjE9zMrwAmk_4qb5mbUgNi06g3HKvrPwQvJLQmv9JY,1814
39
39
  infrahub/cli/constants.py,sha256=CoCeTMnfsA3j7ArdLKLZK4VPxOM7ls17qpxGJmND0m8,129
40
40
  infrahub/cli/context.py,sha256=20CJj_D1VhigR9uhTDPHiVHnV7vzsgK8v-uLKs06kzA,398
41
- infrahub/cli/db.py,sha256=0kBWyzHo6EFnINivClMj0jTBPC_9-RDVeuxrQrRYRws,28472
41
+ infrahub/cli/db.py,sha256=7EEgiqcTtnejeHPC-m5iD4dnmtA22P-JSzvZ9Tcb5ho,36070
42
42
  infrahub/cli/events.py,sha256=nJmowQgTxRs6qaT41A71Ei9jm6qtYaL2amAT5TA1H_k,1726
43
43
  infrahub/cli/git_agent.py,sha256=ajT9-kdd3xLIysOPe8GqZyCDMkpNyhqfWjBg9HPWVcg,5240
44
44
  infrahub/cli/patch.py,sha256=ztOkWyo0l_Wo0WX10bvSqGZibKzowrwx82oi69cjwkY,6018
@@ -60,8 +60,9 @@ infrahub/core/__init__.py,sha256=z6EJBZyCYCBqinoBtX9li6BTBbbGV8WCkE_4CrEsmDA,104
60
60
  infrahub/core/account.py,sha256=s8ZC7J8rtEvQZQjbVuiKMlPhl6aQjtAjbZhBejLC0X8,26182
61
61
  infrahub/core/attribute.py,sha256=stmJ_dOr7rFTXzH80keuE64f6y3K3393GiSYeOaay3s,44257
62
62
  infrahub/core/branch/__init__.py,sha256=h0oIj0gHp1xI-N1cYW8_N6VZ81CBOmLuiUt5cS5nKuk,49
63
- infrahub/core/branch/models.py,sha256=8e0BXwbFV4zHMSpqAp1Zp4L8YlxBs0Mxpl9gMoFGeJ4,19539
64
- infrahub/core/branch/tasks.py,sha256=_5tuv068xczwGYB2MZffPIdchhhgm1ciqOawdIO2pAo,20904
63
+ infrahub/core/branch/enums.py,sha256=vGnaTCzikvMcLikKN25TJ8uCmhnD448dp1ve1_tLjwQ,186
64
+ infrahub/core/branch/models.py,sha256=q8n1KNNPQ3bwz_cMJ_GwGsjF1FPcpazwdUYr6x4Gg-w,20296
65
+ infrahub/core/branch/tasks.py,sha256=cbTNpie9j7YROT2ZlHoSmI6cO-j_3SwAxSo5soa-rG0,20788
65
66
  infrahub/core/changelog/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
66
67
  infrahub/core/changelog/diff.py,sha256=0BxCpsgJ-38x5BBz5XDtAvc9FPy82M0NlzXl8nQ-c70,13752
67
68
  infrahub/core/changelog/models.py,sha256=UgfJdOFUkMmjeUKe1mPCO7WE3jNENw0UJU3LWFf20HQ,29920
@@ -85,8 +86,9 @@ infrahub/core/diff/combiner.py,sha256=qL4WQsphB2sVnncgskSG_QcJBqBHjaK0vWU_apeTn-
85
86
  infrahub/core/diff/conflict_transferer.py,sha256=LZCuS9Dbr4yBf-bd3RF-9cPnaOvVWiU3KBmmwxbRZl0,3968
86
87
  infrahub/core/diff/conflicts_enricher.py,sha256=x6qiZOXO2A3BQ2Fm78apJ4WA7HLzPO84JomJfcyuyDg,12552
87
88
  infrahub/core/diff/conflicts_extractor.py,sha256=HysGoyNy9qMxfQ0Lh4AVZsRpHUBpezQNUa8cteVLb2k,9715
88
- infrahub/core/diff/coordinator.py,sha256=wlQSnjuBQ-N6b3wH7t2rBsVnFJb0ACgvKCApBCpIlvw,27405
89
+ infrahub/core/diff/coordinator.py,sha256=vWOkxMof3oyUH_ulR37wV1hFbFNS5_NZWdyYgGUY7F4,27376
89
90
  infrahub/core/diff/data_check_synchronizer.py,sha256=HcbYEIe-70MBiSR6P0AmAwgY9aFxYCJktxOiRcJaxj8,9241
91
+ infrahub/core/diff/diff_locker.py,sha256=b4F0rUQln1iK2zwMrJ-2l-1cM782HFut7wUgqZ63W1g,1066
90
92
  infrahub/core/diff/enricher/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
91
93
  infrahub/core/diff/enricher/aggregated.py,sha256=-LnAeNKDo6mifjL3d3ylCg1A9dTZJBySngWPeF7DfrY,793
92
94
  infrahub/core/diff/enricher/cardinality_one.py,sha256=dKgoc0-9RwXG7N1zQc3S49eNZokvi5NzH7YFF3ag4RQ,6796
@@ -133,11 +135,11 @@ infrahub/core/diff/repository/deserializer.py,sha256=bhN9ao8HxqKyRz273QGLNV9z9_S
133
135
  infrahub/core/diff/repository/repository.py,sha256=x3QP9VmBVYBOVtf3IZUyzXqCd8sSfmHTqVoYlAOdGao,26006
134
136
  infrahub/core/diff/tasks.py,sha256=7_k-ZNcJZsiDp-xCZvCQfPJjg0xRxpaGTiVVNuRPfBI,3322
135
137
  infrahub/core/enums.py,sha256=qGbhRVoH43Xi0iDkUfWdQiKapJbLT9UKsCobFk_paIk,491
136
- infrahub/core/graph/__init__.py,sha256=BGr-0-sGLkh6KZu0KVKYgP5KJXbAfOfNoaKpB2168Cg,19
138
+ infrahub/core/graph/__init__.py,sha256=m7vJ3Rt8r-fp5kVRMnaC3wx0irufSEsanqxvUo7-bXc,19
137
139
  infrahub/core/graph/constraints.py,sha256=lmuzrKDFoeSKRiLtycB9PXi6zhMYghczKrPYvfWyy90,10396
138
140
  infrahub/core/graph/index.py,sha256=IHLP-zPRp7HJYLGHMRDRXQp8RC69ztP10Tr5NcL2j4Y,1736
139
141
  infrahub/core/graph/schema.py,sha256=FmEPPb1XOFv3nnS_XJCuUqlp8HsStX5A2frHjlhoqvE,10105
140
- infrahub/core/initialization.py,sha256=6xbY4D17hnnriycBud4JcLDUB5e-pJJJ-z6H-77xv8w,20730
142
+ infrahub/core/initialization.py,sha256=2lHOS9U9H567HiJlEgblEUE-cEH9VDfu1tgw_hBeb5c,20815
141
143
  infrahub/core/integrity/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
142
144
  infrahub/core/integrity/object_conflict/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
143
145
  infrahub/core/integrity/object_conflict/conflict_recorder.py,sha256=gDOx-Ohle0GxfsNm-FEaBMipaQLMxMVg3BoAHEhuK5E,6125
@@ -150,9 +152,9 @@ infrahub/core/ipam/size.py,sha256=Iu7cVvN9MkilyG_AGvYm3g3dSDesKRVdDh_AKH7yAqk,61
150
152
  infrahub/core/ipam/tasks.py,sha256=TUoP6WZjQkd7DdGLxKnBVVH4SxTHkH2xmJCU8nRWqH8,1483
151
153
  infrahub/core/ipam/utilization.py,sha256=d-zpXCaWsHgJxBLopCDd7y4sJYvHcIzzpYhbTMIgH74,6733
152
154
  infrahub/core/manager.py,sha256=NaUuSY7Veesa67epQRuQ2TJD0-ooUSnvNRIUZCntV3g,47576
153
- infrahub/core/merge.py,sha256=bZvToLKyphJlWMbQAzGuSHcrG2DfeqL69KSfqb1wWdc,10430
155
+ infrahub/core/merge.py,sha256=2TiPC3fAHkhZCl8RARPzLj_Us47OBGHAp6txgCbWopU,11238
154
156
  infrahub/core/migrations/__init__.py,sha256=syPb3-Irf11dXCHgbT0UdmTnEBbpf4wXJ3m8ADYXDpk,1175
155
- infrahub/core/migrations/graph/__init__.py,sha256=jf-xSA-9fSQAQYESBhnPIXCM60gCALgLrzxWPyAo2_o,2945
157
+ infrahub/core/migrations/graph/__init__.py,sha256=bSl8EKD5eeWeXdcGoWT50AK4K-tIptr90l3cX51Ae3w,3808
156
158
  infrahub/core/migrations/graph/m001_add_version_to_graph.py,sha256=YcLN6cFjE6IGheXR4Ujb6CcyY8bJ7WE289hcKJaENOc,1515
157
159
  infrahub/core/migrations/graph/m002_attribute_is_default.py,sha256=wB6f2N_ChTvGajqHD-OWCG5ahRMDhhXZuwo79ieq_II,1036
158
160
  infrahub/core/migrations/graph/m003_relationship_parent_optional.py,sha256=Aya-s98XfE9C7YluOwEjilwgnjaBnZxp27w_Xdv_NmU,2330
@@ -164,8 +166,8 @@ infrahub/core/migrations/graph/m008_add_human_friendly_id.py,sha256=7zswLvod5iTp
164
166
  infrahub/core/migrations/graph/m009_add_generate_profile_attr.py,sha256=7FfjKyVYOebU51SeRtRYkTWKX26SBQx2dfofi7TiQQ8,1346
165
167
  infrahub/core/migrations/graph/m010_add_generate_profile_attr_generic.py,sha256=M4Orq480PzwBEz85QZqdBh-1arJdIwXNwnPA6cWy5Yg,1366
166
168
  infrahub/core/migrations/graph/m011_remove_profile_relationship_schema.py,sha256=TYQ1jXNucLIBbqLS35nUb_72OmMspXexSSW83Ax0oEw,1980
167
- infrahub/core/migrations/graph/m012_convert_account_generic.py,sha256=FZWv-axVbhq86-3l-T8TLnzW7IW2rHLbkgAEb5ol-6A,11001
168
- infrahub/core/migrations/graph/m013_convert_git_password_credential.py,sha256=Vq9jH4NK4LNH__2c_2wCRIHZg17-nxhfLB0CiMSdmNk,12734
169
+ infrahub/core/migrations/graph/m012_convert_account_generic.py,sha256=NT7JI47xWaWf8zLVyw4LE8uyjjdMQGui_7lqt8xrvlI,11086
170
+ infrahub/core/migrations/graph/m013_convert_git_password_credential.py,sha256=6OM7gKbjRXz9yDxFUXKsG1uv-0B9u7KrwIQAO_D0MHA,12819
169
171
  infrahub/core/migrations/graph/m014_remove_index_attr_value.py,sha256=Amds1gl8YtNIekU0tSXpHzdfk8UFqChC2LOLfnQ1YTM,1441
170
172
  infrahub/core/migrations/graph/m015_diff_format_update.py,sha256=fMnUja-VgKbCxtx4Rh3PnA_s3iidaYunJWEkw0AD51w,1169
171
173
  infrahub/core/migrations/graph/m016_diff_delete_bug_fix.py,sha256=FpeGlCdRN8why_6P8ijR4-hFTbE-m95lDNfBwNet1TU,1177
@@ -184,6 +186,8 @@ infrahub/core/migrations/graph/m028_delete_diffs.py,sha256=c2FyUkbeuXfmsNxzcG11b
184
186
  infrahub/core/migrations/graph/m029_duplicates_cleanup.py,sha256=DpOwTMzkdi9-kha-UI6DzzJ_6qWen9kdCl_6j2IimV4,28278
185
187
  infrahub/core/migrations/graph/m030_illegal_edges.py,sha256=Saz7QmUqwuLiBtSBdQf54E1Bj3hz0k9KAOQ-pwPBH4g,2797
186
188
  infrahub/core/migrations/graph/m031_check_number_attributes.py,sha256=s3sVoKIkrZAMVZtWWH8baJW42UCAePp5nMUKy5FDSiM,4944
189
+ infrahub/core/migrations/graph/m032_cleanup_orphaned_branch_relationships.py,sha256=AEc91iCtHWsNvhSuqZGLAn7wL5FWhiqM73OSwIeB7_0,3535
190
+ infrahub/core/migrations/graph/m033_deduplicate_relationship_vertices.py,sha256=EHsNyYEPYzqMybgrMefvE9tw-WUWmnh9ZF8FMVRl2wQ,3735
187
191
  infrahub/core/migrations/query/__init__.py,sha256=JoWOUWlV6IzwxWxObsfCnAAKUOHJkE7dZlOsfB64ZEo,876
188
192
  infrahub/core/migrations/query/attribute_add.py,sha256=LlhkIfVOR3TFSUJEV_4kU5JBKXsWwTsRiX1ySUPe4TU,3655
189
193
  infrahub/core/migrations/query/attribute_rename.py,sha256=onb9Nanht1Tz47JgneAcFsuhqqvPS6dvI2nNjRupLLo,6892
@@ -202,7 +206,7 @@ infrahub/core/migrations/schema/placeholder_dummy.py,sha256=3T3dBwC_ZyehOJr2KRKF
202
206
  infrahub/core/migrations/schema/tasks.py,sha256=x6c_5N0pcQ_lTH5Vaqg2_MwlQ08I35BdX-8NhRDozBE,4165
203
207
  infrahub/core/migrations/shared.py,sha256=e7HEBijWhG46UN8ODjSmxvGeK8KAQ3Twnj2q1dvb2m0,6983
204
208
  infrahub/core/models.py,sha256=aqsqO2cP0MndeX6KZk4NEBmeIy6dE7Ob9UqsmjTIAtA,26149
205
- infrahub/core/node/__init__.py,sha256=4of1tA26-EV8FOubg-rhBFU9wkJ0BBipePnnvx1vi_8,41738
209
+ infrahub/core/node/__init__.py,sha256=2kwQEV4yV71WPgFF88B1JsHaoIjZL_kry8Oc_SQaci4,41803
206
210
  infrahub/core/node/base.py,sha256=BAowVRCK_WC50yXym1kCyUppJDJnrODGU5uoj1s0Yd4,2564
207
211
  infrahub/core/node/constraints/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
208
212
  infrahub/core/node/constraints/attribute_uniqueness.py,sha256=9MThTmuqZ7RgK71ZZARlw1k1x3ARn1U67g2_Gatd6rE,2099
@@ -213,22 +217,22 @@ infrahub/core/node/delete_validator.py,sha256=mj_HQXkTeP_A3po65-R5bCJnDM9CmFFmcU
213
217
  infrahub/core/node/ipam.py,sha256=NWb3TUlVQOGAzq1VvDwISLh61HML0jnalsJ7QojqGwQ,2669
214
218
  infrahub/core/node/permissions.py,sha256=uQzQ62IHcSly6fzPre0nQzlrkCIKzH4HyQkODKB3ZWM,2207
215
219
  infrahub/core/node/resource_manager/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
216
- infrahub/core/node/resource_manager/ip_address_pool.py,sha256=-UQT5kaXSNK-sp7KnT0lsqOg1G3P1uFX0zX5OcHzj48,4831
217
- infrahub/core/node/resource_manager/ip_prefix_pool.py,sha256=HRonATGel6Hk8svPv_I_OZx3VY33nx5jEkWsLbwpQaU,5048
218
- infrahub/core/node/resource_manager/number_pool.py,sha256=XGzFYdodQ3ZZmia2hxHLEzfPJMAEVuj9PKgSeThmsYw,3837
219
- infrahub/core/node/standard.py,sha256=Cfbq01InTVRUpp9l4R3nxn_tlX6V3HchjEJ4kSxjiZM,7170
220
+ infrahub/core/node/resource_manager/ip_address_pool.py,sha256=i7N6zEsvJQr1GUi9AH2Cj5HrrII04NNNwd15fgfGSw0,4939
221
+ infrahub/core/node/resource_manager/ip_prefix_pool.py,sha256=B-9lyqLlVsgDHIEvs9MP3-xb_GqMuF-khdCmRbGVjU4,5173
222
+ infrahub/core/node/resource_manager/number_pool.py,sha256=ifmvEhpqvtVpKAlQkam5A9qGualECwiVtCAFnzQVpAY,3931
223
+ infrahub/core/node/standard.py,sha256=gvAY-1UWj4lUc8tqVZ8AqOFhCR5rhR--gI25g5AOD8o,7284
220
224
  infrahub/core/path.py,sha256=CTSnW6OcvnGNqTcOUZcVOMDSB4PLmeGYpY9U84uv9r8,6181
221
225
  infrahub/core/property.py,sha256=rwsqeaIvCMkHfJYl4WfsNPAS7KS0POo5rAN7vAprXGA,5102
222
226
  infrahub/core/protocols.py,sha256=BDXKAT4QxMbPFnuRqIdhGJB8VY5jPpCkqdGK_li9fFU,12282
223
227
  infrahub/core/protocols_base.py,sha256=cEi6giHtEUmaD0JWfDfWHJhEv_6wjaBA3oJRJCbvc6Q,3411
224
228
  infrahub/core/query/__init__.py,sha256=2qIMaODLwJ6pK6BUd5vODTlA15Aecf5I8_-J44UlCso,23089
225
229
  infrahub/core/query/attribute.py,sha256=DzwbElgTaZs6-nBYGmnDpBr9n0lmUPK3p7eyI30Snh8,11783
226
- infrahub/core/query/branch.py,sha256=Fqycgk8kzhmc1H_-gfiw3c-ZjNjAHw64XU7OQUkhDi0,4976
230
+ infrahub/core/query/branch.py,sha256=B3QEqpwbJrs_8juWQPaHrdwLNJR-1tSkvMuixCFFdt4,3680
227
231
  infrahub/core/query/delete.py,sha256=7tPP1qtNV6QGYtmgE1RKsuQ9oxENnMTVkttLvJ2PiKg,1927
228
232
  infrahub/core/query/diff.py,sha256=DOtPHIu45Yp8wvj8wp16me9E3AK7wVcVfzS2_LIZn2k,35952
229
233
  infrahub/core/query/ipam.py,sha256=0glfVQmcKqMvNyK4GU_zRl2O9pjl7JBeavyE8VC-De4,28234
230
- infrahub/core/query/node.py,sha256=yEDRmEsVUttO7CXNCXnRK0p98wmUHqwybavJS4gfOAo,65140
231
- infrahub/core/query/relationship.py,sha256=WYViWg8tZh_39w2SDtRZnXFNtfcbSQam2h9_HLHs1e4,47521
234
+ infrahub/core/query/node.py,sha256=Rq0jR8Pbs7rPkPMCXnwHFp5Dcl8iLpgrFl4UFRfJ5is,67646
235
+ infrahub/core/query/relationship.py,sha256=B0nmXq12XPm-_caCEPq7TpARFwLR9__Io7Hffgm7bfM,47876
232
236
  infrahub/core/query/resource_manager.py,sha256=wT1sfY8A3E60jBVIB4UCE5lkOeNINnvE-XIbmZAJ8C8,12713
233
237
  infrahub/core/query/standard_node.py,sha256=mPBXyqk4RzoWRUX4NoojoVi8zk-sJ03GmzmUaWqOgSI,4825
234
238
  infrahub/core/query/subquery.py,sha256=UE071w3wccdU_dtKLV-7mdeQ53DKXjPmNxDV0zd5Tpg,7588
@@ -244,7 +248,7 @@ infrahub/core/relationship/constraints/peer_kind.py,sha256=Bropiav4y6r0iU2KfWJ_k
244
248
  infrahub/core/relationship/constraints/peer_parent.py,sha256=z7elpC8xS_ovAF28Haq-RNpFtTEiUehzowiDgYGT68U,2343
245
249
  infrahub/core/relationship/constraints/peer_relatives.py,sha256=Ye79l7njaWxZkU2chTOaptIjvKBIawsNCl0IQxCTDtM,2737
246
250
  infrahub/core/relationship/constraints/profiles_kind.py,sha256=nEZPGtGcmelZ1Nb8EPcQ-7_zCLCNIYwwWbU6C9fLj5E,2464
247
- infrahub/core/relationship/model.py,sha256=CiSJn6uGBuDrdP4K1Kl0w_A6Lq_FLoNZH4ksssZnXMM,47004
251
+ infrahub/core/relationship/model.py,sha256=YGoC-aJm5vtnSAxrpkJbPgHZ3JjFEfoRTBAwI2co458,47251
248
252
  infrahub/core/root.py,sha256=8ZLSOtnmjQcrjqX2vxNO-AGopEUArmBPo_X5NeZBdP0,416
249
253
  infrahub/core/schema/__init__.py,sha256=Q8kzfcX7zhpHThTBoQMMjcXG95DdHcfOWT4poS0QJEY,4035
250
254
  infrahub/core/schema/attribute_parameters.py,sha256=-c8Gh8mHaQk6rZXvBz7VcicRQ8l1Ijmk3BxoxPFAQrc,6336
@@ -378,7 +382,7 @@ infrahub/dependencies/builder/diff/combiner.py,sha256=lD8qWsIAvNO9XnT1hI13E4HYzc
378
382
  infrahub/dependencies/builder/diff/conflict_transferer.py,sha256=faslY7GQsx1MekKgluq4z8MbtWbK_Zn5HuPzFWTAaH8,490
379
383
  infrahub/dependencies/builder/diff/conflicts_enricher.py,sha256=8SpiV01TK3oPK0kujUHrj7cqc-CGecD7nVCrFCZ05mE,379
380
384
  infrahub/dependencies/builder/diff/conflicts_extractor.py,sha256=LL_Tvsp-I6R1q9IxCB9OhsF4FJV29PylUSGtLGLGEDQ,398
381
- infrahub/dependencies/builder/diff/coordinator.py,sha256=7Z4SwtkKicZLnWQl_sZFKpHkSWqa1co_ijsBExWlVQo,1479
385
+ infrahub/dependencies/builder/diff/coordinator.py,sha256=lKxqMLEr-NubbdcN5J0C9jFIdhqHE4Z2NtQxlXwQoo8,1650
382
386
  infrahub/dependencies/builder/diff/data_check_conflict_recorder.py,sha256=ABMNwa0H6uo-WW_EjhFXMEdFkIJ2e6cBY9yPuiGbhUE,683
383
387
  infrahub/dependencies/builder/diff/data_check_synchronizer.py,sha256=k8mc4yAd7hczXajaMfw9yQ04b3qtqD1Jm5G4uDbmNNc,890
384
388
  infrahub/dependencies/builder/diff/deserializer.py,sha256=bC4ixLHGFtvIPKcSZpKwyGL9HjmS9ZSnjbMjJm4fT50,518
@@ -391,6 +395,7 @@ infrahub/dependencies/builder/diff/enricher/labels.py,sha256=EZy4OWEGbb1OUhARD0S
391
395
  infrahub/dependencies/builder/diff/enricher/path_identifier.py,sha256=Pv31HAzacLkkV1p5lra5Kg9epAWp_uTjLVAqAMCpEUw,423
392
396
  infrahub/dependencies/builder/diff/enricher/summary_counts.py,sha256=_UDSkEC1VHeL2-6Ra4DdOoklHEu_xmAI8-119V8Y_cU,420
393
397
  infrahub/dependencies/builder/diff/ipam_diff_parser.py,sha256=ZFEMMXWe0x8gr2gyPFuHfto9DtZZSUbZisragYKOhvs,639
398
+ infrahub/dependencies/builder/diff/locker.py,sha256=_3OgiDyBh3MNH5wKOQvTKT17lXyy09KlE7QmGvVSU5I,333
394
399
  infrahub/dependencies/builder/diff/parent_node_adder.py,sha256=-2xmB8SDPwqeCFGQMt8lQ-NVNFPzQKtdihFXG6lw4e8,384
395
400
  infrahub/dependencies/builder/diff/repository.py,sha256=Z3-61TcDJyl8Am7yD-h5a0S0A6aTXl2asDnMKqE3oBE,478
396
401
  infrahub/dependencies/builder/ip/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -471,7 +476,7 @@ infrahub/graphql/mutations/diff_conflict.py,sha256=JngQfyKXCVlmtlqQ_VyabmrOEDOEK
471
476
  infrahub/graphql/mutations/generator.py,sha256=Ulw4whZm8Gc8lJjwfUFoFSsR0cOUliFKl87Oca4B9O0,3579
472
477
  infrahub/graphql/mutations/graphql_query.py,sha256=mp_O2byChneCihUrEAFEiIAgJ1gW9WrgtwPetUQmkJw,3562
473
478
  infrahub/graphql/mutations/ipam.py,sha256=wIN8OcTNCHVy32YgatWZi2Of-snFYBd4wlxOAJvE-AY,15961
474
- infrahub/graphql/mutations/main.py,sha256=GgETTp-KKyVTnvD8GO7hp1oWIq-eOJ7E_WL-wXUP5Us,20392
479
+ infrahub/graphql/mutations/main.py,sha256=DB7UvTPopMOGH2jX6SG-bX7NUi3aF4AKiu5UeM20zL4,20787
475
480
  infrahub/graphql/mutations/menu.py,sha256=u2UbOA-TFDRcZRGFkgYTmpGxN2IAUgOvJXd7SnsufyI,3708
476
481
  infrahub/graphql/mutations/models.py,sha256=ilkSLr8OxVO9v3Ra_uDyUTJT9qPOmdPMqQbuWIydJMo,264
477
482
  infrahub/graphql/mutations/node_getter/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -484,7 +489,7 @@ infrahub/graphql/mutations/relationship.py,sha256=mFZHn949a48w7MRt-L2iO1St9FwJdX
484
489
  infrahub/graphql/mutations/repository.py,sha256=Whrt1uYWt7Ro6omJYN8zc3D-poZ6bOBrpBHIG4odAmo,11316
485
490
  infrahub/graphql/mutations/resource_manager.py,sha256=DvnmfXmS9bNYXjtgedGTKPdJmtdaCbM5qxl0OJ-t1yQ,11342
486
491
  infrahub/graphql/mutations/schema.py,sha256=vOwP8SIcQxamhP_JwbeXPG5iOEwxHhHawgqU6bD-4us,12897
487
- infrahub/graphql/mutations/tasks.py,sha256=j2t5pMXRQ1i3ohQ-WjfDaDNQpj-CnFnqYCTZ3y5p7ec,3806
492
+ infrahub/graphql/mutations/tasks.py,sha256=IEiT27e6SRJ56OEznWE3r03JfQmyEdxCYBBaVEuHVLU,3898
488
493
  infrahub/graphql/mutations/webhook.py,sha256=IW_WPpBRySd-mpbkuGnR28VpU9naM2bLZBjJOaAGuH4,4777
489
494
  infrahub/graphql/parser.py,sha256=Du1003gL9Bq5niPZE0PT5zB5Sq9Ub2qWJaqf1SnVVck,8603
490
495
  infrahub/graphql/permissions.py,sha256=ADPyCSZcli0PLgGrtO-EsEJjRuvlk9orYhJO06IE_NI,1022
@@ -790,9 +795,9 @@ infrahub_sdk/uuidt.py,sha256=Tz-4nHkJwbi39UT3gaIe2wJeZNAoBqf6tm3sw7LZbXc,2155
790
795
  infrahub_sdk/yaml.py,sha256=9X02RrknjCuu_NwgQTv9jZspDCw0EBaP6jhbLIjhpmM,5143
791
796
  infrahub_testcontainers/__init__.py,sha256=oPpmesGgYBSdKTg1L37FGwYBeao1EHury5SJGul-CT8,216
792
797
  infrahub_testcontainers/constants.py,sha256=mZ4hLvcf4rKk9wC7EId4MQxAY0sk4V99deB04N0J2bg,85
793
- infrahub_testcontainers/container.py,sha256=dZE-9IiOU5oqanyJzZMPPHgXTx1L73yXZjVHQoRxJg8,19507
794
- infrahub_testcontainers/docker-compose-cluster.test.yml,sha256=noKd7NLr6GQOn1X4qukvpsRvg15unGS7BfPDG4xkKdM,12057
795
- infrahub_testcontainers/docker-compose.test.yml,sha256=dVbmHdho_AgCRFJ62jNAbtcPd_JMyRWWgfqqMDmIhfc,8565
798
+ infrahub_testcontainers/container.py,sha256=jwNLuqTJ_cNbBlXVXjIl2YeOIfpCetO3RSjpO3g4SrI,19510
799
+ infrahub_testcontainers/docker-compose-cluster.test.yml,sha256=Sz6k_1ywvlA2kGzhc9ASDp9PSpPMUAupjfOGWwHNAHs,12222
800
+ infrahub_testcontainers/docker-compose.test.yml,sha256=jvS8k4U5ngxBzLmvGEn1n1MA1L75DD0PoiFyOdO2Lr4,8620
796
801
  infrahub_testcontainers/haproxy.cfg,sha256=QUkG2Xu-hKoknPOeYKAkBT_xJH6U9CfIS0DTMFZJsnk,1305
797
802
  infrahub_testcontainers/helpers.py,sha256=3HAygJJmU1vBrD63Abiau6BGypYEeysTqRb6nkcmw7g,4573
798
803
  infrahub_testcontainers/host.py,sha256=Z4_gGoGKKeM_HGVS7SdYL1FTNGyLBk8wzicdSKHpfmM,1486
@@ -801,8 +806,8 @@ infrahub_testcontainers/models.py,sha256=ASYyvl7d_WQz_i7y8-3iab9hwwmCl3OCJavqVbe
801
806
  infrahub_testcontainers/performance_test.py,sha256=hvwiy6tc_lWniYqGkqfOXVGAmA_IV15VOZqbiD9ezno,6149
802
807
  infrahub_testcontainers/plugin.py,sha256=I3RuZQ0dARyKHuqCf0y1Yj731P2Mwf3BJUehRJKeWrs,5645
803
808
  infrahub_testcontainers/prometheus.yml,sha256=610xQEyj3xuVJMzPkC4m1fRnCrjGpiRBrXA2ytCLa54,599
804
- infrahub_server-1.3.2.dist-info/LICENSE.txt,sha256=TfPDBt3ar0uv_f9cqCDMZ5rIzW3CY8anRRd4PkL6ejs,34522
805
- infrahub_server-1.3.2.dist-info/METADATA,sha256=ryVIpJ8RWv_Brr02affO2F-ZGjjAuz0ahV-OGLaIr7U,8205
806
- infrahub_server-1.3.2.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
807
- infrahub_server-1.3.2.dist-info/entry_points.txt,sha256=UXIeFWDsrV-4IllNvUEd6KieYGzQfn9paga2YyABOQI,393
808
- infrahub_server-1.3.2.dist-info/RECORD,,
809
+ infrahub_server-1.3.3.dist-info/LICENSE.txt,sha256=TfPDBt3ar0uv_f9cqCDMZ5rIzW3CY8anRRd4PkL6ejs,34522
810
+ infrahub_server-1.3.3.dist-info/METADATA,sha256=WjJ19ZRCILDLKyfqCVPoDH3a-XRbvmGhGNdQDWbbXyo,8205
811
+ infrahub_server-1.3.3.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
812
+ infrahub_server-1.3.3.dist-info/entry_points.txt,sha256=UXIeFWDsrV-4IllNvUEd6KieYGzQfn9paga2YyABOQI,393
813
+ infrahub_server-1.3.3.dist-info/RECORD,,
@@ -141,7 +141,7 @@ class InfrahubDockerCompose(DockerCompose):
141
141
  "INFRAHUB_TESTING_DOCKER_ENTRYPOINT": f"gunicorn --config community/backend/infrahub/serve/gunicorn_config.py -w {os.environ.get('INFRAHUB_TESTING_WEB_CONCURRENCY', 4)} --logger-class infrahub.serve.log.GunicornLogger infrahub_enterprise.server:app", # noqa: E501
142
142
  "INFRAHUB_TESTING_WORKFLOW_DEFAULT_WORKER_TYPE": "infrahubentasync",
143
143
  "INFRAHUB_TESTING_PREFECT_UI_ENABLED": "false",
144
- "NEO4J_DOCKER_IMAGE": "neo4j:5.20.0-enterprise",
144
+ "NEO4J_DOCKER_IMAGE": "neo4j:2025.03.0-enterprise",
145
145
  }
146
146
  )
147
147
 
@@ -91,6 +91,7 @@ services:
91
91
  start_period: 3s
92
92
  ports:
93
93
  - ${INFRAHUB_TESTING_DATABASE_PORT:-0}:6362
94
+ - ${INFRAHUB_TESTING_DATABASE_BOLT_PORT:-0}:7687
94
95
  - ${INFRAHUB_TESTING_DATABASE_UI_PORT:-0}:7474
95
96
 
96
97
  database-core2:
@@ -126,6 +127,7 @@ services:
126
127
  com.github.job: "${JOB_NAME:-unknown}"
127
128
  ports:
128
129
  - "${INFRAHUB_TESTING_DATABASE_PORT:-0}:6363"
130
+ - ${INFRAHUB_TESTING_DATABASE_BOLT_PORT:-0}:7687
129
131
 
130
132
  database-core3:
131
133
  deploy:
@@ -160,6 +162,7 @@ services:
160
162
  com.github.job: "${JOB_NAME:-unknown}"
161
163
  ports:
162
164
  - "${INFRAHUB_TESTING_DATABASE_PORT:-0}:6364"
165
+ - ${INFRAHUB_TESTING_DATABASE_BOLT_PORT:-0}:7687
163
166
 
164
167
  task-manager:
165
168
  image: "${INFRAHUB_TESTING_DOCKER_IMAGE}:${INFRAHUB_TESTING_IMAGE_VERSION}"
@@ -72,6 +72,7 @@ services:
72
72
  start_period: 3s
73
73
  ports:
74
74
  - ${INFRAHUB_TESTING_DATABASE_PORT:-0}:6362
75
+ - ${INFRAHUB_TESTING_DATABASE_BOLT_PORT:-0}:7687
75
76
  - ${INFRAHUB_TESTING_DATABASE_UI_PORT:-0}:7474
76
77
 
77
78
  task-manager: