infrahub-server 1.1.6__py3-none-any.whl → 1.2.0rc0__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 (346) hide show
  1. infrahub/api/artifact.py +16 -4
  2. infrahub/api/dependencies.py +8 -0
  3. infrahub/api/oauth2.py +0 -1
  4. infrahub/api/oidc.py +0 -1
  5. infrahub/api/query.py +18 -7
  6. infrahub/api/schema.py +32 -6
  7. infrahub/api/transformation.py +12 -5
  8. infrahub/{message_bus/messages/check_artifact_create.py → artifacts/models.py} +2 -4
  9. infrahub/{message_bus/operations/check/artifact.py → artifacts/tasks.py} +26 -25
  10. infrahub/cli/__init__.py +0 -2
  11. infrahub/cli/db.py +6 -7
  12. infrahub/cli/events.py +8 -3
  13. infrahub/cli/git_agent.py +9 -7
  14. infrahub/cli/tasks.py +4 -6
  15. infrahub/computed_attribute/tasks.py +63 -17
  16. infrahub/computed_attribute/triggers.py +90 -0
  17. infrahub/config.py +1 -1
  18. infrahub/context.py +39 -0
  19. infrahub/core/account.py +5 -8
  20. infrahub/core/attribute.py +53 -21
  21. infrahub/core/branch/models.py +4 -4
  22. infrahub/core/branch/tasks.py +89 -130
  23. infrahub/core/changelog/__init__.py +0 -0
  24. infrahub/core/changelog/diff.py +232 -0
  25. infrahub/core/changelog/models.py +488 -0
  26. infrahub/core/constants/__init__.py +19 -2
  27. infrahub/core/constants/infrahubkind.py +1 -0
  28. infrahub/core/diff/combiner.py +12 -8
  29. infrahub/core/diff/coordinator.py +49 -70
  30. infrahub/core/diff/data_check_synchronizer.py +86 -7
  31. infrahub/core/diff/enricher/aggregated.py +3 -3
  32. infrahub/core/diff/enricher/cardinality_one.py +2 -7
  33. infrahub/core/diff/enricher/hierarchy.py +5 -3
  34. infrahub/core/diff/enricher/labels.py +14 -4
  35. infrahub/core/diff/enricher/path_identifier.py +3 -9
  36. infrahub/core/diff/enricher/summary_counts.py +3 -1
  37. infrahub/core/diff/merger/merger.py +8 -4
  38. infrahub/core/diff/model/path.py +47 -29
  39. infrahub/core/diff/query/all_conflicts.py +6 -3
  40. infrahub/core/diff/query/artifact.py +1 -1
  41. infrahub/core/diff/query/delete_query.py +1 -1
  42. infrahub/core/diff/query/diff_get.py +3 -2
  43. infrahub/core/diff/query/diff_summary.py +1 -1
  44. infrahub/core/diff/query/field_specifiers.py +3 -1
  45. infrahub/core/diff/query/field_summary.py +3 -2
  46. infrahub/core/diff/query/filters.py +12 -1
  47. infrahub/core/diff/query/get_conflict_query.py +1 -1
  48. infrahub/core/diff/query/has_conflicts_query.py +6 -3
  49. infrahub/core/diff/query/merge.py +3 -3
  50. infrahub/core/diff/query/{drop_tracking_id.py → merge_tracking_id.py} +4 -4
  51. infrahub/core/diff/query/roots_metadata.py +9 -2
  52. infrahub/core/diff/query/save.py +151 -66
  53. infrahub/core/diff/query/summary_counts_enricher.py +220 -0
  54. infrahub/core/diff/query/time_range_query.py +3 -2
  55. infrahub/core/diff/query/update_conflict_query.py +1 -1
  56. infrahub/core/diff/query_parser.py +49 -24
  57. infrahub/core/diff/repository/deserializer.py +24 -25
  58. infrahub/core/diff/repository/repository.py +76 -20
  59. infrahub/core/diff/tasks.py +9 -8
  60. infrahub/core/enums.py +1 -1
  61. infrahub/core/integrity/object_conflict/conflict_recorder.py +1 -1
  62. infrahub/core/ipam/reconciler.py +1 -1
  63. infrahub/core/ipam/tasks.py +2 -3
  64. infrahub/core/manager.py +18 -13
  65. infrahub/core/merge.py +5 -2
  66. infrahub/core/migrations/graph/m001_add_version_to_graph.py +1 -1
  67. infrahub/core/migrations/graph/m002_attribute_is_default.py +2 -2
  68. infrahub/core/migrations/graph/m003_relationship_parent_optional.py +2 -2
  69. infrahub/core/migrations/graph/m004_add_attr_documentation.py +1 -1
  70. infrahub/core/migrations/graph/m005_add_rel_read_only.py +1 -1
  71. infrahub/core/migrations/graph/m006_add_rel_on_delete.py +1 -1
  72. infrahub/core/migrations/graph/m007_add_rel_allow_override.py +1 -1
  73. infrahub/core/migrations/graph/m008_add_human_friendly_id.py +1 -1
  74. infrahub/core/migrations/graph/m009_add_generate_profile_attr.py +1 -1
  75. infrahub/core/migrations/graph/m010_add_generate_profile_attr_generic.py +1 -1
  76. infrahub/core/migrations/graph/m011_remove_profile_relationship_schema.py +2 -2
  77. infrahub/core/migrations/graph/m012_convert_account_generic.py +12 -23
  78. infrahub/core/migrations/graph/m013_convert_git_password_credential.py +7 -11
  79. infrahub/core/migrations/graph/m014_remove_index_attr_value.py +2 -2
  80. infrahub/core/migrations/graph/m015_diff_format_update.py +1 -1
  81. infrahub/core/migrations/graph/m016_diff_delete_bug_fix.py +1 -1
  82. infrahub/core/migrations/graph/m017_add_core_profile.py +1 -1
  83. infrahub/core/migrations/graph/m018_uniqueness_nulls.py +2 -2
  84. infrahub/core/migrations/query/attribute_add.py +1 -1
  85. infrahub/core/migrations/query/attribute_rename.py +1 -1
  86. infrahub/core/migrations/query/delete_element_in_schema.py +1 -1
  87. infrahub/core/migrations/query/node_duplicate.py +1 -1
  88. infrahub/core/migrations/query/relationship_duplicate.py +1 -1
  89. infrahub/core/migrations/query/schema_attribute_update.py +1 -1
  90. infrahub/core/migrations/schema/node_attribute_remove.py +1 -1
  91. infrahub/core/migrations/schema/node_remove.py +1 -1
  92. infrahub/core/migrations/schema/tasks.py +5 -5
  93. infrahub/core/migrations/shared.py +4 -4
  94. infrahub/core/models.py +7 -8
  95. infrahub/core/node/__init__.py +161 -40
  96. infrahub/core/node/base.py +1 -1
  97. infrahub/core/node/constraints/grouped_uniqueness.py +9 -2
  98. infrahub/core/node/delete_validator.py +4 -4
  99. infrahub/core/node/ipam.py +13 -8
  100. infrahub/core/node/permissions.py +4 -0
  101. infrahub/core/node/resource_manager/ip_prefix_pool.py +8 -5
  102. infrahub/core/node/standard.py +3 -5
  103. infrahub/core/property.py +1 -1
  104. infrahub/core/protocols.py +4 -0
  105. infrahub/core/protocols_base.py +4 -2
  106. infrahub/core/query/__init__.py +2 -5
  107. infrahub/core/query/attribute.py +9 -9
  108. infrahub/core/query/branch.py +5 -5
  109. infrahub/core/query/delete.py +1 -1
  110. infrahub/core/query/diff.py +45 -7
  111. infrahub/core/query/ipam.py +4 -4
  112. infrahub/core/query/node.py +19 -14
  113. infrahub/core/query/relationship.py +10 -11
  114. infrahub/core/query/resource_manager.py +13 -11
  115. infrahub/core/query/standard_node.py +6 -6
  116. infrahub/core/query/task.py +3 -3
  117. infrahub/core/query/task_log.py +1 -1
  118. infrahub/core/query/utils.py +5 -5
  119. infrahub/core/registry.py +0 -2
  120. infrahub/core/relationship/constraints/count.py +1 -1
  121. infrahub/core/relationship/constraints/peer_kind.py +1 -1
  122. infrahub/core/relationship/model.py +66 -26
  123. infrahub/core/schema/__init__.py +6 -4
  124. infrahub/core/schema/basenode_schema.py +1 -3
  125. infrahub/core/schema/definitions/core.py +14 -2
  126. infrahub/core/schema/definitions/internal.py +16 -0
  127. infrahub/core/schema/generated/genericnode_schema.py +5 -0
  128. infrahub/core/schema/generated/node_schema.py +5 -0
  129. infrahub/core/schema/generic_schema.py +5 -1
  130. infrahub/core/schema/manager.py +45 -42
  131. infrahub/core/schema/node_schema.py +4 -0
  132. infrahub/core/schema/profile_schema.py +4 -0
  133. infrahub/core/schema/relationship_schema.py +2 -2
  134. infrahub/core/schema/schema_branch.py +248 -14
  135. infrahub/core/schema/template_schema.py +36 -0
  136. infrahub/core/task/user_task.py +7 -5
  137. infrahub/core/timestamp.py +1 -1
  138. infrahub/core/utils.py +3 -2
  139. infrahub/core/validators/attribute/choices.py +1 -1
  140. infrahub/core/validators/attribute/enum.py +1 -1
  141. infrahub/core/validators/attribute/kind.py +1 -1
  142. infrahub/core/validators/attribute/length.py +1 -1
  143. infrahub/core/validators/attribute/optional.py +1 -1
  144. infrahub/core/validators/attribute/regex.py +1 -1
  145. infrahub/core/validators/attribute/unique.py +1 -1
  146. infrahub/core/validators/checks_runner.py +37 -0
  147. infrahub/core/validators/node/generate_profile.py +1 -1
  148. infrahub/core/validators/node/hierarchy.py +1 -1
  149. infrahub/core/validators/query.py +1 -1
  150. infrahub/core/validators/relationship/count.py +1 -1
  151. infrahub/core/validators/relationship/optional.py +1 -1
  152. infrahub/core/validators/relationship/peer.py +1 -1
  153. infrahub/core/validators/tasks.py +8 -6
  154. infrahub/core/validators/uniqueness/query.py +20 -17
  155. infrahub/database/__init__.py +15 -2
  156. infrahub/database/memgraph.py +1 -1
  157. infrahub/dependencies/builder/constraint/grouped/node_runner.py +0 -2
  158. infrahub/dependencies/builder/diff/combiner.py +1 -1
  159. infrahub/dependencies/builder/diff/conflicts_enricher.py +1 -1
  160. infrahub/dependencies/builder/diff/coordinator.py +0 -2
  161. infrahub/dependencies/builder/diff/deserializer.py +1 -1
  162. infrahub/dependencies/builder/diff/enricher/summary_counts.py +1 -1
  163. infrahub/events/branch_action.py +47 -21
  164. infrahub/events/group_action.py +73 -0
  165. infrahub/events/models.py +159 -51
  166. infrahub/events/node_action.py +74 -8
  167. infrahub/events/repository_action.py +8 -8
  168. infrahub/events/schema_action.py +21 -8
  169. infrahub/generators/tasks.py +12 -13
  170. infrahub/git/base.py +3 -5
  171. infrahub/git/constants.py +0 -1
  172. infrahub/git/integrator.py +36 -35
  173. infrahub/git/repository.py +7 -8
  174. infrahub/git/tasks.py +43 -107
  175. infrahub/git_credential/helper.py +2 -3
  176. infrahub/graphql/analyzer.py +572 -11
  177. infrahub/graphql/app.py +34 -26
  178. infrahub/graphql/auth/query_permission_checker/anonymous_checker.py +5 -5
  179. infrahub/graphql/auth/query_permission_checker/default_branch_checker.py +4 -4
  180. infrahub/graphql/auth/query_permission_checker/merge_operation_checker.py +4 -4
  181. infrahub/graphql/auth/query_permission_checker/object_permission_checker.py +28 -35
  182. infrahub/graphql/auth/query_permission_checker/super_admin_checker.py +5 -5
  183. infrahub/graphql/enums.py +1 -1
  184. infrahub/graphql/initialization.py +5 -1
  185. infrahub/graphql/loaders/node.py +2 -2
  186. infrahub/graphql/manager.py +59 -54
  187. infrahub/graphql/mutations/account.py +20 -13
  188. infrahub/graphql/mutations/artifact_definition.py +16 -12
  189. infrahub/graphql/mutations/branch.py +61 -40
  190. infrahub/graphql/mutations/computed_attribute.py +19 -13
  191. infrahub/graphql/mutations/diff.py +37 -9
  192. infrahub/graphql/mutations/diff_conflict.py +9 -8
  193. infrahub/graphql/mutations/graphql_query.py +19 -11
  194. infrahub/graphql/mutations/ipam.py +21 -19
  195. infrahub/graphql/mutations/main.py +197 -44
  196. infrahub/graphql/mutations/menu.py +8 -8
  197. infrahub/graphql/mutations/proposed_change.py +36 -28
  198. infrahub/graphql/mutations/relationship.py +302 -105
  199. infrahub/graphql/mutations/repository.py +41 -35
  200. infrahub/graphql/mutations/resource_manager.py +26 -26
  201. infrahub/graphql/mutations/schema.py +51 -33
  202. infrahub/graphql/mutations/tasks.py +16 -10
  203. infrahub/graphql/parser.py +1 -1
  204. infrahub/graphql/permissions.py +6 -4
  205. infrahub/graphql/queries/account.py +22 -18
  206. infrahub/graphql/queries/branch.py +6 -4
  207. infrahub/graphql/queries/diff/tree.py +48 -42
  208. infrahub/graphql/queries/event.py +112 -0
  209. infrahub/graphql/queries/internal.py +3 -3
  210. infrahub/graphql/queries/ipam.py +23 -18
  211. infrahub/graphql/queries/relationship.py +11 -10
  212. infrahub/graphql/queries/resource_manager.py +43 -27
  213. infrahub/graphql/queries/search.py +9 -8
  214. infrahub/graphql/queries/status.py +12 -9
  215. infrahub/graphql/queries/task.py +11 -9
  216. infrahub/graphql/resolvers/resolver.py +69 -43
  217. infrahub/graphql/resolvers/single_relationship.py +16 -10
  218. infrahub/graphql/schema.py +2 -0
  219. infrahub/graphql/subscription/__init__.py +1 -1
  220. infrahub/graphql/subscription/events.py +1 -1
  221. infrahub/graphql/subscription/graphql_query.py +8 -8
  222. infrahub/graphql/types/branch.py +2 -2
  223. infrahub/graphql/types/common.py +6 -1
  224. infrahub/graphql/types/enums.py +2 -0
  225. infrahub/graphql/types/event.py +100 -0
  226. infrahub/graphql/types/interface.py +2 -2
  227. infrahub/graphql/types/node.py +3 -3
  228. infrahub/graphql/types/permission.py +2 -2
  229. infrahub/graphql/types/relationship.py +3 -3
  230. infrahub/graphql/types/standard_node.py +9 -11
  231. infrahub/graphql/utils.py +28 -182
  232. infrahub/groups/tasks.py +2 -3
  233. infrahub/lock.py +1 -1
  234. infrahub/menu/constants.py +1 -0
  235. infrahub/menu/generator.py +14 -3
  236. infrahub/menu/menu.py +116 -127
  237. infrahub/menu/models.py +4 -4
  238. infrahub/message_bus/messages/__init__.py +0 -4
  239. infrahub/message_bus/messages/event_branch_merge.py +3 -0
  240. infrahub/message_bus/messages/request_proposedchange_pipeline.py +2 -0
  241. infrahub/message_bus/operations/__init__.py +3 -5
  242. infrahub/message_bus/operations/check/__init__.py +2 -2
  243. infrahub/message_bus/operations/check/generator.py +1 -3
  244. infrahub/message_bus/operations/check/repository.py +1 -1
  245. infrahub/message_bus/operations/event/branch.py +7 -3
  246. infrahub/message_bus/operations/event/schema.py +1 -1
  247. infrahub/message_bus/operations/finalize/validator.py +1 -1
  248. infrahub/message_bus/operations/git/file.py +2 -2
  249. infrahub/message_bus/operations/git/repository.py +1 -1
  250. infrahub/message_bus/operations/requests/__init__.py +0 -2
  251. infrahub/message_bus/operations/requests/generator_definition.py +1 -1
  252. infrahub/message_bus/operations/requests/proposed_change.py +26 -11
  253. infrahub/message_bus/operations/requests/repository.py +2 -2
  254. infrahub/message_bus/operations/send/echo.py +1 -1
  255. infrahub/message_bus/types.py +1 -1
  256. infrahub/permissions/__init__.py +2 -1
  257. infrahub/permissions/types.py +26 -0
  258. infrahub/pools/prefix.py +29 -165
  259. infrahub/prefect_server/__init__.py +0 -0
  260. infrahub/prefect_server/app.py +18 -0
  261. infrahub/prefect_server/database.py +20 -0
  262. infrahub/prefect_server/events.py +28 -0
  263. infrahub/prefect_server/models.py +46 -0
  264. infrahub/proposed_change/models.py +15 -1
  265. infrahub/proposed_change/tasks.py +173 -35
  266. infrahub/pytest_plugin.py +4 -4
  267. infrahub/server.py +12 -11
  268. infrahub/services/__init__.py +147 -62
  269. infrahub/services/adapters/cache/__init__.py +7 -5
  270. infrahub/services/adapters/cache/nats.py +40 -22
  271. infrahub/services/adapters/cache/redis.py +0 -4
  272. infrahub/services/adapters/event/__init__.py +10 -18
  273. infrahub/services/adapters/http/__init__.py +0 -5
  274. infrahub/services/adapters/http/httpx.py +22 -15
  275. infrahub/services/adapters/message_bus/__init__.py +23 -6
  276. infrahub/services/adapters/message_bus/local.py +8 -6
  277. infrahub/services/adapters/message_bus/nats.py +12 -6
  278. infrahub/services/adapters/message_bus/rabbitmq.py +22 -9
  279. infrahub/services/adapters/workflow/__init__.py +11 -8
  280. infrahub/services/adapters/workflow/local.py +28 -7
  281. infrahub/services/adapters/workflow/worker.py +23 -7
  282. infrahub/services/component.py +38 -35
  283. infrahub/services/scheduler.py +32 -29
  284. infrahub/storage.py +2 -4
  285. infrahub/task_manager/constants.py +1 -1
  286. infrahub/task_manager/event.py +182 -0
  287. infrahub/task_manager/models.py +125 -1
  288. infrahub/task_manager/task.py +1 -1
  289. infrahub/tasks/artifact.py +14 -16
  290. infrahub/tasks/registry.py +1 -1
  291. infrahub/tasks/telemetry.py +13 -14
  292. infrahub/transformations/tasks.py +3 -5
  293. infrahub/trigger/__init__.py +0 -0
  294. infrahub/trigger/catalogue.py +15 -0
  295. infrahub/trigger/constants.py +9 -0
  296. infrahub/trigger/models.py +69 -0
  297. infrahub/trigger/tasks.py +85 -0
  298. infrahub/types.py +1 -1
  299. infrahub/utils.py +1 -1
  300. infrahub/webhook/constants.py +0 -2
  301. infrahub/webhook/models.py +8 -2
  302. infrahub/webhook/tasks.py +20 -73
  303. infrahub/webhook/triggers.py +20 -0
  304. infrahub/workers/infrahub_async.py +36 -25
  305. infrahub/workers/utils.py +63 -0
  306. infrahub/workflows/catalogue.py +13 -37
  307. infrahub/workflows/initialization.py +6 -8
  308. infrahub/workflows/models.py +3 -5
  309. infrahub/workflows/utils.py +1 -1
  310. infrahub_sdk/ctl/check.py +3 -3
  311. infrahub_sdk/ctl/cli_commands.py +11 -10
  312. infrahub_sdk/ctl/exceptions.py +0 -6
  313. infrahub_sdk/ctl/exporter.py +1 -1
  314. infrahub_sdk/ctl/generator.py +5 -5
  315. infrahub_sdk/ctl/importer.py +3 -2
  316. infrahub_sdk/ctl/menu.py +1 -1
  317. infrahub_sdk/ctl/object.py +1 -1
  318. infrahub_sdk/ctl/repository.py +23 -15
  319. infrahub_sdk/ctl/schema.py +2 -2
  320. infrahub_sdk/ctl/utils.py +4 -3
  321. infrahub_sdk/ctl/validate.py +2 -1
  322. infrahub_sdk/exceptions.py +6 -0
  323. infrahub_sdk/generator.py +3 -0
  324. infrahub_sdk/node.py +2 -2
  325. infrahub_sdk/schema/__init__.py +14 -2
  326. infrahub_sdk/schema/main.py +7 -0
  327. infrahub_sdk/utils.py +11 -1
  328. infrahub_sdk/yaml.py +2 -3
  329. {infrahub_server-1.1.6.dist-info → infrahub_server-1.2.0rc0.dist-info}/METADATA +46 -12
  330. {infrahub_server-1.1.6.dist-info → infrahub_server-1.2.0rc0.dist-info}/RECORD +338 -321
  331. infrahub_testcontainers/container.py +14 -6
  332. infrahub_testcontainers/docker-compose.test.yml +24 -5
  333. infrahub_testcontainers/haproxy.cfg +43 -0
  334. infrahub_testcontainers/helpers.py +85 -1
  335. infrahub/core/branch/constants.py +0 -2
  336. infrahub/graphql/query.py +0 -52
  337. infrahub/message_bus/messages/request_artifactdefinition_check.py +0 -17
  338. infrahub/message_bus/operations/requests/artifact_definition.py +0 -148
  339. infrahub/schema/constants.py +0 -1
  340. infrahub/schema/tasks.py +0 -76
  341. infrahub/services/adapters/database/__init__.py +0 -9
  342. infrahub_sdk/ctl/_file.py +0 -13
  343. /infrahub/{schema → artifacts}/__init__.py +0 -0
  344. {infrahub_server-1.1.6.dist-info → infrahub_server-1.2.0rc0.dist-info}/LICENSE.txt +0 -0
  345. {infrahub_server-1.1.6.dist-info → infrahub_server-1.2.0rc0.dist-info}/WHEEL +0 -0
  346. {infrahub_server-1.1.6.dist-info → infrahub_server-1.2.0rc0.dist-info}/entry_points.txt +0 -0
@@ -19,10 +19,15 @@ class BuiltinIPPrefix(Node):
19
19
  fields: Optional[dict] = None,
20
20
  related_node_ids: Optional[set] = None,
21
21
  filter_sensitive: bool = False,
22
- permissions: Optional[dict] = None,
22
+ permissions: Optional[dict] = None, # noqa: ARG002
23
+ include_properties: bool = True,
23
24
  ) -> dict:
24
25
  response = await super().to_graphql(
25
- db, fields=fields, related_node_ids=related_node_ids, filter_sensitive=filter_sensitive
26
+ db,
27
+ fields=fields,
28
+ related_node_ids=related_node_ids,
29
+ filter_sensitive=filter_sensitive,
30
+ include_properties=include_properties,
26
31
  )
27
32
 
28
33
  if fields:
@@ -35,8 +40,8 @@ class BuiltinIPPrefix(Node):
35
40
  retrieved = await NodeManager.get_one(
36
41
  db=db, branch=self._branch, id=self.id, fields={"member_type": None, "prefix": None}
37
42
  )
38
- self.member_type = retrieved.member_type # type: ignore[union-attr] # pylint: disable=attribute-defined-outside-init
39
- self.prefix = retrieved.prefix # type: ignore[union-attr] # pylint: disable=attribute-defined-outside-init
43
+ self.member_type = retrieved.member_type # type: ignore[union-attr]
44
+ self.prefix = retrieved.prefix # type: ignore[union-attr]
40
45
  utilization_getter = PrefixUtilizationGetter(db=db, ip_prefixes=[self])
41
46
  utilization = await utilization_getter.get_use_percentage(
42
47
  ip_prefixes=[self], branch_names=[self._branch.name]
@@ -46,12 +51,12 @@ class BuiltinIPPrefix(Node):
46
51
  return response
47
52
 
48
53
  async def get_resource_weight(self, db: InfrahubDatabase) -> int:
49
- member_type = self.member_type.value # type: ignore[has-type] # pylint: disable=access-member-before-definition
50
- prefixlen = self.prefix.prefixlen # type: ignore[has-type] # pylint: disable=access-member-before-definition
54
+ member_type = self.member_type.value # type: ignore[has-type]
55
+ prefixlen = self.prefix.prefixlen # type: ignore[has-type]
51
56
  if member_type is None or prefixlen is None:
52
57
  retrieved = await NodeManager.get_one(
53
58
  db=db, branch=self._branch, id=self.id, fields={"member_type": None, "prefix": None}
54
59
  )
55
- self.member_type = retrieved.member_type # type: ignore[union-attr] # pylint: disable=attribute-defined-outside-init
56
- self.prefix = retrieved.prefix # type: ignore[union-attr] # pylint: disable=attribute-defined-outside-init
60
+ self.member_type = retrieved.member_type # type: ignore[union-attr]
61
+ self.prefix = retrieved.prefix # type: ignore[union-attr]
57
62
  return get_prefix_space(self)
@@ -18,6 +18,7 @@ class CoreGlobalPermission(Node):
18
18
  related_node_ids: Optional[set] = None,
19
19
  filter_sensitive: bool = False,
20
20
  permissions: Optional[dict] = None,
21
+ include_properties: bool = True,
21
22
  ) -> dict:
22
23
  response = await super().to_graphql(
23
24
  db,
@@ -25,6 +26,7 @@ class CoreGlobalPermission(Node):
25
26
  related_node_ids=related_node_ids,
26
27
  filter_sensitive=filter_sensitive,
27
28
  permissions=permissions,
29
+ include_properties=include_properties,
28
30
  )
29
31
 
30
32
  if fields:
@@ -43,6 +45,7 @@ class CoreObjectPermission(Node):
43
45
  related_node_ids: Optional[set] = None,
44
46
  filter_sensitive: bool = False,
45
47
  permissions: Optional[dict] = None,
48
+ include_properties: bool = True,
46
49
  ) -> dict:
47
50
  response = await super().to_graphql(
48
51
  db,
@@ -50,6 +53,7 @@ class CoreObjectPermission(Node):
50
53
  related_node_ids=related_node_ids,
51
54
  filter_sensitive=filter_sensitive,
52
55
  permissions=permissions,
56
+ include_properties=include_properties,
53
57
  )
54
58
 
55
59
  if fields:
@@ -3,6 +3,8 @@ from __future__ import annotations
3
3
  import ipaddress
4
4
  from typing import TYPE_CHECKING, Any, Optional
5
5
 
6
+ from netaddr import IPSet
7
+
6
8
  from infrahub.core import registry
7
9
  from infrahub.core.ipam.reconciler import IpamReconciler
8
10
  from infrahub.core.query.ipam import get_subnets
@@ -11,7 +13,7 @@ from infrahub.core.query.resource_manager import (
11
13
  PrefixPoolSetReserved,
12
14
  )
13
15
  from infrahub.exceptions import ValidationError
14
- from infrahub.pools.prefix import PrefixPool
16
+ from infrahub.pools.prefix import get_next_available_prefix
15
17
 
16
18
  from .. import Node
17
19
 
@@ -99,14 +101,15 @@ class CoreIPPrefixPool(Node):
99
101
  branch_agnostic=True,
100
102
  )
101
103
 
102
- pool = PrefixPool(resource.prefix.value) # type: ignore[attr-defined]
104
+ pool = IPSet([resource.prefix.value])
103
105
  for subnet in subnets:
104
- pool.reserve(subnet=str(subnet.prefix))
106
+ pool.remove(addr=str(subnet.prefix))
105
107
 
106
108
  try:
107
- next_available = pool.get(prefixlen=prefixlen)
109
+ prefix_ver = ipaddress.ip_network(resource.prefix.value).version
110
+ next_available = get_next_available_prefix(pool=pool, prefix_length=prefixlen, prefix_ver=prefix_ver)
108
111
  return next_available
109
- except IndexError:
112
+ except ValueError:
110
113
  continue
111
114
 
112
115
  raise IndexError("No more resources available")
@@ -19,8 +19,6 @@ from infrahub.core.query.standard_node import (
19
19
  )
20
20
  from infrahub.exceptions import Error, InitializationError
21
21
 
22
- # pylint: disable=redefined-builtin
23
-
24
22
  if TYPE_CHECKING:
25
23
  from neo4j.graph import Node as Neo4jNode
26
24
  from pydantic.fields import FieldInfo
@@ -173,9 +171,9 @@ class StandardNode(BaseModel):
173
171
 
174
172
  if value == NULL_VALUE:
175
173
  attrs[key] = None
176
- elif issubclass(field_type, (int, float, bool, str, UUID)):
174
+ elif issubclass(field_type, int | float | bool | str | UUID):
177
175
  attrs[key] = value
178
- elif isinstance(value, (str, bytes)):
176
+ elif isinstance(value, str | bytes):
179
177
  attrs[key] = ujson.loads(value)
180
178
 
181
179
  return cls(**attrs)
@@ -203,7 +201,7 @@ class StandardNode(BaseModel):
203
201
  data[attr_name] = ujson.dumps(clean_value)
204
202
  else:
205
203
  data[attr_name] = attr_value.model_dump_json()
206
- elif issubclass(field_type, (int, float, bool, str, UUID)):
204
+ elif issubclass(field_type, int | float | bool | str | UUID):
207
205
  data[attr_name] = attr_value
208
206
  else:
209
207
  data[attr_name] = ujson.dumps(attr_value)
infrahub/core/property.py CHANGED
@@ -123,7 +123,7 @@ class NodePropertyMixin:
123
123
  If the value is a Node, we save the node and we extract the ID
124
124
  if the value is None, we just initialize the 2 variables."""
125
125
 
126
- if isinstance(value, (str, UUID)):
126
+ if isinstance(value, str | UUID):
127
127
  setattr(self, f"{name}_id", value)
128
128
  setattr(self, f"_{name}", None)
129
129
  elif isinstance(value, dict) and "id" in value:
@@ -148,6 +148,10 @@ class CoreMenu(CoreNode):
148
148
  children: RelationshipManager
149
149
 
150
150
 
151
+ class CoreObjectTemplate(CoreNode):
152
+ template_name: String
153
+
154
+
151
155
  class CoreProfile(CoreNode):
152
156
  profile_name: String
153
157
  profile_priority: IntegerOptional
@@ -9,8 +9,6 @@ if TYPE_CHECKING:
9
9
 
10
10
  from infrahub.core.schema.schema_branch import SchemaBranch
11
11
 
12
- # pylint: disable=redefined-builtin
13
-
14
12
 
15
13
  @runtime_checkable
16
14
  class Timestamp(Protocol): ...
@@ -24,6 +22,10 @@ class NodeSchema(Protocol): ...
24
22
  class ProfileSchema(Protocol): ...
25
23
 
26
24
 
25
+ @runtime_checkable
26
+ class TemplateSchema(Protocol): ...
27
+
28
+
27
29
  @runtime_checkable
28
30
  class Branch(Protocol): ...
29
31
 
@@ -479,7 +479,7 @@ class Query(ABC):
479
479
  """Search for all the variables in a Query string and replace each variable with its value."""
480
480
 
481
481
  def prep_value(v: Any) -> str:
482
- if isinstance(v, (int, list)):
482
+ if isinstance(v, int | list):
483
483
  return str(v)
484
484
  return f'"{v}"'
485
485
 
@@ -517,7 +517,7 @@ class Query(ABC):
517
517
  params = []
518
518
 
519
519
  for key, value in self.params.items():
520
- if isinstance(value, (int, list)):
520
+ if isinstance(value, int | list):
521
521
  params.append(f"{key}: {str(value)}")
522
522
  else:
523
523
  params.append(f'{key}: "{value}"')
@@ -670,8 +670,6 @@ class Query(ABC):
670
670
  return len([result for result in self.results if not result.has_deleted_rels])
671
671
 
672
672
  def print_table(self) -> None:
673
- # pylint: disable=import-outside-toplevel
674
-
675
673
  from rich.console import Console
676
674
  from rich.table import Table
677
675
 
@@ -689,7 +687,6 @@ class Query(ABC):
689
687
  console.print(table)
690
688
 
691
689
  def print(self, include_var: bool = False) -> None:
692
- # pylint: disable=import-outside-toplevel
693
690
  from rich import print as rprint
694
691
 
695
692
  print("-------------------------------------------------------")
@@ -44,7 +44,7 @@ class AttributeUpdateValueQuery(AttributeQuery):
44
44
 
45
45
  raise_error_if_empty: bool = True
46
46
 
47
- async def query_init(self, db: InfrahubDatabase, **kwargs: dict[str, Any]) -> None:
47
+ async def query_init(self, db: InfrahubDatabase, **kwargs: dict[str, Any]) -> None: # noqa: ARG002
48
48
  at = self.at or self.attr.at
49
49
 
50
50
  self.params["attr_uuid"] = self.attr.id
@@ -93,7 +93,7 @@ class AttributeUpdateFlagQuery(AttributeQuery):
93
93
 
94
94
  super().__init__(**kwargs)
95
95
 
96
- async def query_init(self, db: InfrahubDatabase, **kwargs: dict[str, Any]) -> None:
96
+ async def query_init(self, db: InfrahubDatabase, **kwargs: dict[str, Any]) -> None: # noqa: ARG002
97
97
  at = self.at or self.attr.at
98
98
 
99
99
  self.params["attr_uuid"] = self.attr.id
@@ -130,7 +130,7 @@ class AttributeUpdateNodePropertyQuery(AttributeQuery):
130
130
 
131
131
  super().__init__(**kwargs)
132
132
 
133
- async def query_init(self, db: InfrahubDatabase, **kwargs: dict[str, Any]) -> None:
133
+ async def query_init(self, db: InfrahubDatabase, **kwargs: dict[str, Any]) -> None: # noqa: ARG002
134
134
  at = self.at or self.attr.at
135
135
 
136
136
  self.params["attr_uuid"] = self.attr.id
@@ -159,7 +159,7 @@ class AttributeGetQuery(AttributeQuery):
159
159
  name = "attribute_get"
160
160
  type: QueryType = QueryType.READ
161
161
 
162
- async def query_init(self, db: InfrahubDatabase, **kwargs: Any) -> None:
162
+ async def query_init(self, db: InfrahubDatabase, **kwargs: Any) -> None: # noqa: ARG002
163
163
  self.params["attr_uuid"] = self.attr.id
164
164
  self.params["node_uuid"] = self.attr.node.id
165
165
 
@@ -183,15 +183,15 @@ class AttributeGetQuery(AttributeQuery):
183
183
  self.return_labels = ["a", "ap", "r2"]
184
184
 
185
185
 
186
- async def default_attribute_query_filter( # pylint: disable=unused-argument,too-many-branches,too-many-statements
186
+ async def default_attribute_query_filter(
187
187
  name: str,
188
188
  filter_name: str,
189
- branch: Branch | None = None,
189
+ branch: Branch | None = None, # noqa: ARG001
190
190
  filter_value: str | int | bool | list | None = None,
191
191
  attribute_kind: str | None = None,
192
192
  include_match: bool = True,
193
193
  param_prefix: str | None = None,
194
- db: InfrahubDatabase | None = None,
194
+ db: InfrahubDatabase | None = None, # noqa: ARG001
195
195
  partial_match: bool = False,
196
196
  support_profiles: bool = False,
197
197
  ) -> tuple[list[QueryElement], dict[str, Any], list[str]]:
@@ -201,10 +201,10 @@ async def default_attribute_query_filter( # pylint: disable=unused-argument,too
201
201
  query_params: dict[str, Any] = {}
202
202
  query_where: list[str] = []
203
203
 
204
- if filter_value and not isinstance(filter_value, (str, bool, int, list)):
204
+ if filter_value and not isinstance(filter_value, str | bool | int | list):
205
205
  raise TypeError(f"filter {filter_name}: {filter_value} ({type(filter_value)}) is not supported.")
206
206
 
207
- if isinstance(filter_value, list) and not all(isinstance(value, (str, bool, int)) for value in filter_value):
207
+ if isinstance(filter_value, list) and not all(isinstance(value, str | bool | int) for value in filter_value):
208
208
  raise TypeError(f"filter {filter_name}: {filter_value} (list) contains unsupported item")
209
209
 
210
210
  param_prefix = param_prefix or f"attr_{name}"
@@ -20,7 +20,7 @@ class AddNodeToBranch(Query):
20
20
  self.node_id = node_id
21
21
  super().__init__(**kwargs)
22
22
 
23
- async def query_init(self, db: InfrahubDatabase, **kwargs: Any) -> None:
23
+ async def query_init(self, db: InfrahubDatabase, **kwargs: Any) -> None: # noqa: ARG002
24
24
  query = """
25
25
  MATCH (root:Root)
26
26
  MATCH (d) WHERE %(id_func)s(d) = $node_id
@@ -50,7 +50,7 @@ class DeleteBranchRelationshipsQuery(Query):
50
50
  self.branch_name = branch_name
51
51
  super().__init__(**kwargs)
52
52
 
53
- async def query_init(self, db: InfrahubDatabase, **kwargs: Any) -> None:
53
+ async def query_init(self, db: InfrahubDatabase, **kwargs: Any) -> None: # noqa: ARG002
54
54
  if config.SETTINGS.database.db_type == config.DatabaseType.MEMGRAPH:
55
55
  query = """
56
56
  MATCH p = (s)-[r]-(d)
@@ -78,7 +78,7 @@ class GetAllBranchInternalRelationshipQuery(Query):
78
78
  type: QueryType = QueryType.READ
79
79
  insert_return: bool = False
80
80
 
81
- async def query_init(self, db: InfrahubDatabase, **kwargs: Any) -> None:
81
+ async def query_init(self, db: InfrahubDatabase, **kwargs: Any) -> None: # noqa: ARG002
82
82
  query = """
83
83
  MATCH p = ()-[r]-()
84
84
  WHERE r.branch = $branch_name
@@ -98,7 +98,7 @@ class RebaseBranchUpdateRelationshipQuery(Query):
98
98
  self.ids = ids
99
99
  super().__init__(**kwargs)
100
100
 
101
- async def query_init(self, db: InfrahubDatabase, **kwargs: Any) -> None:
101
+ async def query_init(self, db: InfrahubDatabase, **kwargs: Any) -> None: # noqa: ARG002
102
102
  query = """
103
103
  MATCH ()-[r]->()
104
104
  WHERE %(id_func)s(r) IN $ids
@@ -125,7 +125,7 @@ class RebaseBranchDeleteRelationshipQuery(Query):
125
125
  self.ids = ids
126
126
  super().__init__(**kwargs)
127
127
 
128
- async def query_init(self, db: InfrahubDatabase, **kwargs: Any) -> None:
128
+ async def query_init(self, db: InfrahubDatabase, **kwargs: Any) -> None: # noqa: ARG002
129
129
  if config.SETTINGS.database.db_type == config.DatabaseType.MEMGRAPH:
130
130
  query = """
131
131
  MATCH p = (s)-[r]-(d)
@@ -15,7 +15,7 @@ class DeleteAfterTimeQuery(Query):
15
15
  self.timestamp = timestamp
16
16
  super().__init__(**kwargs)
17
17
 
18
- async def query_init(self, db: InfrahubDatabase, **kwargs: Any) -> None:
18
+ async def query_init(self, db: InfrahubDatabase, **kwargs: Any) -> None: # noqa: ARG002
19
19
  self.params = {"timestamp": self.timestamp.to_string()}
20
20
  query_1 = """
21
21
  // ---------------------
@@ -63,7 +63,7 @@ class DiffCountChanges(Query):
63
63
  self.diff_to = diff_to
64
64
  super().__init__(**kwargs)
65
65
 
66
- async def query_init(self, db: InfrahubDatabase, **kwargs) -> None:
66
+ async def query_init(self, db: InfrahubDatabase, **kwargs) -> None: # noqa: ARG002
67
67
  self.params = {
68
68
  "from_time": self.diff_from.to_string(),
69
69
  "to_time": self.diff_to.to_string(),
@@ -137,6 +137,14 @@ CALL {
137
137
  r in relationships(latest_base_path)
138
138
  WHERE r.from < $branch_from_time
139
139
  )
140
+ // ------------------------
141
+ // special handling for nodes that had their kind updated,
142
+ // the migration leaves two nodes with the same UUID linked to the same Relationship
143
+ // ------------------------
144
+ AND (
145
+ n.uuid IS NULL OR base_prop.uuid IS NULL OR n.uuid <> base_prop.uuid
146
+ OR type(base_r_node) <> "IS_RELATED" OR type(base_r_prop) <> "IS_RELATED"
147
+ )
140
148
  WITH latest_base_path, base_r_root, base_r_node, base_r_prop
141
149
  ORDER BY base_r_prop.from DESC, base_r_node.from DESC, base_r_root.from DESC
142
150
  LIMIT 1
@@ -146,7 +154,7 @@ CALL {
146
154
  relationship_peer_side_query = """
147
155
  WITH diff_path, latest_base_path, has_more_data
148
156
  UNWIND [diff_path, latest_base_path] AS penultimate_path
149
- WITH penultimate_path, has_more_data
157
+ WITH DISTINCT penultimate_path, has_more_data
150
158
  CALL {
151
159
  WITH penultimate_path
152
160
  WITH penultimate_path, nodes(penultimate_path) AS d_nodes, relationships(penultimate_path) AS d_rels
@@ -175,8 +183,13 @@ CALL {
175
183
  OR peer_r_node.to IS NULL
176
184
  OR peer_r_node.to >= r_peer.from
177
185
  )
186
+ // ------------------------
187
+ // special handling for nodes that had their kind updated,
188
+ // the migration leaves two nodes with the same UUID linked to the same Relationship
189
+ // ------------------------
190
+ AND (n.uuid IS NULL OR peer.uuid IS NULL OR n.uuid <> peer.uuid)
178
191
  WITH peer_path, r_peer, r_prop
179
- ORDER BY r_peer.branch = r_prop.branch DESC, r_peer.from DESC
192
+ ORDER BY r_peer.branch = r_prop.branch DESC, r_peer.status = r_prop.status DESC, r_peer.from DESC, r_peer.status ASC
180
193
  LIMIT 1
181
194
  RETURN peer_path
182
195
  }
@@ -213,7 +226,7 @@ WITH reduce(
213
226
  class DiffNodePathsQuery(DiffCalculationQuery):
214
227
  name = "diff_node_paths"
215
228
 
216
- async def query_init(self, db: InfrahubDatabase, **kwargs: Any) -> None:
229
+ async def query_init(self, db: InfrahubDatabase, **kwargs: Any) -> None: # noqa: ARG002
217
230
  params_dict = self.get_params()
218
231
  self.params.update(params_dict)
219
232
  self.params.update(
@@ -309,6 +322,14 @@ CALL {
309
322
  AND [%(id_func)s(p), type(r_node)] <> [%(id_func)s(prop), type(r_prop)]
310
323
  AND top_diff_rel.status = r_node.status
311
324
  AND top_diff_rel.status = r_prop.status
325
+ // ------------------------
326
+ // special handling for nodes that had their kind updated,
327
+ // the migration leaves two nodes with the same UUID linked to the same Relationship
328
+ // ------------------------
329
+ AND (
330
+ p.uuid IS NULL OR prop.uuid IS NULL OR p.uuid <> prop.uuid
331
+ OR type(r_node) <> "IS_RELATED" OR type(r_prop) <> "IS_RELATED"
332
+ )
312
333
  WITH path, p, node, prop, r_prop, r_node, type(r_node) AS rel_type, row_from_time
313
334
  // -------------------------------------
314
335
  // Exclude attributes/relationships added then removed on branch within timeframe
@@ -344,7 +365,7 @@ CALL {
344
365
  class DiffFieldPathsQuery(DiffCalculationQuery):
345
366
  name = "diff_field_paths"
346
367
 
347
- async def query_init(self, db: InfrahubDatabase, **kwargs: Any) -> None:
368
+ async def query_init(self, db: InfrahubDatabase, **kwargs: Any) -> None: # noqa: ARG002
348
369
  params_dict = self.get_params()
349
370
  self.params.update(params_dict)
350
371
 
@@ -483,17 +504,26 @@ CALL {
483
504
  AND [%(id_func)s(p), type(mid_diff_rel)] <> [%(id_func)s(prop), type(r_prop)]
484
505
  // exclude paths where an active edge is below a deleted edge
485
506
  AND (mid_diff_rel.status = "active" OR r_prop.status = "deleted")
507
+ // ------------------------
508
+ // special handling for nodes that had their kind updated,
509
+ // the migration leaves two nodes with the same UUID linked to the same Relationship
510
+ // ------------------------
511
+ AND (
512
+ p.uuid IS NULL OR prop.uuid IS NULL OR p.uuid <> prop.uuid
513
+ OR type(mid_diff_rel) <> "IS_RELATED" OR type(r_prop) <> "IS_RELATED"
514
+ )
486
515
  WITH path, prop, r_prop, mid_r_root
487
516
  ORDER BY
488
517
  type(r_prop),
489
518
  mid_r_root.branch = mid_diff_rel.branch DESC,
519
+ (mid_diff_rel.status = r_prop.status AND mid_diff_rel.branch = r_prop.branch) DESC,
490
520
  r_prop.from DESC,
491
521
  mid_r_root.from DESC
492
522
  WITH prop, type(r_prop) AS type_r_prop, head(collect(path)) AS latest_prop_path
493
523
  RETURN latest_prop_path
494
524
  }
495
525
  // -------------------------------------
496
- // Exclude properties within the timeframe
526
+ // Exclude properties added and deleted within the timeframe
497
527
  // -------------------------------------
498
528
  WITH q, nodes(latest_prop_path)[3] AS prop, type(relationships(latest_prop_path)[2]) AS rel_type, latest_prop_path, has_more_data, row_from_time
499
529
  CALL {
@@ -518,7 +548,7 @@ WHERE intra_branch_update = FALSE
518
548
  class DiffPropertyPathsQuery(DiffCalculationQuery):
519
549
  name = "diff_property_paths"
520
550
 
521
- async def query_init(self, db: InfrahubDatabase, **kwargs: Any) -> None:
551
+ async def query_init(self, db: InfrahubDatabase, **kwargs: Any) -> None: # noqa: ARG002
522
552
  params_dict = self.get_params()
523
553
  self.params.update(params_dict)
524
554
 
@@ -594,6 +624,14 @@ AND (
594
624
  )
595
625
  )
596
626
  )
627
+ // ------------------------
628
+ // special handling for nodes that had their kind updated,
629
+ // the migration leaves two nodes with the same UUID linked to the same Relationship
630
+ // ------------------------
631
+ AND (
632
+ n.uuid IS NULL OR q.uuid IS NULL OR n.uuid <> q.uuid
633
+ OR type(r_node) <> "IS_RELATED" OR type(diff_rel) <> "IS_RELATED"
634
+ )
597
635
  AND ALL(
598
636
  r_pair IN [[r_root, r_node], [r_node, diff_rel]]
599
637
  // filter out paths where a base branch edge follows a branch edge
@@ -62,7 +62,7 @@ class IPPrefixSubnetFetch(Query):
62
62
 
63
63
  super().__init__(**kwargs)
64
64
 
65
- async def query_init(self, db: InfrahubDatabase, **kwargs) -> None:
65
+ async def query_init(self, db: InfrahubDatabase, **kwargs) -> None: # noqa: ARG002
66
66
  self.params["ns_id"] = self.namespace_id
67
67
 
68
68
  prefix_bin = convert_ip_to_binary_str(self.obj)[: self.obj.prefixlen]
@@ -153,7 +153,7 @@ class IPPrefixIPAddressFetch(Query):
153
153
 
154
154
  super().__init__(**kwargs)
155
155
 
156
- async def query_init(self, db: InfrahubDatabase, **kwargs) -> None:
156
+ async def query_init(self, db: InfrahubDatabase, **kwargs) -> None: # noqa: ARG002
157
157
  self.params["ns_id"] = self.namespace_id
158
158
 
159
159
  prefix_bin = convert_ip_to_binary_str(self.obj)[: self.obj.prefixlen]
@@ -261,7 +261,7 @@ class IPPrefixUtilization(Query):
261
261
 
262
262
  super().__init__(**kwargs)
263
263
 
264
- async def query_init(self, db: InfrahubDatabase, **kwargs) -> None:
264
+ async def query_init(self, db: InfrahubDatabase, **kwargs) -> None: # noqa: ARG002
265
265
  self.params["ids"] = [p.get_id() for p in self.ip_prefixes]
266
266
  self.params["time_at"] = self.at.to_string()
267
267
 
@@ -336,7 +336,7 @@ class IPPrefixReconcileQuery(Query):
336
336
  self.namespace_id = _get_namespace_id(namespace)
337
337
  super().__init__(**kwargs)
338
338
 
339
- async def query_init(self, db: InfrahubDatabase, **kwargs) -> None:
339
+ async def query_init(self, db: InfrahubDatabase, **kwargs) -> None: # noqa: ARG002
340
340
  branch_filter, branch_params = self.branch.get_query_filter_path(at=self.at.to_string())
341
341
  self.params.update(branch_params)
342
342
  self.params["namespace_kind"] = InfrahubKind.IPNAMESPACE
@@ -31,14 +31,13 @@ if TYPE_CHECKING:
31
31
  from infrahub.core.schema import GenericSchema, NodeSchema
32
32
  from infrahub.core.schema.profile_schema import ProfileSchema
33
33
  from infrahub.core.schema.relationship_schema import RelationshipSchema
34
+ from infrahub.core.schema.template_schema import TemplateSchema
34
35
  from infrahub.database import InfrahubDatabase
35
36
 
36
- # pylint: disable=consider-using-f-string,redefined-builtin,too-many-lines
37
-
38
37
 
39
38
  @dataclass
40
39
  class NodeToProcess:
41
- schema: Optional[Union[NodeSchema, ProfileSchema]]
40
+ schema: Optional[Union[NodeSchema, ProfileSchema, TemplateSchema]]
42
41
 
43
42
  node_id: str
44
43
  node_uuid: str
@@ -127,7 +126,7 @@ class NodeCreateAllQuery(NodeQuery):
127
126
 
128
127
  raise_error_if_empty: bool = True
129
128
 
130
- async def query_init(self, db: InfrahubDatabase, **kwargs) -> None:
129
+ async def query_init(self, db: InfrahubDatabase, **kwargs) -> None: # noqa: ARG002
131
130
  at = self.at or self.node._at
132
131
  self.params["uuid"] = self.node.id
133
132
  self.params["branch"] = self.branch.name
@@ -360,7 +359,7 @@ class NodeDeleteQuery(NodeQuery):
360
359
 
361
360
  raise_error_if_empty: bool = True
362
361
 
363
- async def query_init(self, db: InfrahubDatabase, **kwargs) -> None:
362
+ async def query_init(self, db: InfrahubDatabase, **kwargs) -> None: # noqa: ARG002
364
363
  self.params["uuid"] = self.node_id
365
364
  self.params["branch"] = self.branch.name
366
365
  self.params["branch_level"] = self.branch.hierarchy_level
@@ -390,7 +389,7 @@ class NodeCheckIDQuery(Query):
390
389
  self.node_id = node_id
391
390
  super().__init__(**kwargs)
392
391
 
393
- async def query_init(self, db: InfrahubDatabase, **kwargs) -> None:
392
+ async def query_init(self, db: InfrahubDatabase, **kwargs) -> None: # noqa: ARG002
394
393
  self.params["uuid"] = self.node_id
395
394
 
396
395
  query = """
@@ -430,7 +429,7 @@ class NodeListGetAttributeQuery(Query):
430
429
 
431
430
  super().__init__(order_by=["n.uuid", "a.name"], **kwargs)
432
431
 
433
- async def query_init(self, db: InfrahubDatabase, **kwargs) -> None:
432
+ async def query_init(self, db: InfrahubDatabase, **kwargs) -> None: # noqa: ARG002
434
433
  self.params["ids"] = self.ids
435
434
 
436
435
  branch_filter, branch_params = self.branch.get_query_filter_path(
@@ -479,11 +478,17 @@ class NodeListGetAttributeQuery(Query):
479
478
  self.return_labels = ["n", "a", "av", "r1", "r2"]
480
479
 
481
480
  # Add Is_Protected and Is_visible
481
+ rel_isv_branch_filter, _ = self.branch.get_query_filter_path(
482
+ at=self.at, branch_agnostic=self.branch_agnostic, variable_name="rel_isv"
483
+ )
484
+ rel_isp_branch_filter, _ = self.branch.get_query_filter_path(
485
+ at=self.at, branch_agnostic=self.branch_agnostic, variable_name="rel_isp"
486
+ )
482
487
  query = """
483
488
  MATCH (a)-[rel_isv:IS_VISIBLE]-(isv:Boolean)
484
489
  MATCH (a)-[rel_isp:IS_PROTECTED]-(isp:Boolean)
485
- WHERE all(r IN [rel_isv, rel_isp] WHERE ( %(branch_filter)s ))
486
- """ % {"branch_filter": branch_filter}
490
+ WHERE (%(rel_isv_branch_filter)s) AND (%(rel_isp_branch_filter)s)
491
+ """ % {"rel_isv_branch_filter": rel_isv_branch_filter, "rel_isp_branch_filter": rel_isp_branch_filter}
487
492
  self.add_to_query(query)
488
493
 
489
494
  self.return_labels.extend(["isv", "isp", "rel_isv", "rel_isp"])
@@ -601,7 +606,7 @@ class NodeListGetRelationshipsQuery(Query):
601
606
  self.relationship_identifiers = relationship_identifiers
602
607
  super().__init__(**kwargs)
603
608
 
604
- async def query_init(self, db: InfrahubDatabase, **kwargs) -> None:
609
+ async def query_init(self, db: InfrahubDatabase, **kwargs) -> None: # noqa: ARG002
605
610
  self.params["ids"] = self.ids
606
611
  self.params["relationship_identifiers"] = self.relationship_identifiers
607
612
 
@@ -657,7 +662,7 @@ class NodeGetKindQuery(Query):
657
662
  self.ids = ids
658
663
  super().__init__(**kwargs)
659
664
 
660
- async def query_init(self, db: InfrahubDatabase, **kwargs: Any) -> None:
665
+ async def query_init(self, db: InfrahubDatabase, **kwargs: Any) -> None: # noqa: ARG002
661
666
  query = """
662
667
  MATCH p = (root:Root)<-[r_root:IS_PART_OF]-(n:Node)
663
668
  WHERE n.uuid IN $ids
@@ -683,7 +688,7 @@ class NodeListGetInfoQuery(Query):
683
688
  self.ids = ids
684
689
  super().__init__(**kwargs)
685
690
 
686
- async def query_init(self, db: InfrahubDatabase, **kwargs: Any) -> None:
691
+ async def query_init(self, db: InfrahubDatabase, **kwargs: Any) -> None: # noqa: ARG002
687
692
  branch_filter, branch_params = self.branch.get_query_filter_path(
688
693
  at=self.at, branch_agnostic=self.branch_agnostic
689
694
  )
@@ -873,7 +878,7 @@ class NodeGetListQuery(Query):
873
878
  def _get_tracked_variables(self) -> list[str]:
874
879
  return self._variables_to_track
875
880
 
876
- async def query_init(self, db: InfrahubDatabase, **kwargs: Any) -> None:
881
+ async def query_init(self, db: InfrahubDatabase, **kwargs: Any) -> None: # noqa: ARG002
877
882
  self.order_by = []
878
883
 
879
884
  self.return_labels = ["n.uuid", "rb.branch", f"{db.get_id_function_name()}(rb) as rb_id"]
@@ -1272,7 +1277,7 @@ class NodeGetHierarchyQuery(Query):
1272
1277
 
1273
1278
  super().__init__(**kwargs)
1274
1279
 
1275
- async def query_init(self, db: InfrahubDatabase, **kwargs: Any) -> None: # pylint: disable=too-many-statements
1280
+ async def query_init(self, db: InfrahubDatabase, **kwargs: Any) -> None: # noqa: ARG002
1276
1281
  hierarchy_schema = self.node_schema.get_hierarchy_schema(db=db, branch=self.branch)
1277
1282
  branch_filter, branch_params = self.branch.get_query_filter_path(at=self.at.to_string())
1278
1283
  self.params.update(branch_params)