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
@@ -3,7 +3,7 @@ from __future__ import annotations
3
3
  import hashlib
4
4
  import importlib
5
5
  import sys
6
- from typing import TYPE_CHECKING, Any, Optional, Union
6
+ from typing import TYPE_CHECKING, Any
7
7
 
8
8
  import jinja2
9
9
  import ujson
@@ -39,6 +39,7 @@ from typing_extensions import Self
39
39
 
40
40
  from infrahub.core.constants import ArtifactStatus, ContentType, InfrahubKind, RepositorySyncStatus
41
41
  from infrahub.core.registry import registry
42
+ from infrahub.events.artifact_action import ArtifactCreatedEvent, ArtifactUpdatedEvent
42
43
  from infrahub.events.models import EventMeta
43
44
  from infrahub.events.repository_action import CommitUpdatedEvent
44
45
  from infrahub.exceptions import CheckError, RepositoryInvalidFileSystemError, TransformError
@@ -54,7 +55,7 @@ if TYPE_CHECKING:
54
55
  from infrahub_sdk.schema.repository import InfrahubRepositoryArtifactDefinitionConfig
55
56
  from infrahub_sdk.transforms import InfrahubTransform
56
57
 
57
- from infrahub.core.checks.models import CheckArtifactCreate
58
+ from infrahub.artifacts.models import CheckArtifactCreate
58
59
  from infrahub.git.models import RequestArtifactGenerate
59
60
  from infrahub.services import InfrahubServices
60
61
 
@@ -92,10 +93,10 @@ class CheckDefinitionInformation(BaseModel):
92
93
  timeout: int
93
94
  """Timeout for the Check."""
94
95
 
95
- parameters: Optional[dict] = None
96
+ parameters: dict | None = None
96
97
  """Additional Parameters to extract from each target (if targets is provided)"""
97
98
 
98
- targets: Optional[str] = Field(default=None, description="Targets if not a global check")
99
+ targets: str | None = Field(default=None, description="Targets if not a global check")
99
100
 
100
101
 
101
102
  class TransformPythonInformation(BaseModel):
@@ -160,7 +161,7 @@ class InfrahubRepositoryIntegrator(InfrahubRepositoryBase):
160
161
 
161
162
  @flow(name="import-object-from-file", flow_run_name="Import objects")
162
163
  async def import_objects_from_files(
163
- self, infrahub_branch_name: str, git_branch_name: Optional[str] = None, commit: Optional[str] = None
164
+ self, infrahub_branch_name: str, git_branch_name: str | None = None, commit: str | None = None
164
165
  ) -> None:
165
166
  if not commit:
166
167
  commit = self.get_commit_value(branch_name=git_branch_name or infrahub_branch_name)
@@ -170,27 +171,27 @@ class InfrahubRepositoryIntegrator(InfrahubRepositoryBase):
170
171
  self.create_commit_worktree(commit)
171
172
  await self._update_sync_status(branch_name=infrahub_branch_name, status=RepositorySyncStatus.SYNCING)
172
173
 
173
- config_file = await self.get_repository_config(branch_name=infrahub_branch_name, commit=commit)
174
+ config_file = await self.get_repository_config(branch_name=infrahub_branch_name, commit=commit) # type: ignore[misc]
174
175
  sync_status = RepositorySyncStatus.IN_SYNC if config_file else RepositorySyncStatus.ERROR_IMPORT
175
176
  error: Exception | None = None
176
177
 
177
178
  try:
178
179
  if config_file:
179
- await self.import_schema_files(branch_name=infrahub_branch_name, commit=commit, config_file=config_file)
180
+ await self.import_schema_files(branch_name=infrahub_branch_name, commit=commit, config_file=config_file) # type: ignore[misc]
180
181
 
181
182
  await self.import_all_graphql_query(
182
183
  branch_name=infrahub_branch_name, commit=commit, config_file=config_file
183
- )
184
+ ) # type: ignore[misc]
184
185
 
185
186
  await self.import_all_python_files( # type: ignore[call-overload]
186
187
  branch_name=infrahub_branch_name, commit=commit, config_file=config_file
187
- )
188
+ ) # type: ignore[misc]
188
189
  await self.import_jinja2_transforms(
189
190
  branch_name=infrahub_branch_name, commit=commit, config_file=config_file
190
- )
191
+ ) # type: ignore[misc]
191
192
  await self.import_artifact_definitions(
192
193
  branch_name=infrahub_branch_name, commit=commit, config_file=config_file
193
- )
194
+ ) # type: ignore[misc]
194
195
 
195
196
  except Exception as exc:
196
197
  sync_status = RepositorySyncStatus.ERROR_IMPORT
@@ -442,7 +443,7 @@ class InfrahubRepositoryIntegrator(InfrahubRepositoryBase):
442
443
  await existing_artifact_definition.save()
443
444
 
444
445
  @task(name="repository-get-config", task_run_name="get repository config", cache_policy=NONE) # type: ignore[arg-type]
445
- async def get_repository_config(self, branch_name: str, commit: str) -> Optional[InfrahubRepositoryConfig]:
446
+ async def get_repository_config(self, branch_name: str, commit: str) -> InfrahubRepositoryConfig | None:
446
447
  branch_wt = self.get_worktree(identifier=commit or branch_name)
447
448
  log = get_run_logger()
448
449
 
@@ -635,7 +636,7 @@ class InfrahubRepositoryIntegrator(InfrahubRepositoryBase):
635
636
  module=module,
636
637
  file_path=file_info.relative_path_file,
637
638
  check_definition=check,
638
- )
639
+ ) # type: ignore[misc]
639
640
  )
640
641
 
641
642
  local_check_definitions = {check.name: check for check in checks}
@@ -796,7 +797,7 @@ class InfrahubRepositoryIntegrator(InfrahubRepositoryBase):
796
797
  module=module,
797
798
  file_path=file_info.relative_path_file,
798
799
  transform=transform,
799
- )
800
+ ) # type: ignore[misc]
800
801
  )
801
802
 
802
803
  local_transform_definitions = {transform.name: transform for transform in transforms}
@@ -1069,9 +1070,9 @@ class InfrahubRepositoryIntegrator(InfrahubRepositoryBase):
1069
1070
  ) -> None:
1070
1071
  await add_tags(branches=[branch_name], nodes=[str(self.id)])
1071
1072
 
1072
- await self.import_python_check_definitions(branch_name=branch_name, commit=commit, config_file=config_file)
1073
- await self.import_python_transforms(branch_name=branch_name, commit=commit, config_file=config_file)
1074
- await self.import_generator_definitions(branch_name=branch_name, commit=commit, config_file=config_file)
1073
+ await self.import_python_check_definitions(branch_name=branch_name, commit=commit, config_file=config_file) # type: ignore[misc]
1074
+ await self.import_python_transforms(branch_name=branch_name, commit=commit, config_file=config_file) # type: ignore[misc]
1075
+ await self.import_generator_definitions(branch_name=branch_name, commit=commit, config_file=config_file) # type: ignore[misc]
1075
1076
 
1076
1077
  @task(name="jinja2-template-render", task_run_name="Render Jinja2 template", cache_policy=NONE) # type: ignore[arg-type]
1077
1078
  async def render_jinja2_template(self, commit: str, location: str, data: dict) -> str:
@@ -1097,7 +1098,7 @@ class InfrahubRepositoryIntegrator(InfrahubRepositoryBase):
1097
1098
  location: str,
1098
1099
  class_name: str,
1099
1100
  client: InfrahubClient,
1100
- params: Optional[dict] = None,
1101
+ params: dict | None = None,
1101
1102
  ) -> InfrahubCheck:
1102
1103
  """Execute A Python Check stored in the repository."""
1103
1104
  log = get_run_logger()
@@ -1150,7 +1151,7 @@ class InfrahubRepositoryIntegrator(InfrahubRepositoryBase):
1150
1151
 
1151
1152
  @task(name="python-transform-execute", task_run_name="Execute Python Transform", cache_policy=NONE) # type: ignore[arg-type]
1152
1153
  async def execute_python_transform(
1153
- self, branch_name: str, commit: str, location: str, client: InfrahubClient, data: Optional[dict] = None
1154
+ self, branch_name: str, commit: str, location: str, client: InfrahubClient, data: dict | None = None
1154
1155
  ) -> Any:
1155
1156
  """Execute A Python Transform stored in the repository."""
1156
1157
  log = get_run_logger()
@@ -1226,7 +1227,7 @@ class InfrahubRepositoryIntegrator(InfrahubRepositoryBase):
1226
1227
  if transformation.typename == InfrahubKind.TRANSFORMJINJA2:
1227
1228
  artifact_content = await self.render_jinja2_template.with_options(
1228
1229
  timeout_seconds=transformation.timeout.value
1229
- )(commit=commit, location=transformation.template_path.value, data=response)
1230
+ )(commit=commit, location=transformation.template_path.value, data=response) # type: ignore[misc]
1230
1231
  elif transformation.typename == InfrahubKind.TRANSFORMPYTHON:
1231
1232
  transformation_location = f"{transformation.file_path.value}::{transformation.class_name.value}"
1232
1233
  artifact_content = await self.execute_python_transform.with_options(
@@ -1237,7 +1238,7 @@ class InfrahubRepositoryIntegrator(InfrahubRepositoryBase):
1237
1238
  location=transformation_location,
1238
1239
  data=response,
1239
1240
  client=self.sdk,
1240
- )
1241
+ ) # type: ignore[misc]
1241
1242
 
1242
1243
  if definition.content_type.value == ContentType.APPLICATION_JSON.value and isinstance(artifact_content, dict):
1243
1244
  artifact_content_str = ujson.dumps(artifact_content, indent=2)
@@ -1266,7 +1267,10 @@ class InfrahubRepositoryIntegrator(InfrahubRepositoryBase):
1266
1267
  return ArtifactGenerateResult(changed=True, checksum=checksum, storage_id=storage_id, artifact_id=artifact.id)
1267
1268
 
1268
1269
  async def render_artifact(
1269
- self, artifact: CoreArtifact, message: Union[CheckArtifactCreate, RequestArtifactGenerate]
1270
+ self,
1271
+ artifact: CoreArtifact,
1272
+ artifact_created: bool,
1273
+ message: CheckArtifactCreate | RequestArtifactGenerate,
1270
1274
  ) -> ArtifactGenerateResult:
1271
1275
  response = await self.sdk.query_gql_query(
1272
1276
  name=message.query,
@@ -1277,11 +1281,15 @@ class InfrahubRepositoryIntegrator(InfrahubRepositoryBase):
1277
1281
  branch_name=message.branch_name,
1278
1282
  timeout=message.timeout,
1279
1283
  )
1284
+ branch = registry.get_branch_from_registry(branch=message.branch_name)
1285
+
1286
+ previous_checksum = artifact.checksum.value
1287
+ previous_storage_id = artifact.storage_id.value
1280
1288
 
1281
1289
  if message.transform_type == InfrahubKind.TRANSFORMJINJA2:
1282
1290
  artifact_content = await self.render_jinja2_template.with_options(timeout_seconds=message.timeout)(
1283
1291
  commit=message.commit, location=message.transform_location, data=response
1284
- )
1292
+ ) # type: ignore[misc]
1285
1293
  elif message.transform_type == InfrahubKind.TRANSFORMPYTHON:
1286
1294
  artifact_content = await self.execute_python_transform.with_options(timeout_seconds=message.timeout)(
1287
1295
  branch_name=message.branch_name,
@@ -1289,7 +1297,7 @@ class InfrahubRepositoryIntegrator(InfrahubRepositoryBase):
1289
1297
  location=message.transform_location,
1290
1298
  data=response,
1291
1299
  client=self.sdk,
1292
- )
1300
+ ) # type: ignore[misc]
1293
1301
 
1294
1302
  if message.content_type == ContentType.APPLICATION_JSON.value and isinstance(artifact_content, dict):
1295
1303
  artifact_content_str = ujson.dumps(artifact_content, indent=2)
@@ -1315,4 +1323,20 @@ class InfrahubRepositoryIntegrator(InfrahubRepositoryBase):
1315
1323
  if artifact.name.value != message.artifact_name:
1316
1324
  artifact.name.value = message.artifact_name
1317
1325
  await artifact.save()
1326
+
1327
+ event_class = ArtifactCreatedEvent if artifact_created else ArtifactUpdatedEvent
1328
+
1329
+ event = event_class(
1330
+ node_id=artifact.id,
1331
+ target_id=message.target_id,
1332
+ target_kind=message.target_kind,
1333
+ artifact_definition_id=message.artifact_definition,
1334
+ meta=EventMeta.from_context(context=message.context, branch=branch),
1335
+ checksum=checksum,
1336
+ checksum_previous=previous_checksum,
1337
+ storage_id=storage_id,
1338
+ storage_id_previous=previous_storage_id,
1339
+ )
1340
+
1341
+ await self.service.event.send(event=event)
1318
1342
  return ArtifactGenerateResult(changed=True, checksum=checksum, storage_id=storage_id, artifact_id=artifact.id)
infrahub/git/models.py CHANGED
@@ -1,6 +1,7 @@
1
- from typing import Optional
1
+ from pydantic import BaseModel, ConfigDict, Field
2
2
 
3
- from pydantic import BaseModel, Field
3
+ from infrahub.context import InfrahubContext
4
+ from infrahub.message_bus.types import ProposedChangeBranchDiff
4
5
 
5
6
 
6
7
  class RequestArtifactDefinitionGenerate(BaseModel):
@@ -29,11 +30,13 @@ class RequestArtifactGenerate(BaseModel):
29
30
  repository_kind: str = Field(..., description="The kind of the Repository")
30
31
  branch_name: str = Field(..., description="The branch where the check is run")
31
32
  target_id: str = Field(..., description="The ID of the target object for this artifact")
33
+ target_kind: str = Field(..., description="The kind of the target object for this artifact")
32
34
  target_name: str = Field(..., description="Name of the artifact target")
33
- artifact_id: Optional[str] = Field(default=None, description="The id of the artifact if it previously existed")
35
+ artifact_id: str | None = Field(default=None, description="The id of the artifact if it previously existed")
34
36
  query: str = Field(..., description="The name of the query to use when collecting data")
35
37
  timeout: int = Field(..., description="Timeout for requests used to generate this artifact")
36
38
  variables: dict = Field(..., description="Input variables when generating the artifact")
39
+ context: InfrahubContext = Field(..., description="The context of the task")
37
40
 
38
41
 
39
42
  class GitRepositoryAdd(BaseModel):
@@ -42,8 +45,8 @@ class GitRepositoryAdd(BaseModel):
42
45
  location: str = Field(..., description="The external URL of the repository")
43
46
  repository_id: str = Field(..., description="The unique ID of the Repository")
44
47
  repository_name: str = Field(..., description="The name of the repository")
45
- created_by: Optional[str] = Field(default=None, description="The user ID of the user that created the repository")
46
- default_branch_name: Optional[str] = Field(None, description="Default branch for this repository")
48
+ created_by: str | None = Field(default=None, description="The user ID of the user that created the repository")
49
+ default_branch_name: str | None = Field(None, description="Default branch for this repository")
47
50
  infrahub_branch_name: str = Field(..., description="Infrahub branch on which to sync the remote repository")
48
51
  infrahub_branch_id: str = Field(..., description="Id of the Infrahub branch on which to sync the remote repository")
49
52
  internal_status: str = Field(..., description="Administrative status of the repository")
@@ -56,7 +59,7 @@ class GitRepositoryAddReadOnly(BaseModel):
56
59
  repository_id: str = Field(..., description="The unique ID of the Repository")
57
60
  repository_name: str = Field(..., description="The name of the repository")
58
61
  ref: str = Field(..., description="Ref to track on the external repository")
59
- created_by: Optional[str] = Field(default=None, description="The user ID of the user that created the repository")
62
+ created_by: str | None = Field(default=None, description="The user ID of the user that created the repository")
60
63
  infrahub_branch_name: str = Field(..., description="Infrahub branch on which to sync the remote repository")
61
64
  infrahub_branch_id: str = Field(..., description="Id of the Infrahub branch on which to sync the remote repository")
62
65
  internal_status: str = Field(..., description="Internal status of the repository")
@@ -68,8 +71,8 @@ class GitRepositoryPullReadOnly(BaseModel):
68
71
  location: str = Field(..., description="The external URL of the repository")
69
72
  repository_id: str = Field(..., description="The unique ID of the Repository")
70
73
  repository_name: str = Field(..., description="The name of the repository")
71
- ref: Optional[str] = Field(None, description="Ref to track on the external repository")
72
- commit: Optional[str] = Field(None, description="Specific commit to pull")
74
+ ref: str | None = Field(None, description="Ref to track on the external repository")
75
+ commit: str | None = Field(None, description="Specific commit to pull")
73
76
  infrahub_branch_name: str = Field(..., description="Infrahub branch on which to sync the remote repository")
74
77
  infrahub_branch_id: str = Field(..., description="Infrahub branch on which to sync the remote repository")
75
78
 
@@ -103,10 +106,99 @@ class GitDiffNamesOnly(BaseModel):
103
106
  repository_name: str = Field(..., description="The name of the repository")
104
107
  repository_kind: str = Field(..., description="The kind of the repository")
105
108
  first_commit: str = Field(..., description="The first commit")
106
- second_commit: Optional[str] = Field(None, description="The second commit")
109
+ second_commit: str | None = Field(None, description="The second commit")
107
110
 
108
111
 
109
112
  class GitDiffNamesOnlyResponse(BaseModel):
110
113
  files_added: list[str] = Field(..., description="Files added")
111
114
  files_changed: list[str] = Field(..., description="Files changed")
112
115
  files_removed: list[str] = Field(..., description="Files removed")
116
+
117
+
118
+ class UserCheckDefinitionData(BaseModel):
119
+ """Triggers user defined checks to run based on a Check Definition."""
120
+
121
+ model_config = ConfigDict(arbitrary_types_allowed=True)
122
+
123
+ check_definition_id: str = Field(..., description="The unique ID of the check definition")
124
+ commit: str = Field(..., description="The commit to target")
125
+ repository_id: str = Field(..., description="The unique ID of the Repository")
126
+ repository_name: str = Field(..., description="The name of the Repository")
127
+ branch_name: str = Field(..., description="The branch where the check is run")
128
+ file_path: str = Field(..., description="The path and filename of the check")
129
+ class_name: str = Field(..., description="The name of the class containing the check")
130
+ proposed_change: str = Field(..., description="The unique ID of the Proposed Change")
131
+ branch_diff: ProposedChangeBranchDiff = Field(..., description="The calculated diff between the two branches")
132
+
133
+
134
+ class UserCheckData(BaseModel):
135
+ """Runs a check as defined within a CoreCheckDefinition within a repository."""
136
+
137
+ model_config = ConfigDict(arbitrary_types_allowed=True)
138
+
139
+ validator_id: str = Field(..., description="The id of the validator associated with this check")
140
+ validator_execution_id: str = Field(..., description="The id of current execution of the associated validator")
141
+ check_execution_id: str = Field(..., description="The unique ID for the current execution of this check")
142
+ check_definition_id: str = Field(..., description="The unique ID of the check definition")
143
+ commit: str = Field(..., description="The commit to target")
144
+ repository_id: str = Field(..., description="The unique ID of the Repository")
145
+ repository_name: str = Field(..., description="The name of the Repository")
146
+ branch_name: str = Field(..., description="The branch where the check is run")
147
+ file_path: str = Field(..., description="The path and filename of the check")
148
+ class_name: str = Field(..., description="The name of the class containing the check")
149
+ proposed_change: str = Field(..., description="The unique ID of the Proposed Change")
150
+ variables: dict = Field(default_factory=dict, description="Input variables when running the check")
151
+ name: str = Field(..., description="The name of the check")
152
+ branch_diff: ProposedChangeBranchDiff = Field(..., description="The calculated diff between the two branches")
153
+ timeout: int = Field(..., description="The timeout for the check")
154
+
155
+
156
+ class TriggerRepositoryUserChecks(BaseModel):
157
+ """Sent to trigger the user defined checks on a repository."""
158
+
159
+ model_config = ConfigDict(arbitrary_types_allowed=True)
160
+
161
+ proposed_change: str = Field(..., description="The unique ID of the Proposed Change")
162
+ repository_id: str = Field(..., description="The unique ID of the Repository")
163
+ repository_name: str = Field(..., description="The name of the Repository")
164
+ source_branch: str = Field(..., description="The source branch")
165
+ source_branch_sync_with_git: bool = Field(..., description="Indicates if the source branch should sync with git")
166
+ target_branch: str = Field(..., description="The target branch")
167
+ branch_diff: ProposedChangeBranchDiff = Field(..., description="The calculated diff between the two branches")
168
+
169
+
170
+ class TriggerRepositoryInternalChecks(BaseModel):
171
+ """Sent to trigger the checks for a repository to be executed."""
172
+
173
+ proposed_change: str = Field(..., description="The unique ID of the Proposed Change")
174
+ repository: str = Field(..., description="The unique ID of the Repository")
175
+ source_branch: str = Field(..., description="The source branch")
176
+ target_branch: str = Field(..., description="The target branch")
177
+
178
+
179
+ class CheckRepositoryMergeConflicts(BaseModel):
180
+ """Runs a check to validate if there are merge conflicts for a proposed change between two branches."""
181
+
182
+ validator_id: str = Field(..., description="The id of the validator associated with this check")
183
+ validator_execution_id: str = Field(..., description="The id of current execution of the associated validator")
184
+ check_execution_id: str = Field(..., description="The unique ID for the current execution of this check")
185
+ proposed_change: str = Field(..., description="The unique ID of the Proposed Change")
186
+ repository_id: str = Field(..., description="The unique ID of the Repository")
187
+ repository_name: str = Field(..., description="The name of the Repository")
188
+ source_branch: str = Field(..., description="The source branch")
189
+ target_branch: str = Field(..., description="The target branch")
190
+
191
+
192
+ class RepositoryBranchInfo(BaseModel):
193
+ internal_status: str
194
+
195
+
196
+ class RepositoryData(BaseModel):
197
+ repository_id: str = Field(..., description="Id of the repository")
198
+ repository_name: str = Field(..., description="Name of the repository")
199
+ branches: dict[str, str] = Field(
200
+ ...,
201
+ description="Dictionary with the name of the branch as the key and the active commit id as the value",
202
+ )
203
+
204
+ branch_info: dict[str, RepositoryBranchInfo] = Field(default_factory=dict)
@@ -1,6 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
- from typing import TYPE_CHECKING, Any, Union
3
+ from typing import TYPE_CHECKING, Any
4
4
 
5
5
  from git.exc import BadName, GitCommandError
6
6
  from infrahub_sdk.exceptions import GraphQLError
@@ -250,7 +250,7 @@ class InfrahubReadOnlyRepository(InfrahubRepositoryIntegrator):
250
250
 
251
251
  async def get_initialized_repo(
252
252
  repository_id: str, name: str, service: InfrahubServices, repository_kind: str, commit: str | None = None
253
- ) -> Union[InfrahubReadOnlyRepository, InfrahubRepository]:
253
+ ) -> InfrahubReadOnlyRepository | InfrahubRepository:
254
254
  if repository_kind == InfrahubKind.REPOSITORY:
255
255
  return await InfrahubRepository.init(
256
256
  id=repository_id, name=name, commit=commit, client=service._client, service=service
@@ -266,7 +266,7 @@ async def get_initialized_repo(
266
266
 
267
267
  async def initialize_repo(
268
268
  location: str, repository_id: str, name: str, service: InfrahubServices, repository_kind: str
269
- ) -> Union[InfrahubReadOnlyRepository, InfrahubRepository]:
269
+ ) -> InfrahubReadOnlyRepository | InfrahubRepository:
270
270
  if repository_kind == InfrahubKind.REPOSITORY:
271
271
  return await InfrahubRepository.new(
272
272
  location=location, id=repository_id, name=name, client=service._client, service=service