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,20 +0,0 @@
1
- from pydantic import ConfigDict, Field
2
-
3
- from infrahub.message_bus import InfrahubMessage
4
- from infrahub.message_bus.types import ProposedChangeBranchDiff
5
-
6
-
7
- class CheckRepositoryCheckDefinition(InfrahubMessage):
8
- """Triggers user defined checks to run based on a Check Definition."""
9
-
10
- model_config = ConfigDict(arbitrary_types_allowed=True)
11
-
12
- check_definition_id: str = Field(..., description="The unique ID of the check definition")
13
- commit: str = Field(..., description="The commit to target")
14
- repository_id: str = Field(..., description="The unique ID of the Repository")
15
- repository_name: str = Field(..., description="The name of the Repository")
16
- branch_name: str = Field(..., description="The branch where the check is run")
17
- file_path: str = Field(..., description="The path and filename of the check")
18
- class_name: str = Field(..., description="The name of the class containing the check")
19
- proposed_change: str = Field(..., description="The unique ID of the Proposed Change")
20
- branch_diff: ProposedChangeBranchDiff = Field(..., description="The calculated diff between the two branches")
@@ -1,16 +0,0 @@
1
- from pydantic import Field
2
-
3
- from infrahub.message_bus import InfrahubMessage
4
-
5
-
6
- class CheckRepositoryMergeConflicts(InfrahubMessage):
7
- """Runs a check to validate if there are merge conflicts for a proposed change between two branches."""
8
-
9
- validator_id: str = Field(..., description="The id of the validator associated with this check")
10
- validator_execution_id: str = Field(..., description="The id of current execution of the associated validator")
11
- check_execution_id: str = Field(..., description="The unique ID for the current execution of this check")
12
- proposed_change: str = Field(..., description="The unique ID of the Proposed Change")
13
- repository_id: str = Field(..., description="The unique ID of the Repository")
14
- repository_name: str = Field(..., description="The name of the Repository")
15
- source_branch: str = Field(..., description="The source branch")
16
- target_branch: str = Field(..., description="The target branch")
@@ -1,26 +0,0 @@
1
- from pydantic import ConfigDict, Field
2
-
3
- from infrahub.message_bus import InfrahubMessage
4
- from infrahub.message_bus.types import ProposedChangeBranchDiff
5
-
6
-
7
- class CheckRepositoryUserCheck(InfrahubMessage):
8
- """Runs a check as defined within a CoreCheckDefinition within a repository."""
9
-
10
- model_config = ConfigDict(arbitrary_types_allowed=True)
11
-
12
- validator_id: str = Field(..., description="The id of the validator associated with this check")
13
- validator_execution_id: str = Field(..., description="The id of current execution of the associated validator")
14
- check_execution_id: str = Field(..., description="The unique ID for the current execution of this check")
15
- check_definition_id: str = Field(..., description="The unique ID of the check definition")
16
- commit: str = Field(..., description="The commit to target")
17
- repository_id: str = Field(..., description="The unique ID of the Repository")
18
- repository_name: str = Field(..., description="The name of the Repository")
19
- branch_name: str = Field(..., description="The branch where the check is run")
20
- file_path: str = Field(..., description="The path and filename of the check")
21
- class_name: str = Field(..., description="The name of the class containing the check")
22
- proposed_change: str = Field(..., description="The unique ID of the Proposed Change")
23
- variables: dict = Field(default_factory=dict, description="Input variables when running the check")
24
- name: str = Field(..., description="The name of the check")
25
- branch_diff: ProposedChangeBranchDiff = Field(..., description="The calculated diff between the two branches")
26
- timeout: int = Field(..., description="The timeout for the check")
@@ -1,11 +0,0 @@
1
- from pydantic import Field
2
-
3
- from infrahub.message_bus import InfrahubMessage
4
-
5
-
6
- class EventBranchCreate(InfrahubMessage):
7
- """Sent a new branch is created."""
8
-
9
- branch: str = Field(..., description="The branch that was created")
10
- branch_id: str = Field(..., description="The unique ID of the branch")
11
- sync_with_git: bool = Field(..., description="Indicates if Infrahub should extend this branch to git.")
@@ -1,11 +0,0 @@
1
- from pydantic import Field
2
-
3
- from infrahub.message_bus import InfrahubMessage
4
-
5
-
6
- class EventBranchDelete(InfrahubMessage):
7
- """Sent when a branch has been deleted."""
8
-
9
- branch: str = Field(..., description="The branch that was deleted")
10
- branch_id: str = Field(..., description="The unique ID of the branch")
11
- sync_with_git: bool = Field(..., description="Indicates if the branch was extended to Git")
@@ -1,9 +0,0 @@
1
- from pydantic import Field
2
-
3
- from infrahub.message_bus import InfrahubMessage
4
-
5
-
6
- class EventBranchRebased(InfrahubMessage):
7
- """Sent when a branch has been rebased."""
8
-
9
- branch: str = Field(..., description="The branch that was rebased")
@@ -1,15 +0,0 @@
1
- from typing import Any
2
-
3
- from pydantic import Field
4
-
5
- from infrahub.message_bus import InfrahubMessage
6
-
7
-
8
- class EventNodeMutated(InfrahubMessage):
9
- """Sent when a node has been mutated"""
10
-
11
- branch: str = Field(..., description="The branch that was created")
12
- kind: str = Field(..., description="The type of object modified")
13
- node_id: str = Field(..., description="The ID of the mutated node")
14
- action: str = Field(..., description="The action taken on the node")
15
- data: dict[str, Any] = Field(..., description="Data on modified object")
@@ -1,9 +0,0 @@
1
- from pydantic import Field
2
-
3
- from infrahub.message_bus import InfrahubMessage
4
-
5
-
6
- class EventSchemaUpdate(InfrahubMessage):
7
- """Sent when the schema on a branch has been updated."""
8
-
9
- branch: str = Field(..., description="The branch where the update occurred")
@@ -1,12 +0,0 @@
1
- from pydantic import Field
2
-
3
- from infrahub.message_bus import InfrahubMessage
4
-
5
-
6
- class RequestRepositoryChecks(InfrahubMessage):
7
- """Sent to trigger the checks for a repository to be executed."""
8
-
9
- proposed_change: str = Field(..., description="The unique ID of the Proposed Change")
10
- repository: str = Field(..., description="The unique ID of the Repository")
11
- source_branch: str = Field(..., description="The source branch")
12
- target_branch: str = Field(..., description="The target branch")
@@ -1,18 +0,0 @@
1
- from pydantic import ConfigDict, Field
2
-
3
- from infrahub.message_bus import InfrahubMessage
4
- from infrahub.message_bus.types import ProposedChangeBranchDiff
5
-
6
-
7
- class RequestRepositoryUserChecks(InfrahubMessage):
8
- """Sent to trigger the user defined checks on a repository."""
9
-
10
- model_config = ConfigDict(arbitrary_types_allowed=True)
11
-
12
- proposed_change: str = Field(..., description="The unique ID of the Proposed Change")
13
- repository_id: str = Field(..., description="The unique ID of the Repository")
14
- repository_name: str = Field(..., description="The name of the Repository")
15
- source_branch: str = Field(..., description="The source branch")
16
- source_branch_sync_with_git: bool = Field(..., description="Indicates if the source branch should sync with git")
17
- target_branch: str = Field(..., description="The target branch")
18
- branch_diff: ProposedChangeBranchDiff = Field(..., description="The calculated diff between the two branches")
@@ -1,293 +0,0 @@
1
- from infrahub_sdk.protocols import CoreCheckDefinition
2
- from infrahub_sdk.uuidt import UUIDT
3
- from prefect import flow
4
- from prefect.logging import get_run_logger
5
-
6
- from infrahub import lock
7
- from infrahub.core.constants import InfrahubKind
8
- from infrahub.core.manager import NodeManager
9
- from infrahub.core.timestamp import Timestamp
10
- from infrahub.exceptions import CheckError
11
- from infrahub.git.repository import InfrahubRepository
12
- from infrahub.message_bus import InfrahubMessage, messages
13
- from infrahub.message_bus.types import KVTTL
14
- from infrahub.services import InfrahubServices
15
- from infrahub.workflows.utils import add_tags
16
-
17
-
18
- @flow(
19
- name="git-repository-check-definition",
20
- flow_run_name="Run user defined checks for repository {message.repository_name}",
21
- )
22
- async def check_definition(message: messages.CheckRepositoryCheckDefinition, service: InfrahubServices) -> None:
23
- await add_tags(branches=[message.branch_name], nodes=[message.proposed_change])
24
- log = get_run_logger()
25
-
26
- definition = await service.client.get(
27
- kind=CoreCheckDefinition, id=message.check_definition_id, branch=message.branch_name
28
- )
29
- proposed_change = await service.client.get(kind=InfrahubKind.PROPOSEDCHANGE, id=message.proposed_change)
30
- validator_execution_id = str(UUIDT())
31
- check_execution_ids: list[str] = []
32
- await proposed_change.validations.fetch()
33
- validator = None
34
- events: list[InfrahubMessage] = []
35
-
36
- for relationship in proposed_change.validations.peers:
37
- existing_validator = relationship.peer
38
-
39
- if (
40
- existing_validator.typename == InfrahubKind.USERVALIDATOR
41
- and existing_validator.repository.id == message.repository_id
42
- and existing_validator.check_definition.id == message.check_definition_id
43
- ):
44
- validator = existing_validator
45
- service.log.info("Found the same validator", validator=validator)
46
-
47
- if validator:
48
- validator.conclusion.value = "unknown"
49
- validator.state.value = "queued"
50
- validator.started_at.value = ""
51
- validator.completed_at.value = ""
52
- await validator.save()
53
- else:
54
- validator = await service.client.create(
55
- kind=InfrahubKind.USERVALIDATOR,
56
- data={
57
- "label": f"Check: {definition.name.value}",
58
- "proposed_change": message.proposed_change,
59
- "repository": message.repository_id,
60
- "check_definition": message.check_definition_id,
61
- },
62
- )
63
- await validator.save()
64
-
65
- if definition.targets.id:
66
- # Check against a group of targets
67
- await definition.targets.fetch()
68
- group = definition.targets.peer
69
- await group.members.fetch()
70
- for relationship in group.members.peers:
71
- member = relationship.peer
72
-
73
- check_execution_id = str(UUIDT())
74
- check_execution_ids.append(check_execution_id)
75
- events.append(
76
- messages.CheckRepositoryUserCheck(
77
- name=member.display_label,
78
- validator_id=validator.id,
79
- validator_execution_id=validator_execution_id,
80
- check_execution_id=check_execution_id,
81
- repository_id=message.repository_id,
82
- repository_name=message.repository_name,
83
- commit=message.commit,
84
- file_path=message.file_path,
85
- class_name=message.class_name,
86
- branch_name=message.branch_name,
87
- check_definition_id=message.check_definition_id,
88
- proposed_change=message.proposed_change,
89
- variables=member.extract(params=definition.parameters.value),
90
- branch_diff=message.branch_diff,
91
- timeout=definition.timeout.value,
92
- )
93
- )
94
-
95
- else:
96
- check_execution_id = str(UUIDT())
97
- check_execution_ids.append(check_execution_id)
98
- events.append(
99
- messages.CheckRepositoryUserCheck(
100
- name=definition.name.value,
101
- validator_id=validator.id,
102
- validator_execution_id=validator_execution_id,
103
- check_execution_id=check_execution_id,
104
- repository_id=message.repository_id,
105
- repository_name=message.repository_name,
106
- commit=message.commit,
107
- file_path=message.file_path,
108
- class_name=message.class_name,
109
- branch_name=message.branch_name,
110
- check_definition_id=message.check_definition_id,
111
- proposed_change=message.proposed_change,
112
- branch_diff=message.branch_diff,
113
- timeout=definition.timeout.value,
114
- )
115
- )
116
-
117
- checks_in_execution = ",".join(check_execution_ids)
118
- log.info(f"Checks in execution {checks_in_execution}")
119
- await service.cache.set(
120
- key=f"validator_execution_id:{validator_execution_id}:checks",
121
- value=checks_in_execution,
122
- expires=KVTTL.TWO_HOURS,
123
- )
124
- events.append(
125
- messages.FinalizeValidatorExecution(
126
- start_time=Timestamp().to_string(),
127
- validator_id=validator.id,
128
- validator_execution_id=validator_execution_id,
129
- validator_type=InfrahubKind.USERVALIDATOR,
130
- )
131
- )
132
-
133
- for event in events:
134
- event.assign_meta(parent=message)
135
- await service.message_bus.send(message=event)
136
-
137
-
138
- @flow(
139
- name="git-repository-check-merge-conflict",
140
- flow_run_name="Check for merge conflicts between {message.source_branch} and {message.target_branch}",
141
- )
142
- async def merge_conflicts(message: messages.CheckRepositoryMergeConflicts, service: InfrahubServices) -> None:
143
- """Runs a check to see if there are merge conflicts between two branches."""
144
- await add_tags(branches=[message.source_branch], nodes=[message.proposed_change])
145
-
146
- success_condition = "-"
147
- validator = await service.client.get(kind=InfrahubKind.REPOSITORYVALIDATOR, id=message.validator_id)
148
- await validator.checks.fetch()
149
-
150
- repo = await InfrahubRepository.init(id=message.repository_id, name=message.repository_name, service=service)
151
- async with lock.registry.get(name=message.repository_name, namespace="repository"):
152
- conflicts = await repo.get_conflicts(source_branch=message.source_branch, dest_branch=message.target_branch)
153
-
154
- existing_checks = {}
155
- for relationship in validator.checks.peers:
156
- existing_check = relationship.peer
157
- if existing_check.typename == InfrahubKind.FILECHECK and existing_check.kind.value == "MergeConflictCheck":
158
- check_key = ""
159
- if existing_check.files.value:
160
- check_key = "".join(existing_check.files.value)
161
- check_key = f"-{check_key}"
162
- existing_checks[check_key] = existing_check
163
-
164
- validator_conclusion = "success"
165
- check = None
166
- if conflicts:
167
- validator_conclusion = "failure"
168
- for conflict in conflicts:
169
- conflict_key = f"-{conflict}"
170
- if conflict_key in existing_checks:
171
- existing_checks[conflict_key].created_at.value = Timestamp().to_string()
172
- await existing_checks[conflict_key].save()
173
- existing_checks.pop(conflict_key)
174
- else:
175
- check = await service.client.create(
176
- kind=InfrahubKind.FILECHECK,
177
- data={
178
- "name": conflict,
179
- "origin": "ConflictCheck",
180
- "kind": "MergeConflictCheck",
181
- "validator": message.validator_id,
182
- "created_at": Timestamp().to_string(),
183
- "files": [conflict],
184
- "conclusion": "failure",
185
- "severity": "critical",
186
- },
187
- )
188
- await check.save()
189
-
190
- elif success_condition in existing_checks:
191
- existing_checks[success_condition].created_at.value = Timestamp().to_string()
192
- await existing_checks[success_condition].save()
193
- existing_checks.pop(success_condition)
194
-
195
- else:
196
- check = await service.client.create(
197
- kind=InfrahubKind.FILECHECK,
198
- data={
199
- "name": "Merge Conflict Check",
200
- "origin": "ConflictCheck",
201
- "kind": "MergeConflictCheck",
202
- "validator": message.validator_id,
203
- "created_at": Timestamp().to_string(),
204
- "conclusion": "success",
205
- "severity": "info",
206
- },
207
- )
208
- await check.save()
209
-
210
- async with service.database.start_session() as db:
211
- await NodeManager.delete(db=db, nodes=list(existing_checks.values()))
212
-
213
- await service.cache.set(
214
- key=f"validator_execution_id:{message.validator_execution_id}:check_execution_id:{message.check_execution_id}",
215
- value=validator_conclusion,
216
- expires=KVTTL.TWO_HOURS,
217
- )
218
-
219
-
220
- @flow(name="git-repository-user-check", flow_run_name="Execute user defined Check '{message.name}'")
221
- async def user_check(message: messages.CheckRepositoryUserCheck, service: InfrahubServices) -> None:
222
- await add_tags(branches=[message.branch_name], nodes=[message.proposed_change])
223
- log = get_run_logger()
224
-
225
- validator = await service.client.get(kind=InfrahubKind.USERVALIDATOR, id=message.validator_id)
226
- await validator.checks.fetch()
227
-
228
- repo = await InfrahubRepository.init(
229
- id=message.repository_id, name=message.repository_name, commit=message.commit, service=service
230
- )
231
- conclusion = "failure"
232
- severity = "critical"
233
- log_entries = ""
234
- try:
235
- check_run = await repo.execute_python_check.with_options(timeout_seconds=message.timeout)(
236
- branch_name=message.branch_name,
237
- location=message.file_path,
238
- class_name=message.class_name,
239
- client=service.client,
240
- commit=message.commit,
241
- params=message.variables,
242
- )
243
- if check_run.passed:
244
- conclusion = "success"
245
- severity = "info"
246
- log.info("The check passed")
247
- else:
248
- log.warning("The check reported failures")
249
- for log_entry in check_run.log_entries:
250
- log.warning(log_entry)
251
- log_entries = check_run.log_entries
252
- except CheckError as exc:
253
- log.warning("The check failed to run")
254
- log.error(exc.message)
255
- log_entries = f"FATAL Error/n:{exc.message}"
256
-
257
- check = None
258
- for relationship in validator.checks.peers:
259
- existing_check = relationship.peer
260
- if (
261
- existing_check.typename == InfrahubKind.STANDARDCHECK
262
- and existing_check.kind.value == "CheckDefinition"
263
- and existing_check.name.value == message.name
264
- ):
265
- check = existing_check
266
-
267
- if check:
268
- check.created_at.value = Timestamp().to_string()
269
- check.message.value = log_entries
270
- check.conclusion.value = conclusion
271
- check.severity.value = severity
272
- await check.save()
273
- else:
274
- check = await service.client.create(
275
- kind=InfrahubKind.STANDARDCHECK,
276
- data={
277
- "name": message.name,
278
- "origin": message.repository_id,
279
- "kind": "CheckDefinition",
280
- "validator": message.validator_id,
281
- "created_at": Timestamp().to_string(),
282
- "message": log_entries,
283
- "conclusion": conclusion,
284
- "severity": severity,
285
- },
286
- )
287
- await check.save()
288
-
289
- await service.cache.set(
290
- key=f"validator_execution_id:{message.validator_execution_id}:check_execution_id:{message.check_execution_id}",
291
- value=conclusion,
292
- expires=KVTTL.TWO_HOURS,
293
- )
@@ -1,20 +0,0 @@
1
- from infrahub.message_bus import messages
2
- from infrahub.services import InfrahubServices
3
-
4
-
5
- async def mutated(
6
- message: messages.EventNodeMutated,
7
- service: InfrahubServices,
8
- ) -> None:
9
- """Event posted when a node is mutated"""
10
- # Note for now this is only kept to facilitate publishing to other queues in the future
11
- # This operation doesn't have a flow defined to avoid having the workers need to register
12
- # the results in Prefect when they don't actually do anything aside from add noise.
13
- service.log.debug(
14
- "Mutation on node",
15
- branch=message.branch,
16
- node_id=message.node_id,
17
- action=message.action,
18
- kind=message.kind,
19
- data=message.data,
20
- )
@@ -1,17 +0,0 @@
1
- from prefect import flow
2
-
3
- from infrahub.log import get_logger
4
- from infrahub.message_bus import messages
5
- from infrahub.services import InfrahubServices
6
-
7
- log = get_logger()
8
-
9
-
10
- @flow(name="event-schema-update")
11
- async def update(message: messages.EventSchemaUpdate, service: InfrahubServices) -> None:
12
- log.info("run_message", branch=message.branch)
13
-
14
- msg = messages.RefreshRegistryBranches()
15
-
16
- msg.assign_meta(parent=message)
17
- await service.message_bus.send(message=msg)
@@ -1,133 +0,0 @@
1
- from infrahub_sdk.uuidt import UUIDT
2
- from prefect import flow
3
- from prefect.logging import get_run_logger
4
-
5
- from infrahub.core.constants import InfrahubKind
6
- from infrahub.core.timestamp import Timestamp
7
- from infrahub.message_bus import InfrahubMessage, messages
8
- from infrahub.message_bus.types import KVTTL
9
- from infrahub.services import InfrahubServices
10
- from infrahub.workflows.utils import add_tags
11
-
12
-
13
- @flow(name="repository-check", flow_run_name="Running repository checks for repository {message.repository}")
14
- async def checks(message: messages.RequestRepositoryChecks, service: InfrahubServices) -> None:
15
- """Request to start validation checks on a specific repository."""
16
- await add_tags(branches=[message.source_branch], nodes=[message.proposed_change])
17
- log = get_run_logger()
18
-
19
- events: list[InfrahubMessage] = []
20
-
21
- repository = await service.client.get(
22
- kind=InfrahubKind.GENERICREPOSITORY, id=message.repository, branch=message.source_branch
23
- )
24
- proposed_change = await service.client.get(kind=InfrahubKind.PROPOSEDCHANGE, id=message.proposed_change)
25
-
26
- validator_execution_id = str(UUIDT())
27
- check_execution_ids: list[str] = []
28
- await proposed_change.validations.fetch()
29
- await repository.checks.fetch()
30
-
31
- validator_name = f"Repository Validator: {repository.name.value}"
32
- validator = None
33
- for relationship in proposed_change.validations.peers:
34
- existing_validator = relationship.peer
35
-
36
- if (
37
- existing_validator.typename == InfrahubKind.REPOSITORYVALIDATOR
38
- and existing_validator.repository.id == message.repository
39
- ):
40
- validator = existing_validator
41
-
42
- if validator:
43
- validator.conclusion.value = "unknown"
44
- validator.state.value = "queued"
45
- validator.started_at.value = ""
46
- validator.completed_at.value = ""
47
- await validator.save()
48
- else:
49
- validator = await service.client.create(
50
- kind=InfrahubKind.REPOSITORYVALIDATOR,
51
- data={
52
- "label": validator_name,
53
- "proposed_change": message.proposed_change,
54
- "repository": message.repository,
55
- },
56
- )
57
- await validator.save()
58
-
59
- check_execution_id = str(UUIDT())
60
- check_execution_ids.append(check_execution_id)
61
- log.info("Adding check for merge conflict")
62
-
63
- events.append(
64
- messages.CheckRepositoryMergeConflicts(
65
- validator_id=validator.id,
66
- validator_execution_id=validator_execution_id,
67
- check_execution_id=check_execution_id,
68
- proposed_change=message.proposed_change,
69
- repository_id=message.repository,
70
- repository_name=repository.name.value,
71
- source_branch=message.source_branch,
72
- target_branch=message.target_branch,
73
- )
74
- )
75
-
76
- checks_in_execution = ",".join(check_execution_ids)
77
- log.info(f"Checks in execution {checks_in_execution}")
78
- await service.cache.set(
79
- key=f"validator_execution_id:{validator_execution_id}:checks",
80
- value=checks_in_execution,
81
- expires=KVTTL.TWO_HOURS,
82
- )
83
- events.append(
84
- messages.FinalizeValidatorExecution(
85
- start_time=Timestamp().to_string(),
86
- validator_id=validator.id,
87
- validator_execution_id=validator_execution_id,
88
- validator_type=InfrahubKind.REPOSITORYVALIDATOR,
89
- )
90
- )
91
-
92
- for event in events:
93
- event.assign_meta(parent=message)
94
- await service.message_bus.send(message=event)
95
-
96
-
97
- @flow(
98
- name="repository-users-check",
99
- flow_run_name="Evaluating user-defined checks on repository {message.repository_name}",
100
- )
101
- async def user_checks(message: messages.RequestRepositoryUserChecks, service: InfrahubServices) -> None:
102
- """Request to start validation checks on a specific repository for User-defined checks."""
103
-
104
- await add_tags(branches=[message.source_branch], nodes=[message.proposed_change])
105
- log = get_run_logger()
106
-
107
- events: list[InfrahubMessage] = []
108
-
109
- repository = await service.client.get(
110
- kind=InfrahubKind.GENERICREPOSITORY, id=message.repository_id, branch=message.source_branch, fragment=True
111
- )
112
- await repository.checks.fetch()
113
-
114
- for relationship in repository.checks.peers:
115
- log.info("Adding check for user defined check")
116
- check_definition = relationship.peer
117
- events.append(
118
- messages.CheckRepositoryCheckDefinition(
119
- check_definition_id=check_definition.id,
120
- repository_id=repository.id,
121
- repository_name=repository.name.value,
122
- commit=repository.commit.value,
123
- file_path=check_definition.file_path.value,
124
- class_name=check_definition.class_name.value,
125
- branch_name=message.source_branch,
126
- proposed_change=message.proposed_change,
127
- branch_diff=message.branch_diff,
128
- )
129
- )
130
-
131
- for event in events:
132
- event.assign_meta(parent=message)
133
- await service.message_bus.send(message=event)
@@ -1 +0,0 @@
1
- AUTOMATION_NAME_RUN = "Trigger-webhook-execution"