infrahub-server 1.2.0rc0__py3-none-any.whl → 1.2.2__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 (365) hide show
  1. infrahub/api/dependencies.py +6 -6
  2. infrahub/api/diff/validation_models.py +7 -7
  3. infrahub/api/schema.py +1 -1
  4. infrahub/artifacts/models.py +5 -3
  5. infrahub/artifacts/tasks.py +3 -5
  6. infrahub/cli/__init__.py +13 -9
  7. infrahub/cli/constants.py +3 -0
  8. infrahub/cli/db.py +165 -183
  9. infrahub/cli/upgrade.py +146 -0
  10. infrahub/computed_attribute/gather.py +185 -0
  11. infrahub/computed_attribute/models.py +240 -12
  12. infrahub/computed_attribute/tasks.py +72 -432
  13. infrahub/computed_attribute/triggers.py +13 -47
  14. infrahub/config.py +43 -32
  15. infrahub/context.py +14 -0
  16. infrahub/core/account.py +4 -4
  17. infrahub/core/attribute.py +58 -58
  18. infrahub/core/branch/tasks.py +74 -22
  19. infrahub/core/changelog/diff.py +95 -36
  20. infrahub/core/changelog/models.py +217 -43
  21. infrahub/core/constants/__init__.py +28 -0
  22. infrahub/core/constants/infrahubkind.py +2 -0
  23. infrahub/core/constants/schema.py +2 -0
  24. infrahub/core/constraint/node/runner.py +9 -8
  25. infrahub/core/diff/branch_differ.py +10 -10
  26. infrahub/core/diff/enricher/cardinality_one.py +5 -0
  27. infrahub/core/diff/enricher/hierarchy.py +17 -4
  28. infrahub/core/diff/enricher/labels.py +5 -0
  29. infrahub/core/diff/enricher/path_identifier.py +4 -0
  30. infrahub/core/diff/ipam_diff_parser.py +4 -5
  31. infrahub/core/diff/model/diff.py +27 -27
  32. infrahub/core/diff/model/path.py +32 -9
  33. infrahub/core/diff/parent_node_adder.py +78 -0
  34. infrahub/core/diff/payload_builder.py +13 -2
  35. infrahub/core/diff/query/filters.py +2 -2
  36. infrahub/core/diff/query/merge.py +20 -17
  37. infrahub/core/diff/query/save.py +188 -182
  38. infrahub/core/diff/query/summary_counts_enricher.py +51 -4
  39. infrahub/core/diff/query_parser.py +4 -4
  40. infrahub/core/diff/repository/deserializer.py +8 -3
  41. infrahub/core/diff/repository/repository.py +156 -38
  42. infrahub/core/diff/tasks.py +4 -4
  43. infrahub/core/graph/__init__.py +1 -1
  44. infrahub/core/graph/index.py +3 -0
  45. infrahub/core/initialization.py +1 -10
  46. infrahub/core/ipam/constants.py +3 -4
  47. infrahub/core/ipam/reconciler.py +12 -12
  48. infrahub/core/ipam/utilization.py +10 -13
  49. infrahub/core/manager.py +36 -36
  50. infrahub/core/merge.py +7 -7
  51. infrahub/core/migrations/__init__.py +2 -3
  52. infrahub/core/migrations/graph/__init__.py +12 -3
  53. infrahub/core/migrations/graph/m017_add_core_profile.py +1 -5
  54. infrahub/core/migrations/graph/m018_uniqueness_nulls.py +4 -4
  55. infrahub/core/migrations/graph/m019_restore_rels_to_time.py +256 -0
  56. infrahub/core/migrations/graph/m020_duplicate_edges.py +160 -0
  57. infrahub/core/migrations/graph/m021_missing_hierarchy_merge.py +51 -0
  58. infrahub/core/migrations/graph/m022_add_generate_template_attr.py +48 -0
  59. infrahub/core/migrations/graph/m023_deduplicate_cardinality_one_relationships.py +96 -0
  60. infrahub/core/migrations/query/attribute_add.py +2 -2
  61. infrahub/core/migrations/query/node_duplicate.py +43 -26
  62. infrahub/core/migrations/query/schema_attribute_update.py +2 -2
  63. infrahub/core/migrations/schema/models.py +19 -4
  64. infrahub/core/migrations/schema/node_remove.py +26 -12
  65. infrahub/core/migrations/schema/tasks.py +2 -2
  66. infrahub/core/migrations/shared.py +16 -16
  67. infrahub/core/models.py +15 -6
  68. infrahub/core/node/__init__.py +43 -39
  69. infrahub/core/node/base.py +2 -4
  70. infrahub/core/node/constraints/attribute_uniqueness.py +2 -2
  71. infrahub/core/node/constraints/grouped_uniqueness.py +99 -47
  72. infrahub/core/node/constraints/interface.py +1 -2
  73. infrahub/core/node/delete_validator.py +3 -5
  74. infrahub/core/node/ipam.py +4 -4
  75. infrahub/core/node/permissions.py +7 -7
  76. infrahub/core/node/resource_manager/ip_address_pool.py +6 -6
  77. infrahub/core/node/resource_manager/ip_prefix_pool.py +6 -6
  78. infrahub/core/node/resource_manager/number_pool.py +3 -3
  79. infrahub/core/path.py +12 -12
  80. infrahub/core/property.py +11 -11
  81. infrahub/core/protocols.py +7 -0
  82. infrahub/core/protocols_base.py +21 -21
  83. infrahub/core/query/__init__.py +33 -33
  84. infrahub/core/query/attribute.py +6 -4
  85. infrahub/core/query/diff.py +3 -3
  86. infrahub/core/query/node.py +98 -37
  87. infrahub/core/query/relationship.py +228 -40
  88. infrahub/core/query/resource_manager.py +2 -0
  89. infrahub/core/query/standard_node.py +3 -3
  90. infrahub/core/query/subquery.py +9 -9
  91. infrahub/core/registry.py +13 -15
  92. infrahub/core/relationship/constraints/count.py +3 -4
  93. infrahub/core/relationship/constraints/peer_kind.py +3 -4
  94. infrahub/core/relationship/constraints/profiles_kind.py +2 -2
  95. infrahub/core/relationship/model.py +51 -59
  96. infrahub/core/schema/attribute_schema.py +16 -8
  97. infrahub/core/schema/basenode_schema.py +105 -44
  98. infrahub/core/schema/computed_attribute.py +3 -3
  99. infrahub/core/schema/definitions/core/__init__.py +147 -0
  100. infrahub/core/schema/definitions/core/account.py +171 -0
  101. infrahub/core/schema/definitions/core/artifact.py +136 -0
  102. infrahub/core/schema/definitions/core/builtin.py +24 -0
  103. infrahub/core/schema/definitions/core/check.py +68 -0
  104. infrahub/core/schema/definitions/core/core.py +17 -0
  105. infrahub/core/schema/definitions/core/generator.py +100 -0
  106. infrahub/core/schema/definitions/core/graphql_query.py +79 -0
  107. infrahub/core/schema/definitions/core/group.py +108 -0
  108. infrahub/core/schema/definitions/core/ipam.py +193 -0
  109. infrahub/core/schema/definitions/core/lineage.py +19 -0
  110. infrahub/core/schema/definitions/core/menu.py +48 -0
  111. infrahub/core/schema/definitions/core/permission.py +163 -0
  112. infrahub/core/schema/definitions/core/profile.py +18 -0
  113. infrahub/core/schema/definitions/core/propose_change.py +97 -0
  114. infrahub/core/schema/definitions/core/propose_change_comment.py +193 -0
  115. infrahub/core/schema/definitions/core/propose_change_validator.py +328 -0
  116. infrahub/core/schema/definitions/core/repository.py +286 -0
  117. infrahub/core/schema/definitions/core/resource_pool.py +170 -0
  118. infrahub/core/schema/definitions/core/template.py +27 -0
  119. infrahub/core/schema/definitions/core/transform.py +96 -0
  120. infrahub/core/schema/definitions/core/webhook.py +134 -0
  121. infrahub/core/schema/definitions/internal.py +16 -16
  122. infrahub/core/schema/dropdown.py +3 -4
  123. infrahub/core/schema/generated/attribute_schema.py +15 -18
  124. infrahub/core/schema/generated/base_node_schema.py +12 -14
  125. infrahub/core/schema/generated/node_schema.py +3 -5
  126. infrahub/core/schema/generated/relationship_schema.py +9 -11
  127. infrahub/core/schema/generic_schema.py +2 -2
  128. infrahub/core/schema/manager.py +20 -9
  129. infrahub/core/schema/node_schema.py +4 -2
  130. infrahub/core/schema/relationship_schema.py +14 -6
  131. infrahub/core/schema/schema_branch.py +292 -144
  132. infrahub/core/schema/schema_branch_computed.py +41 -4
  133. infrahub/core/task/task.py +3 -3
  134. infrahub/core/task/user_task.py +15 -15
  135. infrahub/core/timestamp.py +3 -3
  136. infrahub/core/utils.py +20 -18
  137. infrahub/core/validators/__init__.py +1 -3
  138. infrahub/core/validators/aggregated_checker.py +2 -2
  139. infrahub/core/validators/attribute/choices.py +2 -2
  140. infrahub/core/validators/attribute/enum.py +2 -2
  141. infrahub/core/validators/attribute/kind.py +2 -2
  142. infrahub/core/validators/attribute/length.py +2 -2
  143. infrahub/core/validators/attribute/optional.py +2 -2
  144. infrahub/core/validators/attribute/regex.py +2 -2
  145. infrahub/core/validators/attribute/unique.py +2 -2
  146. infrahub/core/validators/checks_runner.py +25 -2
  147. infrahub/core/validators/determiner.py +1 -3
  148. infrahub/core/validators/interface.py +6 -2
  149. infrahub/core/validators/model.py +22 -3
  150. infrahub/core/validators/models/validate_migration.py +17 -4
  151. infrahub/core/validators/node/attribute.py +2 -2
  152. infrahub/core/validators/node/generate_profile.py +2 -2
  153. infrahub/core/validators/node/hierarchy.py +3 -5
  154. infrahub/core/validators/node/inherit_from.py +27 -5
  155. infrahub/core/validators/node/relationship.py +2 -2
  156. infrahub/core/validators/relationship/count.py +4 -4
  157. infrahub/core/validators/relationship/optional.py +2 -2
  158. infrahub/core/validators/relationship/peer.py +2 -2
  159. infrahub/core/validators/shared.py +2 -2
  160. infrahub/core/validators/tasks.py +8 -0
  161. infrahub/core/validators/uniqueness/checker.py +22 -21
  162. infrahub/core/validators/uniqueness/index.py +2 -2
  163. infrahub/core/validators/uniqueness/model.py +11 -11
  164. infrahub/database/__init__.py +27 -22
  165. infrahub/database/metrics.py +7 -1
  166. infrahub/dependencies/builder/constraint/grouped/node_runner.py +1 -3
  167. infrahub/dependencies/builder/diff/deserializer.py +3 -1
  168. infrahub/dependencies/builder/diff/enricher/hierarchy.py +3 -1
  169. infrahub/dependencies/builder/diff/parent_node_adder.py +8 -0
  170. infrahub/dependencies/component/registry.py +2 -2
  171. infrahub/events/__init__.py +25 -2
  172. infrahub/events/artifact_action.py +64 -0
  173. infrahub/events/branch_action.py +33 -22
  174. infrahub/events/generator.py +71 -0
  175. infrahub/events/group_action.py +51 -21
  176. infrahub/events/models.py +18 -19
  177. infrahub/events/node_action.py +88 -37
  178. infrahub/events/repository_action.py +5 -18
  179. infrahub/events/schema_action.py +4 -9
  180. infrahub/events/utils.py +16 -0
  181. infrahub/events/validator_action.py +55 -0
  182. infrahub/exceptions.py +62 -26
  183. infrahub/generators/models.py +2 -3
  184. infrahub/generators/tasks.py +24 -4
  185. infrahub/git/base.py +87 -36
  186. infrahub/git/integrator.py +48 -48
  187. infrahub/git/models.py +101 -9
  188. infrahub/git/repository.py +3 -3
  189. infrahub/git/tasks.py +408 -6
  190. infrahub/git/utils.py +48 -0
  191. infrahub/git/worktree.py +1 -2
  192. infrahub/git_credential/askpass.py +1 -2
  193. infrahub/graphql/analyzer.py +12 -0
  194. infrahub/graphql/app.py +13 -15
  195. infrahub/graphql/context.py +39 -0
  196. infrahub/graphql/initialization.py +3 -0
  197. infrahub/graphql/loaders/node.py +2 -12
  198. infrahub/graphql/loaders/peers.py +77 -0
  199. infrahub/graphql/loaders/shared.py +13 -0
  200. infrahub/graphql/manager.py +17 -19
  201. infrahub/graphql/mutations/artifact_definition.py +5 -5
  202. infrahub/graphql/mutations/branch.py +26 -1
  203. infrahub/graphql/mutations/computed_attribute.py +9 -5
  204. infrahub/graphql/mutations/diff.py +23 -11
  205. infrahub/graphql/mutations/diff_conflict.py +5 -0
  206. infrahub/graphql/mutations/generator.py +83 -0
  207. infrahub/graphql/mutations/graphql_query.py +5 -5
  208. infrahub/graphql/mutations/ipam.py +54 -74
  209. infrahub/graphql/mutations/main.py +195 -132
  210. infrahub/graphql/mutations/menu.py +7 -7
  211. infrahub/graphql/mutations/models.py +2 -4
  212. infrahub/graphql/mutations/node_getter/by_default_filter.py +10 -10
  213. infrahub/graphql/mutations/node_getter/by_hfid.py +1 -3
  214. infrahub/graphql/mutations/node_getter/by_id.py +1 -3
  215. infrahub/graphql/mutations/node_getter/interface.py +1 -2
  216. infrahub/graphql/mutations/proposed_change.py +7 -7
  217. infrahub/graphql/mutations/relationship.py +93 -19
  218. infrahub/graphql/mutations/repository.py +8 -8
  219. infrahub/graphql/mutations/resource_manager.py +3 -3
  220. infrahub/graphql/mutations/schema.py +19 -4
  221. infrahub/graphql/mutations/webhook.py +137 -0
  222. infrahub/graphql/parser.py +4 -4
  223. infrahub/graphql/permissions.py +1 -10
  224. infrahub/graphql/queries/diff/tree.py +19 -14
  225. infrahub/graphql/queries/event.py +5 -2
  226. infrahub/graphql/queries/ipam.py +2 -2
  227. infrahub/graphql/queries/relationship.py +2 -2
  228. infrahub/graphql/queries/search.py +2 -2
  229. infrahub/graphql/resolvers/many_relationship.py +264 -0
  230. infrahub/graphql/resolvers/resolver.py +13 -110
  231. infrahub/graphql/schema.py +2 -0
  232. infrahub/graphql/subscription/graphql_query.py +2 -0
  233. infrahub/graphql/types/context.py +12 -0
  234. infrahub/graphql/types/event.py +84 -17
  235. infrahub/graphql/types/node.py +2 -2
  236. infrahub/graphql/utils.py +2 -2
  237. infrahub/groups/ancestors.py +29 -0
  238. infrahub/groups/parsers.py +107 -0
  239. infrahub/lock.py +20 -20
  240. infrahub/menu/constants.py +0 -1
  241. infrahub/menu/generator.py +9 -21
  242. infrahub/menu/menu.py +17 -38
  243. infrahub/menu/models.py +117 -16
  244. infrahub/menu/repository.py +111 -0
  245. infrahub/menu/utils.py +5 -8
  246. infrahub/message_bus/__init__.py +11 -13
  247. infrahub/message_bus/messages/__init__.py +1 -21
  248. infrahub/message_bus/messages/check_generator_run.py +3 -3
  249. infrahub/message_bus/messages/finalize_validator_execution.py +3 -0
  250. infrahub/message_bus/messages/proposed_change/request_proposedchange_refreshartifacts.py +6 -0
  251. infrahub/message_bus/messages/request_generatordefinition_check.py +2 -0
  252. infrahub/message_bus/messages/send_echo_request.py +1 -1
  253. infrahub/message_bus/operations/__init__.py +1 -10
  254. infrahub/message_bus/operations/check/__init__.py +2 -2
  255. infrahub/message_bus/operations/check/generator.py +1 -0
  256. infrahub/message_bus/operations/event/__init__.py +2 -2
  257. infrahub/message_bus/operations/event/worker.py +0 -3
  258. infrahub/message_bus/operations/finalize/validator.py +51 -1
  259. infrahub/message_bus/operations/requests/__init__.py +0 -2
  260. infrahub/message_bus/operations/requests/generator_definition.py +21 -23
  261. infrahub/message_bus/operations/requests/proposed_change.py +14 -10
  262. infrahub/permissions/globals.py +15 -0
  263. infrahub/pools/number.py +2 -4
  264. infrahub/proposed_change/models.py +3 -0
  265. infrahub/proposed_change/tasks.py +58 -45
  266. infrahub/pytest_plugin.py +13 -10
  267. infrahub/server.py +2 -3
  268. infrahub/services/__init__.py +2 -2
  269. infrahub/services/adapters/cache/__init__.py +4 -6
  270. infrahub/services/adapters/cache/nats.py +4 -5
  271. infrahub/services/adapters/cache/redis.py +3 -7
  272. infrahub/services/adapters/event/__init__.py +1 -1
  273. infrahub/services/adapters/message_bus/__init__.py +3 -3
  274. infrahub/services/adapters/message_bus/local.py +2 -2
  275. infrahub/services/adapters/message_bus/nats.py +4 -4
  276. infrahub/services/adapters/message_bus/rabbitmq.py +4 -4
  277. infrahub/services/adapters/workflow/local.py +2 -2
  278. infrahub/services/component.py +5 -5
  279. infrahub/services/protocols.py +7 -7
  280. infrahub/services/scheduler.py +1 -3
  281. infrahub/task_manager/event.py +102 -9
  282. infrahub/task_manager/models.py +27 -7
  283. infrahub/tasks/artifact.py +7 -6
  284. infrahub/telemetry/__init__.py +0 -0
  285. infrahub/telemetry/constants.py +9 -0
  286. infrahub/telemetry/database.py +86 -0
  287. infrahub/telemetry/models.py +65 -0
  288. infrahub/telemetry/task_manager.py +77 -0
  289. infrahub/{tasks/telemetry.py → telemetry/tasks.py} +49 -56
  290. infrahub/telemetry/utils.py +11 -0
  291. infrahub/trace.py +4 -4
  292. infrahub/transformations/tasks.py +2 -2
  293. infrahub/trigger/catalogue.py +4 -6
  294. infrahub/trigger/constants.py +0 -8
  295. infrahub/trigger/models.py +54 -5
  296. infrahub/trigger/setup.py +90 -0
  297. infrahub/trigger/tasks.py +35 -83
  298. infrahub/utils.py +11 -1
  299. infrahub/validators/__init__.py +0 -0
  300. infrahub/validators/events.py +42 -0
  301. infrahub/validators/tasks.py +41 -0
  302. infrahub/webhook/gather.py +17 -0
  303. infrahub/webhook/models.py +176 -44
  304. infrahub/webhook/tasks.py +154 -155
  305. infrahub/webhook/triggers.py +31 -7
  306. infrahub/workers/infrahub_async.py +2 -2
  307. infrahub/workers/utils.py +2 -2
  308. infrahub/workflows/catalogue.py +86 -35
  309. infrahub/workflows/initialization.py +8 -2
  310. infrahub/workflows/models.py +27 -1
  311. infrahub/workflows/utils.py +15 -6
  312. infrahub_sdk/client.py +35 -8
  313. infrahub_sdk/config.py +3 -0
  314. infrahub_sdk/context.py +13 -0
  315. infrahub_sdk/ctl/branch.py +3 -2
  316. infrahub_sdk/ctl/cli_commands.py +5 -1
  317. infrahub_sdk/ctl/utils.py +0 -16
  318. infrahub_sdk/exceptions.py +12 -0
  319. infrahub_sdk/generator.py +4 -1
  320. infrahub_sdk/graphql.py +45 -13
  321. infrahub_sdk/node.py +73 -22
  322. infrahub_sdk/protocols.py +21 -8
  323. infrahub_sdk/protocols_base.py +32 -11
  324. infrahub_sdk/query_groups.py +6 -35
  325. infrahub_sdk/schema/__init__.py +55 -26
  326. infrahub_sdk/schema/main.py +8 -0
  327. infrahub_sdk/task/__init__.py +11 -0
  328. infrahub_sdk/task/constants.py +3 -0
  329. infrahub_sdk/task/exceptions.py +25 -0
  330. infrahub_sdk/task/manager.py +551 -0
  331. infrahub_sdk/task/models.py +74 -0
  332. infrahub_sdk/testing/schemas/animal.py +9 -0
  333. infrahub_sdk/timestamp.py +142 -33
  334. infrahub_sdk/utils.py +29 -1
  335. {infrahub_server-1.2.0rc0.dist-info → infrahub_server-1.2.2.dist-info}/METADATA +8 -6
  336. {infrahub_server-1.2.0rc0.dist-info → infrahub_server-1.2.2.dist-info}/RECORD +349 -293
  337. {infrahub_server-1.2.0rc0.dist-info → infrahub_server-1.2.2.dist-info}/entry_points.txt +1 -0
  338. infrahub_testcontainers/constants.py +2 -0
  339. infrahub_testcontainers/container.py +157 -12
  340. infrahub_testcontainers/docker-compose.test.yml +31 -6
  341. infrahub_testcontainers/helpers.py +18 -73
  342. infrahub_testcontainers/host.py +41 -0
  343. infrahub_testcontainers/measurements.py +93 -0
  344. infrahub_testcontainers/models.py +38 -0
  345. infrahub_testcontainers/performance_test.py +166 -0
  346. infrahub_testcontainers/plugin.py +136 -0
  347. infrahub_testcontainers/prometheus.yml +30 -0
  348. infrahub/core/schema/definitions/core.py +0 -2286
  349. infrahub/message_bus/messages/check_repository_checkdefinition.py +0 -20
  350. infrahub/message_bus/messages/check_repository_mergeconflicts.py +0 -16
  351. infrahub/message_bus/messages/check_repository_usercheck.py +0 -26
  352. infrahub/message_bus/messages/event_branch_create.py +0 -11
  353. infrahub/message_bus/messages/event_branch_delete.py +0 -11
  354. infrahub/message_bus/messages/event_branch_rebased.py +0 -9
  355. infrahub/message_bus/messages/event_node_mutated.py +0 -15
  356. infrahub/message_bus/messages/event_schema_update.py +0 -9
  357. infrahub/message_bus/messages/request_repository_checks.py +0 -12
  358. infrahub/message_bus/messages/request_repository_userchecks.py +0 -18
  359. infrahub/message_bus/operations/check/repository.py +0 -293
  360. infrahub/message_bus/operations/event/node.py +0 -20
  361. infrahub/message_bus/operations/event/schema.py +0 -17
  362. infrahub/message_bus/operations/requests/repository.py +0 -133
  363. infrahub/webhook/constants.py +0 -1
  364. {infrahub_server-1.2.0rc0.dist-info → infrahub_server-1.2.2.dist-info}/LICENSE.txt +0 -0
  365. {infrahub_server-1.2.0rc0.dist-info → infrahub_server-1.2.2.dist-info}/WHEEL +0 -0
@@ -1,58 +1,22 @@
1
+ from infrahub.events.branch_action import BranchDeletedEvent
2
+ from infrahub.events.repository_action import CommitUpdatedEvent
3
+ from infrahub.events.schema_action import SchemaUpdatedEvent
1
4
  from infrahub.trigger.models import BuiltinTriggerDefinition, EventTrigger, ExecuteWorkflow
2
5
  from infrahub.workflows.catalogue import (
3
- COMPUTED_ATTRIBUTE_REMOVE_PYTHON,
4
- COMPUTED_ATTRIBUTE_SETUP,
6
+ COMPUTED_ATTRIBUTE_SETUP_JINJA2,
5
7
  COMPUTED_ATTRIBUTE_SETUP_PYTHON,
6
8
  )
7
9
 
8
- TRIGGER_COMPUTED_ATTRIBUTE_PYTHON_SETUP_BRANCH = BuiltinTriggerDefinition(
9
- name="computed-attribute-python-setup-on-branch-creation",
10
- previous_names={"Trigger-schema-update-event"},
11
- description="Trigger actions on branch create event",
12
- trigger=EventTrigger(events={"infrahub.branch.created"}),
13
- actions=[
14
- ExecuteWorkflow(
15
- name=COMPUTED_ATTRIBUTE_SETUP_PYTHON.name,
16
- parameters={
17
- "branch_name": "{{ event.resource['infrahub.branch.name'] }}",
18
- "trigger_updates": False,
19
- "context": {
20
- "__prefect_kind": "json",
21
- "value": {"__prefect_kind": "jinja", "template": "{{ event.payload['context'] | tojson }}"},
22
- },
23
- },
24
- )
25
- ],
26
- )
27
-
28
10
  TRIGGER_COMPUTED_ATTRIBUTE_PYTHON_SETUP_COMMIT = BuiltinTriggerDefinition(
29
11
  name="computed-attribute-python-setup-on-commit",
30
- description="Trigger actions on branch create event",
31
- trigger=EventTrigger(events={"infrahub.repository.update_commit"}),
12
+ trigger=EventTrigger(events={CommitUpdatedEvent.event_name}),
32
13
  actions=[
33
14
  ExecuteWorkflow(
34
- name=COMPUTED_ATTRIBUTE_SETUP_PYTHON.name,
15
+ workflow=COMPUTED_ATTRIBUTE_SETUP_PYTHON,
35
16
  parameters={
36
17
  "branch_name": "{{ event.resource['infrahub.branch.name'] }}",
37
18
  "commit": "{{ event.payload['commit'] }}",
38
- "context": {
39
- "__prefect_kind": "json",
40
- "value": {"__prefect_kind": "jinja", "template": "{{ event.payload['context'] | tojson }}"},
41
- },
42
- },
43
- )
44
- ],
45
- )
46
-
47
- TRIGGER_COMPUTED_ATTRIBUTE_PYTHON_CLEAN_BRANCH = BuiltinTriggerDefinition(
48
- name="computed-attribute-python-cleanup-on-branch-deletion",
49
- description="Trigger actions on branch delete event",
50
- trigger=EventTrigger(events={"infrahub.branch.deleted"}),
51
- actions=[
52
- ExecuteWorkflow(
53
- name=COMPUTED_ATTRIBUTE_REMOVE_PYTHON.name,
54
- parameters={
55
- "branch_name": "{{ event.resource['infrahub.branch.name'] }}",
19
+ "event_name": "{{ event.event }}",
56
20
  "context": {
57
21
  "__prefect_kind": "json",
58
22
  "value": {"__prefect_kind": "jinja", "template": "{{ event.payload['context'] | tojson }}"},
@@ -63,13 +27,14 @@ TRIGGER_COMPUTED_ATTRIBUTE_PYTHON_CLEAN_BRANCH = BuiltinTriggerDefinition(
63
27
  )
64
28
 
65
29
  TRIGGER_COMPUTED_ATTRIBUTE_ALL_SCHEMA = BuiltinTriggerDefinition(
66
- name="computed-attribute-all-setup-on-schema-update",
67
- trigger=EventTrigger(events={"infrahub.schema.update"}),
30
+ name="computed-attribute-setup-all",
31
+ trigger=EventTrigger(events={SchemaUpdatedEvent.event_name, BranchDeletedEvent.event_name}),
68
32
  actions=[
69
33
  ExecuteWorkflow(
70
- name=COMPUTED_ATTRIBUTE_SETUP.name,
34
+ workflow=COMPUTED_ATTRIBUTE_SETUP_JINJA2,
71
35
  parameters={
72
36
  "branch_name": "{{ event.resource['infrahub.branch.name'] }}",
37
+ "event_name": "{{ event.event }}",
73
38
  "context": {
74
39
  "__prefect_kind": "json",
75
40
  "value": {"__prefect_kind": "jinja", "template": "{{ event.payload['context'] | tojson }}"},
@@ -77,9 +42,10 @@ TRIGGER_COMPUTED_ATTRIBUTE_ALL_SCHEMA = BuiltinTriggerDefinition(
77
42
  },
78
43
  ),
79
44
  ExecuteWorkflow(
80
- name=COMPUTED_ATTRIBUTE_SETUP_PYTHON.name,
45
+ workflow=COMPUTED_ATTRIBUTE_SETUP_PYTHON,
81
46
  parameters={
82
47
  "branch_name": "{{ event.resource['infrahub.branch.name'] }}",
48
+ "event_name": "{{ event.event }}",
83
49
  "context": {
84
50
  "__prefect_kind": "json",
85
51
  "value": {"__prefect_kind": "jinja", "template": "{{ event.payload['context'] | tojson }}"},
infrahub/config.py CHANGED
@@ -6,7 +6,7 @@ import sys
6
6
  from dataclasses import dataclass
7
7
  from enum import Enum
8
8
  from pathlib import Path
9
- from typing import TYPE_CHECKING, Any, Optional
9
+ from typing import TYPE_CHECKING, Any
10
10
 
11
11
  import toml
12
12
  from infrahub_sdk.utils import generate_uuid
@@ -140,7 +140,7 @@ class MainSettings(BaseSettings):
140
140
  default=Path("/opt/infrahub/docs/build/search-index.json"),
141
141
  description="Full path of saved json containing pre-indexed documentation",
142
142
  )
143
- internal_address: Optional[str] = Field(default=None)
143
+ internal_address: str | None = Field(default=None)
144
144
  allow_anonymous_access: bool = Field(
145
145
  default=True, description="Indicates if the system allows anonymous read access"
146
146
  )
@@ -153,10 +153,15 @@ class MainSettings(BaseSettings):
153
153
  default=["infrahub.permissions.LocalPermissionBackend"],
154
154
  description="List of modules to handle permissions, they will be run in the given order",
155
155
  )
156
- public_url: Optional[str] = Field(
156
+ public_url: str | None = Field(
157
157
  default=None,
158
158
  description="Define the public URL of the Infrahub, might be required for OAuth2 and OIDC depending on your infrastructure.",
159
159
  )
160
+ schema_strict_mode: bool = Field(
161
+ default=True,
162
+ description="Enable strict schema validation. When set to `False`, "
163
+ "`human_friendly_id` schema fields should not necessarily target a unique combination of peer attributes.",
164
+ )
160
165
 
161
166
  @field_validator("docs_index_path", mode="before")
162
167
  @classmethod
@@ -231,10 +236,10 @@ class DatabaseSettings(BaseSettings):
231
236
  password: str = "admin"
232
237
  address: str = "localhost"
233
238
  port: int = 7687
234
- database: Optional[str] = Field(default=None, pattern=VALID_DATABASE_NAME_REGEX, description="Name of the database")
239
+ database: str | None = Field(default=None, pattern=VALID_DATABASE_NAME_REGEX, description="Name of the database")
235
240
  tls_enabled: bool = Field(default=False, description="Indicates if TLS is enabled for the connection")
236
241
  tls_insecure: bool = Field(default=False, description="Indicates if TLS certificates are verified")
237
- tls_ca_file: Optional[str] = Field(default=None, description="File path to CA cert or bundle in PEM format")
242
+ tls_ca_file: str | None = Field(default=None, description="File path to CA cert or bundle in PEM format")
238
243
  query_size_limit: int = Field(
239
244
  default=5_000,
240
245
  ge=1,
@@ -249,6 +254,12 @@ class DatabaseSettings(BaseSettings):
249
254
  retry_limit: int = Field(
250
255
  default=3, description="Maximum number of times a transient issue in a transaction should be retried."
251
256
  )
257
+ max_concurrent_queries: int = Field(
258
+ default=0, ge=0, description="Maximum number of concurrent queries that can run (0 means unlimited)."
259
+ )
260
+ max_concurrent_queries_delay: float = Field(
261
+ default=0.01, ge=0, description="Delay to add when max_concurrent_queries is reached."
262
+ )
252
263
 
253
264
  @property
254
265
  def database_name(self) -> str:
@@ -271,12 +282,12 @@ class BrokerSettings(BaseSettings):
271
282
  enable: bool = True
272
283
  tls_enabled: bool = Field(default=False, description="Indicates if TLS is enabled for the connection")
273
284
  tls_insecure: bool = Field(default=False, description="Indicates if TLS certificates are verified")
274
- tls_ca_file: Optional[str] = Field(default=None, description="File path to CA cert or bundle in PEM format")
285
+ tls_ca_file: str | None = Field(default=None, description="File path to CA cert or bundle in PEM format")
275
286
  username: str = "infrahub"
276
287
  password: str = "infrahub"
277
288
  address: str = "localhost"
278
- port: Optional[int] = Field(default=None, ge=1, le=65535, description="Specified if running on a non default port.")
279
- rabbitmq_http_port: Optional[int] = Field(default=None, ge=1, le=65535)
289
+ port: int | None = Field(default=None, ge=1, le=65535, description="Specified if running on a non default port.")
290
+ rabbitmq_http_port: int | None = Field(default=None, ge=1, le=65535)
280
291
  namespace: str = "infrahub"
281
292
  maximum_message_retries: int = Field(
282
293
  default=10, description="The maximum number of retries that are attempted for failed messages"
@@ -299,7 +310,7 @@ class CacheSettings(BaseSettings):
299
310
  model_config = SettingsConfigDict(env_prefix="INFRAHUB_CACHE_")
300
311
  enable: bool = True
301
312
  address: str = "localhost"
302
- port: Optional[int] = Field(
313
+ port: int | None = Field(
303
314
  default=None, ge=1, le=65535, description="Specified if running on a non default port (6379)"
304
315
  )
305
316
  database: int = Field(default=0, ge=0, le=15, description="Id of the database to use")
@@ -308,7 +319,7 @@ class CacheSettings(BaseSettings):
308
319
  password: str = ""
309
320
  tls_enabled: bool = Field(default=False, description="Indicates if TLS is enabled for the connection")
310
321
  tls_insecure: bool = Field(default=False, description="Indicates if TLS certificates are verified")
311
- tls_ca_file: Optional[str] = Field(default=None, description="File path to CA cert or bundle in PEM format")
322
+ tls_ca_file: str | None = Field(default=None, description="File path to CA cert or bundle in PEM format")
312
323
 
313
324
  @property
314
325
  def service_port(self) -> int:
@@ -322,7 +333,7 @@ class WorkflowSettings(BaseSettings):
322
333
  model_config = SettingsConfigDict(env_prefix="INFRAHUB_WORKFLOW_")
323
334
  enable: bool = True
324
335
  address: str = "localhost"
325
- port: Optional[int] = Field(default=None, ge=1, le=65535, description="Specified if running on a non default port.")
336
+ port: int | None = Field(default=None, ge=1, le=65535, description="Specified if running on a non default port.")
326
337
  tls_enabled: bool = Field(default=False, description="Indicates if TLS is enabled for the connection")
327
338
  driver: WorkflowDriver = WorkflowDriver.WORKER
328
339
  default_worker_type: str = "infrahubasync"
@@ -437,10 +448,10 @@ class InitialSettings(BaseSettings):
437
448
  default="main",
438
449
  description="Defines the name of the default branch within Infrahub, can only be set once during initialization of the system.",
439
450
  )
440
- admin_token: Optional[str] = Field(default=None, description="An optional initial token for the admin account.")
451
+ admin_token: str | None = Field(default=None, description="An optional initial token for the admin account.")
441
452
  admin_password: str = Field(default="infrahub", description="The initial password for the admin user")
442
- agent_token: Optional[str] = Field(default=None, description="An optional initial token for a git-agent account.")
443
- agent_password: Optional[str] = Field(
453
+ agent_token: str | None = Field(default=None, description="An optional initial token for a git-agent account.")
454
+ agent_password: str | None = Field(
444
455
  default=None, description="An optional initial password for a git-agent account."
445
456
  )
446
457
 
@@ -501,9 +512,9 @@ class SecurityOIDCProvider2(SecurityOIDCSettings):
501
512
  class SecurityOIDCProviderSettings(BaseModel):
502
513
  """This class is meant to facilitate configuration of OIDC providers when loading configuration from a infrahub.toml file."""
503
514
 
504
- google: Optional[SecurityOIDCGoogle] = Field(default=None)
505
- provider1: Optional[SecurityOIDCProvider1] = Field(default=None)
506
- provider2: Optional[SecurityOIDCProvider2] = Field(default=None)
515
+ google: SecurityOIDCGoogle | None = Field(default=None)
516
+ provider1: SecurityOIDCProvider1 | None = Field(default=None)
517
+ provider2: SecurityOIDCProvider2 | None = Field(default=None)
507
518
 
508
519
 
509
520
  class SecurityOAuth2BaseSettings(BaseSettings):
@@ -549,9 +560,9 @@ class SecurityOAuth2Google(SecurityOAuth2Settings):
549
560
  class SecurityOAuth2ProviderSettings(BaseModel):
550
561
  """This class is meant to facilitate configuration of OAuth2 providers when loading configuration from a infrahub.toml file."""
551
562
 
552
- google: Optional[SecurityOAuth2Google] = Field(default=None)
553
- provider1: Optional[SecurityOAuth2Provider1] = Field(default=None)
554
- provider2: Optional[SecurityOAuth2Provider2] = Field(default=None)
563
+ google: SecurityOAuth2Google | None = Field(default=None)
564
+ provider1: SecurityOAuth2Provider1 | None = Field(default=None)
565
+ provider2: SecurityOAuth2Provider2 | None = Field(default=None)
555
566
 
556
567
 
557
568
  class MiscellaneousSettings(BaseSettings):
@@ -567,9 +578,9 @@ class MiscellaneousSettings(BaseSettings):
567
578
  class RemoteLoggingSettings(BaseSettings):
568
579
  model_config = SettingsConfigDict(env_prefix="INFRAHUB_LOGGING_REMOTE_")
569
580
  enable: bool = False
570
- frontend_dsn: Optional[str] = None
571
- api_server_dsn: Optional[str] = None
572
- git_agent_dsn: Optional[str] = None
581
+ frontend_dsn: str | None = None
582
+ api_server_dsn: str | None = None
583
+ git_agent_dsn: str | None = None
573
584
 
574
585
 
575
586
  class LoggingSettings(BaseSettings):
@@ -579,8 +590,8 @@ class LoggingSettings(BaseSettings):
579
590
  class AnalyticsSettings(BaseSettings):
580
591
  model_config = SettingsConfigDict(env_prefix="INFRAHUB_ANALYTICS_")
581
592
  enable: bool = True
582
- address: Optional[str] = None
583
- api_key: Optional[str] = None
593
+ address: str | None = None
594
+ api_key: str | None = None
584
595
 
585
596
 
586
597
  class ExperimentalFeaturesSettings(BaseSettings):
@@ -707,19 +718,19 @@ class TraceSettings(BaseSettings):
707
718
  exporter_protocol: TraceTransportProtocol = Field(
708
719
  default=TraceTransportProtocol.GRPC, description="Protocol to be used for exporting traces"
709
720
  )
710
- exporter_endpoint: Optional[str] = Field(default=None, description="OTLP endpoint for exporting traces")
721
+ exporter_endpoint: str | None = Field(default=None, description="OTLP endpoint for exporting traces")
711
722
 
712
723
 
713
724
  @dataclass
714
725
  class Override:
715
- message_bus: Optional[InfrahubMessageBus] = None
716
- cache: Optional[InfrahubCache] = None
717
- workflow: Optional[InfrahubWorkflow] = None
726
+ message_bus: InfrahubMessageBus | None = None
727
+ cache: InfrahubCache | None = None
728
+ workflow: InfrahubWorkflow | None = None
718
729
 
719
730
 
720
731
  @dataclass
721
732
  class ConfiguredSettings:
722
- settings: Optional[Settings] = None
733
+ settings: Settings | None = None
723
734
 
724
735
  def initialize(self, config_file: Path | str | None = None) -> None:
725
736
  """Initialize the settings if they have not been initialized."""
@@ -840,7 +851,7 @@ class Settings(BaseSettings):
840
851
  experimental_features: ExperimentalFeaturesSettings = ExperimentalFeaturesSettings()
841
852
 
842
853
 
843
- def load(config_file_name: Path | str = "infrahub.toml", config_data: Optional[dict[str, Any]] = None) -> Settings:
854
+ def load(config_file_name: Path | str = "infrahub.toml", config_data: dict[str, Any] | None = None) -> Settings:
844
855
  """Load configuration.
845
856
 
846
857
  Configuration is loaded from a config file in toml format that contains the settings,
@@ -860,7 +871,7 @@ def load(config_file_name: Path | str = "infrahub.toml", config_data: Optional[d
860
871
  return Settings()
861
872
 
862
873
 
863
- def load_and_exit(config_file_name: Path | str = "infrahub.toml", config_data: Optional[dict[str, Any]] = None) -> None:
874
+ def load_and_exit(config_file_name: Path | str = "infrahub.toml", config_data: dict[str, Any] | None = None) -> None:
864
875
  """Calls load, but wraps it in a try except block.
865
876
 
866
877
  This is done to handle a ValidationError which is raised when settings are specified but invalid.
infrahub/context.py CHANGED
@@ -1,8 +1,12 @@
1
+ from typing import Any
2
+
3
+ from infrahub_sdk.context import ContextAccount, RequestContext
1
4
  from pydantic import BaseModel, Field
2
5
  from typing_extensions import Self
3
6
 
4
7
  from infrahub.auth import AccountSession
5
8
  from infrahub.core.branch import Branch
9
+ from infrahub.core.constants import GLOBAL_BRANCH_NAME
6
10
 
7
11
 
8
12
  class ParentEvent(BaseModel):
@@ -21,6 +25,10 @@ class BranchContext(BaseModel):
21
25
  name: str
22
26
  id: str | None = None
23
27
 
28
+ @property
29
+ def is_global(self) -> bool:
30
+ return self.name == GLOBAL_BRANCH_NAME
31
+
24
32
 
25
33
  class InfrahubContext(BaseModel):
26
34
  branch: BranchContext
@@ -37,3 +45,9 @@ class InfrahubContext(BaseModel):
37
45
  self.event.id = id
38
46
  else:
39
47
  self.event = EventContext(name=name, id=id)
48
+
49
+ def to_event(self) -> dict[str, Any]:
50
+ return self.model_dump(mode="json")
51
+
52
+ def to_request_context(self) -> RequestContext:
53
+ return RequestContext(account=ContextAccount(id=self.account.account_id))
infrahub/core/account.py CHANGED
@@ -1,7 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  from dataclasses import dataclass
4
- from typing import TYPE_CHECKING, Any, Optional, Union
4
+ from typing import TYPE_CHECKING, Any
5
5
 
6
6
  from typing_extensions import Self
7
7
 
@@ -570,14 +570,14 @@ class AccountTokenValidateQuery(Query):
570
570
 
571
571
  self.return_labels = ["at", "av", "acc"]
572
572
 
573
- def get_account_name(self) -> Optional[str]:
573
+ def get_account_name(self) -> str | None:
574
574
  """Return the account name that matched the query or None."""
575
575
  if result := self.get_result():
576
576
  return result.get("av").get("value")
577
577
 
578
578
  return None
579
579
 
580
- def get_account_id(self) -> Optional[str]:
580
+ def get_account_id(self) -> str | None:
581
581
  """Return the account id that matched the query or a None."""
582
582
  if result := self.get_result():
583
583
  return result.get("acc").get("uuid")
@@ -585,7 +585,7 @@ class AccountTokenValidateQuery(Query):
585
585
  return None
586
586
 
587
587
 
588
- async def validate_token(token: str, db: InfrahubDatabase, branch: Optional[Union[Branch, str]] = None) -> str | None:
588
+ async def validate_token(token: str, db: InfrahubDatabase, branch: Branch | str | None = None) -> str | None:
589
589
  branch = await registry.get_branch(db=db, branch=branch)
590
590
  query = await AccountTokenValidateQuery.init(db=db, branch=branch, token=token)
591
591
  await query.execute(db=db)