infrahub-server 1.2.0rc0__py3-none-any.whl → 1.2.1__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 +77 -441
  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 +82 -32
  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 +32 -24
  183. infrahub/generators/models.py +2 -3
  184. infrahub/generators/tasks.py +24 -4
  185. infrahub/git/base.py +7 -7
  186. infrahub/git/integrator.py +48 -24
  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 -84
  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 +10 -1
  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 +71 -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.1.dist-info}/METADATA +8 -6
  336. {infrahub_server-1.2.0rc0.dist-info → infrahub_server-1.2.1.dist-info}/RECORD +349 -293
  337. {infrahub_server-1.2.0rc0.dist-info → infrahub_server-1.2.1.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.1.dist-info}/LICENSE.txt +0 -0
  365. {infrahub_server-1.2.0rc0.dist-info → infrahub_server-1.2.1.dist-info}/WHEEL +0 -0
@@ -1,6 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
- from typing import Any, Optional, Union
3
+ from typing import Any
4
4
 
5
5
  from pydantic import BaseModel, Field
6
6
 
@@ -11,21 +11,19 @@ from infrahub.log import set_log_data
11
11
 
12
12
  class Meta(BaseModel):
13
13
  request_id: str = ""
14
- correlation_id: Optional[str] = Field(default=None)
15
- reply_to: Optional[str] = Field(default=None)
16
- initiator_id: Optional[str] = Field(
14
+ correlation_id: str | None = Field(default=None)
15
+ reply_to: str | None = Field(default=None)
16
+ initiator_id: str | None = Field(
17
17
  default=None, description="The worker identity of the initial sender of this message"
18
18
  )
19
- retry_count: Optional[int] = Field(
20
- default=None, description="Indicates how many times this message has been retried."
21
- )
22
- headers: Optional[dict[str, Any]] = Field(default=None)
23
- validator_execution_id: Optional[str] = Field(
19
+ retry_count: int | None = Field(default=None, description="Indicates how many times this message has been retried.")
20
+ headers: dict[str, Any] | None = Field(default=None)
21
+ validator_execution_id: str | None = Field(
24
22
  default=None, description="Validator execution ID related to this message"
25
23
  )
26
- check_execution_id: Optional[str] = Field(default=None, description="Check execution ID related to this message")
24
+ check_execution_id: str | None = Field(default=None, description="Check execution ID related to this message")
27
25
  priority: int = Field(default=3, description="Message Priority")
28
- expiration: Optional[int] = Field(default=None, description="TTL before this message expires in seconds")
26
+ expiration: int | None = Field(default=None, description="TTL before this message expires in seconds")
29
27
 
30
28
  @classmethod
31
29
  def default(cls) -> Meta:
@@ -89,9 +87,9 @@ class InfrahubResponse(InfrahubMessage):
89
87
 
90
88
  passed: bool = True
91
89
  routing_key: str
92
- data: Union[dict, InfrahubResponseData] = Field(default_factory=dict)
90
+ data: dict | InfrahubResponseData = Field(default_factory=dict) # type: ignore[arg-type]
93
91
  errors: list[str] = Field(default_factory=list)
94
- initial_message: Optional[dict] = Field(
92
+ initial_message: dict | None = Field(
95
93
  default=None,
96
94
  description="Initial message in dict format, the primary goal of this field is to provide additional context when there is an error",
97
95
  )
@@ -1,15 +1,7 @@
1
1
  from infrahub.message_bus import InfrahubMessage, InfrahubResponse
2
2
 
3
3
  from .check_generator_run import CheckGeneratorRun
4
- from .check_repository_checkdefinition import CheckRepositoryCheckDefinition
5
- from .check_repository_mergeconflicts import CheckRepositoryMergeConflicts
6
- from .check_repository_usercheck import CheckRepositoryUserCheck
7
- from .event_branch_create import EventBranchCreate
8
- from .event_branch_delete import EventBranchDelete
9
4
  from .event_branch_merge import EventBranchMerge
10
- from .event_branch_rebased import EventBranchRebased
11
- from .event_node_mutated import EventNodeMutated
12
- from .event_schema_update import EventSchemaUpdate
13
5
  from .event_worker_newprimaryapi import EventWorkerNewPrimaryAPI
14
6
  from .finalize_validator_execution import FinalizeValidatorExecution
15
7
  from .git_file_get import GitFileGet, GitFileGetResponse
@@ -20,21 +12,11 @@ from .refresh_registry_branches import RefreshRegistryBranches
20
12
  from .refresh_registry_rebasedbranch import RefreshRegistryRebasedBranch
21
13
  from .request_generatordefinition_check import RequestGeneratorDefinitionCheck
22
14
  from .request_proposedchange_pipeline import RequestProposedChangePipeline
23
- from .request_repository_checks import RequestRepositoryChecks
24
- from .request_repository_userchecks import RequestRepositoryUserChecks
25
15
  from .send_echo_request import SendEchoRequest, SendEchoRequestResponse
26
16
 
27
17
  MESSAGE_MAP: dict[str, type[InfrahubMessage]] = {
28
18
  "check.generator.run": CheckGeneratorRun,
29
- "check.repository.check_definition": CheckRepositoryCheckDefinition,
30
- "check.repository.merge_conflicts": CheckRepositoryMergeConflicts,
31
- "check.repository.user_check": CheckRepositoryUserCheck,
32
- "event.branch.create": EventBranchCreate,
33
- "event.branch.delete": EventBranchDelete,
34
19
  "event.branch.merge": EventBranchMerge,
35
- "event.branch.rebased": EventBranchRebased,
36
- "event.node.mutated": EventNodeMutated,
37
- "event.schema.update": EventSchemaUpdate,
38
20
  "event.worker.new_primary_api": EventWorkerNewPrimaryAPI,
39
21
  "finalize.validator.execution": FinalizeValidatorExecution,
40
22
  "git.file.get": GitFileGet,
@@ -45,8 +27,6 @@ MESSAGE_MAP: dict[str, type[InfrahubMessage]] = {
45
27
  "request.generator_definition.check": RequestGeneratorDefinitionCheck,
46
28
  "request.proposed_change.pipeline": RequestProposedChangePipeline,
47
29
  "request.proposed_change.refresh_artifacts": RequestProposedChangeRefreshArtifacts,
48
- "request.repository.checks": RequestRepositoryChecks,
49
- "request.repository.user_checks": RequestRepositoryUserChecks,
50
30
  "send.echo.request": SendEchoRequest,
51
31
  }
52
32
 
@@ -59,7 +39,7 @@ PRIORITY_MAP = {
59
39
  "check.artifact.create": 2,
60
40
  "check.repository.check_definition": 2,
61
41
  "check.repository.merge_conflicts": 2,
62
- "event.branch.create": 5,
42
+ "send.echo.request": 5, # Currently only for testing purposes, will be removed once all message bus have been migrated to prefect
63
43
  "event.branch.delete": 5,
64
44
  "event.branch.merge": 5,
65
45
  "event.schema.update": 5,
@@ -1,7 +1,6 @@
1
- from typing import Optional
2
-
3
1
  from pydantic import Field
4
2
 
3
+ from infrahub.context import InfrahubContext
5
4
  from infrahub.generators.models import ProposedChangeGeneratorDefinition
6
5
  from infrahub.message_bus import InfrahubMessage
7
6
 
@@ -10,7 +9,7 @@ class CheckGeneratorRun(InfrahubMessage):
10
9
  """A check that runs a generator."""
11
10
 
12
11
  generator_definition: ProposedChangeGeneratorDefinition = Field(..., description="The Generator definition")
13
- generator_instance: Optional[str] = Field(
12
+ generator_instance: str | None = Field(
14
13
  default=None, description="The id of the generator instance if it previously existed"
15
14
  )
16
15
  commit: str = Field(..., description="The commit to target")
@@ -24,3 +23,4 @@ class CheckGeneratorRun(InfrahubMessage):
24
23
  variables: dict = Field(..., description="Input variables when running the generator")
25
24
  validator_id: str = Field(..., description="The ID of the validator")
26
25
  proposed_change: str | None = Field(None, description="The unique ID of the Proposed Change")
26
+ context: InfrahubContext = Field(..., description="The Infrahub context")
@@ -1,5 +1,6 @@
1
1
  from pydantic import Field
2
2
 
3
+ from infrahub.context import InfrahubContext
3
4
  from infrahub.message_bus import InfrahubMessage
4
5
 
5
6
 
@@ -10,3 +11,5 @@ class FinalizeValidatorExecution(InfrahubMessage):
10
11
  validator_execution_id: str = Field(..., description="The id of current execution of the associated validator")
11
12
  start_time: str = Field(..., description="Start time when the message was first created")
12
13
  validator_type: str = Field(..., description="The type of validator to complete")
14
+ context: InfrahubContext = Field(..., description="The Infrahub context")
15
+ proposed_change: str = Field(..., description="The ID of the proposed change")
@@ -1,5 +1,11 @@
1
+ from pydantic import Field
2
+
3
+ from infrahub.context import InfrahubContext
4
+
1
5
  from .base_with_diff import BaseProposedChangeWithDiffMessage
2
6
 
3
7
 
4
8
  class RequestProposedChangeRefreshArtifacts(BaseProposedChangeWithDiffMessage):
5
9
  """Sent trigger the refresh of artifacts that are impacted by the proposed change."""
10
+
11
+ context: InfrahubContext = Field(..., description="The context of the task")
@@ -1,5 +1,6 @@
1
1
  from pydantic import ConfigDict, Field
2
2
 
3
+ from infrahub.context import InfrahubContext
3
4
  from infrahub.generators.models import ProposedChangeGeneratorDefinition
4
5
  from infrahub.message_bus import InfrahubMessage
5
6
  from infrahub.message_bus.types import ProposedChangeBranchDiff
@@ -16,3 +17,4 @@ class RequestGeneratorDefinitionCheck(InfrahubMessage):
16
17
  source_branch: str = Field(..., description="The source branch")
17
18
  source_branch_sync_with_git: bool = Field(..., description="Indicates if the source branch should sync with git")
18
19
  destination_branch: str = Field(..., description="The target branch")
20
+ context: InfrahubContext = Field(..., description="The Infrahub context")
@@ -6,7 +6,7 @@ ROUTING_KEY = "send.echo.request"
6
6
 
7
7
 
8
8
  class SendEchoRequest(InfrahubMessage):
9
- """Sent a echo request, i.e., ping message."""
9
+ """Sent a echo request, a ping message for example."""
10
10
 
11
11
  message: str = Field(..., description="The message to send")
12
12
 
@@ -1,5 +1,3 @@
1
- from typing import Optional
2
-
3
1
  import ujson
4
2
  from prefect import Flow
5
3
 
@@ -19,12 +17,7 @@ from infrahub.tasks.check import set_check_status
19
17
 
20
18
  COMMAND_MAP = {
21
19
  "check.generator.run": check.generator.run,
22
- "check.repository.check_definition": check.repository.check_definition,
23
- "check.repository.merge_conflicts": check.repository.merge_conflicts,
24
- "check.repository.user_check": check.repository.user_check,
25
20
  "event.branch.merge": event.branch.merge,
26
- "event.node.mutated": event.node.mutated,
27
- "event.schema.update": event.schema.update,
28
21
  "event.worker.new_primary_api": event.worker.new_primary_api,
29
22
  "finalize.validator.execution": finalize.validator.execution,
30
23
  "git.file.get": git.file.get,
@@ -35,15 +28,13 @@ COMMAND_MAP = {
35
28
  "request.generator_definition.check": requests.generator_definition.check,
36
29
  "request.proposed_change.pipeline": requests.proposed_change.pipeline,
37
30
  "request.proposed_change.refresh_artifacts": requests.proposed_change.refresh_artifacts,
38
- "request.repository.checks": requests.repository.checks,
39
- "request.repository.user_checks": requests.repository.user_checks,
40
31
  "send.echo.request": send.echo.request,
41
32
  }
42
33
 
43
34
 
44
35
  async def execute_message(
45
36
  routing_key: str, message_body: bytes, service: InfrahubServices, skip_flow: bool = False
46
- ) -> Optional[MessageTTL]:
37
+ ) -> MessageTTL | None:
47
38
  message_data = ujson.loads(message_body)
48
39
  message = messages.MESSAGE_MAP[routing_key](**message_data)
49
40
  message.set_log_data(routing_key=routing_key)
@@ -1,3 +1,3 @@
1
- from . import generator, repository
1
+ from . import generator
2
2
 
3
- __all__ = ["generator", "repository"]
3
+ __all__ = ["generator"]
@@ -72,6 +72,7 @@ async def run(message: messages.CheckGeneratorRun, service: InfrahubServices) ->
72
72
  convert_query_response=generator_definition.convert_query_response,
73
73
  infrahub_node=InfrahubNode,
74
74
  )
75
+ generator._init_client.request_context = message.context.to_request_context()
75
76
  await generator.run(identifier=generator_definition.name)
76
77
  generator_instance.status.value = GeneratorInstanceStatus.READY.value
77
78
  except ModuleImportError as exc:
@@ -1,3 +1,3 @@
1
- from . import branch, node, schema, worker
1
+ from . import branch, worker
2
2
 
3
- __all__ = ["branch", "node", "schema", "worker"]
3
+ __all__ = ["branch", "worker"]
@@ -2,11 +2,8 @@ from prefect import flow
2
2
 
3
3
  from infrahub.message_bus import messages
4
4
  from infrahub.services import InfrahubServices
5
- from infrahub.workflows.catalogue import WEBHOOK_CONFIGURE
6
5
 
7
6
 
8
7
  @flow(name="event-worker-newprimary-api")
9
8
  async def new_primary_api(message: messages.EventWorkerNewPrimaryAPI, service: InfrahubServices) -> None:
10
9
  service.log.info("api_worker promoted to primary", worker_id=message.worker_id)
11
-
12
- await service.workflow.submit_workflow(workflow=WEBHOOK_CONFIGURE)
@@ -1,11 +1,22 @@
1
+ from infrahub_sdk.protocols import (
2
+ CoreArtifactValidator,
3
+ CoreDataValidator,
4
+ CoreGeneratorValidator,
5
+ CoreRepositoryValidator,
6
+ CoreSchemaValidator,
7
+ CoreUserValidator,
8
+ CoreValidator,
9
+ )
1
10
  from prefect import flow
2
11
 
3
12
  from infrahub import config
13
+ from infrahub.core.constants import InfrahubKind, ValidatorConclusion
4
14
  from infrahub.core.timestamp import Timestamp
5
15
  from infrahub.log import get_logger
6
16
  from infrahub.message_bus import messages
7
17
  from infrahub.message_bus.types import KVTTL, MessageTTL
8
18
  from infrahub.services import InfrahubServices
19
+ from infrahub.validators.events import send_failed_validator, send_passed_validator
9
20
 
10
21
  log = get_logger()
11
22
 
@@ -20,7 +31,8 @@ async def execution(message: messages.FinalizeValidatorExecution, service: Infra
20
31
 
21
32
  The message will get rescheduled until the timeout has exceeded or until all checks are accounted for.
22
33
  """
23
- validator = await service.client.get(kind=message.validator_type, id=message.validator_id)
34
+ validator_type = get_validator_type(validator_type=message.validator_type)
35
+ validator = await service.client.get(kind=validator_type, id=message.validator_id)
24
36
  checks_key = f"validator_execution_id:{message.validator_execution_id}:checks"
25
37
  current_conclusion = validator.conclusion.value
26
38
  if validator.state.value != "in_progress":
@@ -81,3 +93,41 @@ async def execution(message: messages.FinalizeValidatorExecution, service: Infra
81
93
  validator.completed_at.value = Timestamp().to_string()
82
94
  validator.conclusion.value = conclusion
83
95
  await validator.save()
96
+ if validator.conclusion.value == ValidatorConclusion.SUCCESS.value:
97
+ await send_passed_validator(
98
+ service=service, validator=validator, proposed_change_id=message.proposed_change, context=message.context
99
+ )
100
+ else:
101
+ await send_failed_validator(
102
+ service=service, validator=validator, proposed_change_id=message.proposed_change, context=message.context
103
+ )
104
+
105
+
106
+ def get_validator_type(
107
+ validator_type: str,
108
+ ) -> (
109
+ type[CoreArtifactValidator]
110
+ | type[CoreDataValidator]
111
+ | type[CoreGeneratorValidator]
112
+ | type[CoreRepositoryValidator]
113
+ | type[CoreSchemaValidator]
114
+ | type[CoreUserValidator]
115
+ | type[CoreValidator]
116
+ ):
117
+ match validator_type:
118
+ case InfrahubKind.USERVALIDATOR:
119
+ validator_kind = CoreUserValidator
120
+ case InfrahubKind.SCHEMAVALIDATOR:
121
+ validator_kind = CoreSchemaValidator
122
+ case InfrahubKind.GENERATORVALIDATOR:
123
+ validator_kind = CoreGeneratorValidator
124
+ case InfrahubKind.REPOSITORYVALIDATOR:
125
+ validator_kind = CoreRepositoryValidator
126
+ case InfrahubKind.DATAVALIDATOR:
127
+ validator_kind = CoreDataValidator
128
+ case InfrahubKind.ARTIFACTVALIDATOR:
129
+ validator_kind = CoreArtifactValidator
130
+ case _:
131
+ validator_kind = CoreValidator
132
+
133
+ return validator_kind
@@ -1,11 +1,9 @@
1
1
  from . import (
2
2
  generator_definition,
3
3
  proposed_change,
4
- repository,
5
4
  )
6
5
 
7
6
  __all__ = [
8
7
  "generator_definition",
9
8
  "proposed_change",
10
- "repository",
11
9
  ]
@@ -1,14 +1,14 @@
1
- from typing import Optional
2
-
1
+ from infrahub_sdk.protocols import CoreGeneratorValidator
3
2
  from infrahub_sdk.uuidt import UUIDT
4
3
  from prefect import flow
5
4
  from prefect.logging import get_run_logger
6
5
 
7
- from infrahub.core.constants import InfrahubKind, ValidatorConclusion, ValidatorState
6
+ from infrahub.core.constants import InfrahubKind
8
7
  from infrahub.core.timestamp import Timestamp
9
8
  from infrahub.message_bus import InfrahubMessage, Meta, messages
10
9
  from infrahub.message_bus.types import KVTTL
11
10
  from infrahub.services import InfrahubServices
11
+ from infrahub.validators.tasks import start_validator
12
12
  from infrahub.workflows.utils import add_tags
13
13
 
14
14
 
@@ -29,31 +29,26 @@ async def check(message: messages.RequestGeneratorDefinitionCheck, service: Infr
29
29
 
30
30
  await proposed_change.validations.fetch()
31
31
 
32
- validator = None
32
+ previous_validator: CoreGeneratorValidator | None = None
33
33
  for relationship in proposed_change.validations.peers:
34
34
  existing_validator = relationship.peer
35
35
  if (
36
36
  existing_validator.typename == InfrahubKind.GENERATORVALIDATOR
37
37
  and existing_validator.definition.id == message.generator_definition.definition_id
38
38
  ):
39
- validator = existing_validator
40
-
41
- if validator:
42
- validator.conclusion.value = ValidatorConclusion.UNKNOWN.value
43
- validator.state.value = ValidatorState.QUEUED.value
44
- validator.started_at.value = ""
45
- validator.completed_at.value = ""
46
- await validator.save()
47
- else:
48
- validator = await service.client.create(
49
- kind=InfrahubKind.GENERATORVALIDATOR,
50
- data={
51
- "label": validator_name,
52
- "proposed_change": message.proposed_change,
53
- "definition": message.generator_definition.definition_id,
54
- },
55
- )
56
- await validator.save()
39
+ previous_validator = existing_validator
40
+
41
+ validator = await start_validator(
42
+ service=service,
43
+ validator=previous_validator,
44
+ validator_type=CoreGeneratorValidator,
45
+ proposed_change=message.proposed_change,
46
+ data={
47
+ "label": validator_name,
48
+ "definition": message.generator_definition.definition_id,
49
+ },
50
+ context=message.context,
51
+ )
57
52
 
58
53
  group = await service.client.get(
59
54
  kind=InfrahubKind.GENERICGROUP,
@@ -92,6 +87,7 @@ async def check(message: messages.RequestGeneratorDefinitionCheck, service: Infr
92
87
  log.info(f"Trigger execution of {message.generator_definition.definition_name} for {member.display_label}")
93
88
  events.append(
94
89
  messages.CheckGeneratorRun(
90
+ context=message.context,
95
91
  generator_definition=message.generator_definition,
96
92
  generator_instance=generator_instance,
97
93
  commit=repository.source_commit,
@@ -121,6 +117,8 @@ async def check(message: messages.RequestGeneratorDefinitionCheck, service: Infr
121
117
  validator_id=validator.id,
122
118
  validator_execution_id=validator_execution_id,
123
119
  validator_type=InfrahubKind.GENERATORVALIDATOR,
120
+ context=message.context,
121
+ proposed_change=message.proposed_change,
124
122
  )
125
123
  )
126
124
  for event in events:
@@ -128,7 +126,7 @@ async def check(message: messages.RequestGeneratorDefinitionCheck, service: Infr
128
126
  await service.message_bus.send(message=event)
129
127
 
130
128
 
131
- def _run_generator(instance_id: Optional[str], managed_branch: bool, impacted_instances: list[str]) -> bool:
129
+ def _run_generator(instance_id: str | None, managed_branch: bool, impacted_instances: list[str]) -> bool:
132
130
  """Returns a boolean to indicate if a generator instance needs to be executed
133
131
  Will return true if:
134
132
  * The instance_id wasn't set which could be that it's a new object that doesn't have a previous generator instance
@@ -11,6 +11,7 @@ from infrahub.core.constants import CheckType, InfrahubKind, RepositoryInternalS
11
11
  from infrahub.core.diff.coordinator import DiffCoordinator
12
12
  from infrahub.core.registry import registry
13
13
  from infrahub.dependencies.registry import get_component_registry
14
+ from infrahub.git.models import TriggerRepositoryInternalChecks
14
15
  from infrahub.git.repository import InfrahubRepository
15
16
  from infrahub.message_bus import InfrahubMessage, messages
16
17
  from infrahub.message_bus.types import (
@@ -29,6 +30,7 @@ from infrahub.proposed_change.models import (
29
30
  )
30
31
  from infrahub.services import InfrahubServices # noqa: TC001
31
32
  from infrahub.workflows.catalogue import (
33
+ GIT_REPOSITORY_INTERNAL_CHECKS_TRIGGER,
32
34
  REQUEST_ARTIFACT_DEFINITION_CHECK,
33
35
  REQUEST_PROPOSED_CHANGE_DATA_INTEGRITY,
34
36
  REQUEST_PROPOSED_CHANGE_REPOSITORY_CHECKS,
@@ -76,17 +78,17 @@ async def pipeline(message: messages.RequestProposedChangePipeline, service: Inf
76
78
  ):
77
79
  for repo in repositories:
78
80
  if not repo.read_only and repo.internal_status == RepositoryInternalStatus.ACTIVE.value:
79
- events.append(
80
- messages.RequestRepositoryChecks(
81
- proposed_change=message.proposed_change,
82
- repository=repo.repository_id,
83
- source_branch=repo.source_branch,
84
- target_branch=repo.destination_branch,
85
- )
81
+ model = TriggerRepositoryInternalChecks(
82
+ proposed_change=message.proposed_change,
83
+ repository=repo.repository_id,
84
+ source_branch=repo.source_branch,
85
+ target_branch=repo.destination_branch,
86
+ )
87
+ await service.workflow.submit_workflow(
88
+ workflow=GIT_REPOSITORY_INTERNAL_CHECKS_TRIGGER,
89
+ context=message.context,
90
+ parameters={"model": model},
86
91
  )
87
- for event in events:
88
- event.assign_meta(parent=message)
89
- await service.message_bus.send(message=event)
90
92
  return
91
93
 
92
94
  await _gather_repository_repository_diffs(repositories=repositories, service=service)
@@ -105,6 +107,7 @@ async def pipeline(message: messages.RequestProposedChangePipeline, service: Inf
105
107
  if message.check_type is CheckType.ARTIFACT:
106
108
  events.append(
107
109
  messages.RequestProposedChangeRefreshArtifacts(
110
+ context=message.context,
108
111
  proposed_change=message.proposed_change,
109
112
  source_branch=message.source_branch,
110
113
  source_branch_sync_with_git=message.source_branch_sync_with_git,
@@ -243,6 +246,7 @@ async def refresh_artifacts(message: messages.RequestProposedChangeRefreshArtifa
243
246
  if select:
244
247
  log.info(f"Trigger processing of {artifact_definition.definition_name}")
245
248
  model = RequestArtifactDefinitionCheck(
249
+ context=message.context,
246
250
  artifact_definition=artifact_definition,
247
251
  branch_diff=message.branch_diff,
248
252
  proposed_change=message.proposed_change,
@@ -0,0 +1,15 @@
1
+ from infrahub.core.account import GlobalPermission
2
+ from infrahub.core.constants import GLOBAL_BRANCH_NAME, GlobalPermissions, PermissionDecision
3
+ from infrahub.core.registry import registry
4
+
5
+
6
+ def define_global_permission_from_branch(permission: GlobalPermissions, branch_name: str) -> GlobalPermission:
7
+ if branch_name in (GLOBAL_BRANCH_NAME, registry.default_branch):
8
+ decision = PermissionDecision.ALLOW_DEFAULT
9
+ else:
10
+ decision = PermissionDecision.ALLOW_OTHER
11
+
12
+ return GlobalPermission(
13
+ action=permission.value,
14
+ decision=decision.value,
15
+ )
infrahub/pools/number.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, Optional, Union
4
+ from typing import TYPE_CHECKING
5
5
 
6
6
  from infrahub.core.query.resource_manager import NumberPoolGetAllocated
7
7
  from infrahub.core.registry import registry
@@ -20,9 +20,7 @@ class UsedNumber:
20
20
 
21
21
 
22
22
  class NumberUtilizationGetter:
23
- def __init__(
24
- self, db: InfrahubDatabase, pool: CoreNode, branch: Branch, at: Optional[Union[Timestamp, str]] = None
25
- ) -> None:
23
+ def __init__(self, db: InfrahubDatabase, pool: CoreNode, branch: Branch, at: Timestamp | str | None = None) -> None:
26
24
  self.db = db
27
25
  self.at = at
28
26
  self.pool = pool
@@ -1,5 +1,6 @@
1
1
  from pydantic import BaseModel, ConfigDict, Field
2
2
 
3
+ from infrahub.context import InfrahubContext
3
4
  from infrahub.message_bus.messages.proposed_change.base_with_diff import BaseProposedChangeWithDiffMessage
4
5
  from infrahub.message_bus.types import ProposedChangeArtifactDefinition, ProposedChangeBranchDiff
5
6
 
@@ -40,3 +41,5 @@ class RequestArtifactDefinitionCheck(BaseModel):
40
41
  source_branch: str = Field(..., description="The source branch")
41
42
  source_branch_sync_with_git: bool = Field(..., description="Indicates if the source branch should sync with git")
42
43
  destination_branch: str = Field(..., description="The target branch")
44
+
45
+ context: InfrahubContext = Field(..., description="The context of the task")