infrahub-server 1.1.7__py3-none-any.whl → 1.2.0b1__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 (399) hide show
  1. infrahub/api/artifact.py +16 -4
  2. infrahub/api/dependencies.py +8 -0
  3. infrahub/api/oauth2.py +0 -1
  4. infrahub/api/oidc.py +0 -1
  5. infrahub/api/query.py +18 -7
  6. infrahub/api/schema.py +32 -6
  7. infrahub/api/transformation.py +12 -5
  8. infrahub/{message_bus/messages/check_artifact_create.py → artifacts/models.py} +5 -3
  9. infrahub/{message_bus/operations/check/artifact.py → artifacts/tasks.py} +26 -25
  10. infrahub/cli/__init__.py +0 -2
  11. infrahub/cli/db.py +6 -7
  12. infrahub/cli/events.py +8 -3
  13. infrahub/cli/git_agent.py +9 -7
  14. infrahub/cli/tasks.py +4 -6
  15. infrahub/computed_attribute/models.py +1 -1
  16. infrahub/computed_attribute/tasks.py +64 -17
  17. infrahub/computed_attribute/triggers.py +90 -0
  18. infrahub/config.py +1 -1
  19. infrahub/context.py +39 -0
  20. infrahub/core/account.py +5 -8
  21. infrahub/core/attribute.py +50 -21
  22. infrahub/core/branch/models.py +4 -4
  23. infrahub/core/branch/tasks.py +130 -125
  24. infrahub/core/changelog/__init__.py +0 -0
  25. infrahub/core/changelog/diff.py +283 -0
  26. infrahub/core/changelog/models.py +499 -0
  27. infrahub/core/constants/__init__.py +43 -2
  28. infrahub/core/constants/infrahubkind.py +1 -0
  29. infrahub/core/constants/schema.py +2 -0
  30. infrahub/core/diff/combiner.py +1 -1
  31. infrahub/core/diff/enricher/cardinality_one.py +6 -1
  32. infrahub/core/diff/enricher/hierarchy.py +22 -7
  33. infrahub/core/diff/enricher/labels.py +6 -1
  34. infrahub/core/diff/enricher/path_identifier.py +5 -1
  35. infrahub/core/diff/enricher/summary_counts.py +107 -0
  36. infrahub/core/diff/merger/merger.py +3 -1
  37. infrahub/core/diff/model/path.py +34 -11
  38. infrahub/core/diff/parent_node_adder.py +78 -0
  39. infrahub/core/diff/payload_builder.py +13 -2
  40. infrahub/core/diff/query/all_conflicts.py +1 -1
  41. infrahub/core/diff/query/artifact.py +1 -1
  42. infrahub/core/diff/query/delete_query.py +1 -1
  43. infrahub/core/diff/query/diff_get.py +1 -1
  44. infrahub/core/diff/query/diff_summary.py +1 -1
  45. infrahub/core/diff/query/field_specifiers.py +1 -1
  46. infrahub/core/diff/query/field_summary.py +1 -1
  47. infrahub/core/diff/query/filters.py +2 -2
  48. infrahub/core/diff/query/get_conflict_query.py +1 -1
  49. infrahub/core/diff/query/has_conflicts_query.py +1 -1
  50. infrahub/core/diff/query/merge.py +3 -3
  51. infrahub/core/diff/query/merge_tracking_id.py +1 -1
  52. infrahub/core/diff/query/roots_metadata.py +1 -1
  53. infrahub/core/diff/query/save.py +191 -185
  54. infrahub/core/diff/query/summary_counts_enricher.py +52 -5
  55. infrahub/core/diff/query/time_range_query.py +1 -1
  56. infrahub/core/diff/query/update_conflict_query.py +1 -1
  57. infrahub/core/diff/repository/deserializer.py +9 -4
  58. infrahub/core/diff/repository/repository.py +156 -38
  59. infrahub/core/diff/tasks.py +13 -12
  60. infrahub/core/enums.py +1 -1
  61. infrahub/core/graph/__init__.py +1 -1
  62. infrahub/core/graph/index.py +3 -0
  63. infrahub/core/integrity/object_conflict/conflict_recorder.py +1 -1
  64. infrahub/core/ipam/reconciler.py +1 -1
  65. infrahub/core/ipam/tasks.py +2 -3
  66. infrahub/core/manager.py +20 -15
  67. infrahub/core/merge.py +5 -2
  68. infrahub/core/migrations/graph/__init__.py +4 -0
  69. infrahub/core/migrations/graph/m001_add_version_to_graph.py +1 -1
  70. infrahub/core/migrations/graph/m002_attribute_is_default.py +2 -2
  71. infrahub/core/migrations/graph/m003_relationship_parent_optional.py +2 -2
  72. infrahub/core/migrations/graph/m004_add_attr_documentation.py +1 -1
  73. infrahub/core/migrations/graph/m005_add_rel_read_only.py +1 -1
  74. infrahub/core/migrations/graph/m006_add_rel_on_delete.py +1 -1
  75. infrahub/core/migrations/graph/m007_add_rel_allow_override.py +1 -1
  76. infrahub/core/migrations/graph/m008_add_human_friendly_id.py +1 -1
  77. infrahub/core/migrations/graph/m009_add_generate_profile_attr.py +1 -1
  78. infrahub/core/migrations/graph/m010_add_generate_profile_attr_generic.py +1 -1
  79. infrahub/core/migrations/graph/m011_remove_profile_relationship_schema.py +2 -2
  80. infrahub/core/migrations/graph/m012_convert_account_generic.py +12 -23
  81. infrahub/core/migrations/graph/m013_convert_git_password_credential.py +7 -11
  82. infrahub/core/migrations/graph/m014_remove_index_attr_value.py +2 -2
  83. infrahub/core/migrations/graph/m015_diff_format_update.py +1 -1
  84. infrahub/core/migrations/graph/m016_diff_delete_bug_fix.py +1 -1
  85. infrahub/core/migrations/graph/m017_add_core_profile.py +1 -1
  86. infrahub/core/migrations/graph/m018_uniqueness_nulls.py +2 -2
  87. infrahub/core/migrations/graph/m019_restore_rels_to_time.py +256 -0
  88. infrahub/core/migrations/graph/m020_add_generate_template_attr.py +48 -0
  89. infrahub/core/migrations/query/attribute_add.py +1 -1
  90. infrahub/core/migrations/query/attribute_rename.py +1 -1
  91. infrahub/core/migrations/query/delete_element_in_schema.py +1 -1
  92. infrahub/core/migrations/query/node_duplicate.py +39 -19
  93. infrahub/core/migrations/query/relationship_duplicate.py +1 -1
  94. infrahub/core/migrations/query/schema_attribute_update.py +1 -1
  95. infrahub/core/migrations/schema/node_attribute_remove.py +1 -1
  96. infrahub/core/migrations/schema/node_remove.py +27 -13
  97. infrahub/core/migrations/schema/tasks.py +5 -5
  98. infrahub/core/migrations/shared.py +4 -4
  99. infrahub/core/models.py +7 -8
  100. infrahub/core/node/__init__.py +164 -45
  101. infrahub/core/node/base.py +1 -1
  102. infrahub/core/node/delete_validator.py +4 -4
  103. infrahub/core/node/ipam.py +7 -7
  104. infrahub/core/node/resource_manager/ip_prefix_pool.py +8 -5
  105. infrahub/core/node/standard.py +3 -5
  106. infrahub/core/property.py +1 -1
  107. infrahub/core/protocols.py +6 -0
  108. infrahub/core/protocols_base.py +4 -2
  109. infrahub/core/query/__init__.py +2 -5
  110. infrahub/core/query/attribute.py +9 -9
  111. infrahub/core/query/branch.py +5 -5
  112. infrahub/core/query/delete.py +1 -1
  113. infrahub/core/query/diff.py +4 -4
  114. infrahub/core/query/ipam.py +4 -4
  115. infrahub/core/query/node.py +11 -12
  116. infrahub/core/query/relationship.py +211 -25
  117. infrahub/core/query/resource_manager.py +10 -10
  118. infrahub/core/query/standard_node.py +6 -6
  119. infrahub/core/query/task.py +3 -3
  120. infrahub/core/query/task_log.py +1 -1
  121. infrahub/core/query/utils.py +5 -5
  122. infrahub/core/registry.py +0 -2
  123. infrahub/core/relationship/constraints/count.py +1 -1
  124. infrahub/core/relationship/constraints/peer_kind.py +1 -1
  125. infrahub/core/relationship/model.py +76 -38
  126. infrahub/core/schema/__init__.py +6 -4
  127. infrahub/core/schema/attribute_schema.py +8 -0
  128. infrahub/core/schema/basenode_schema.py +13 -3
  129. infrahub/core/schema/definitions/core/__init__.py +153 -0
  130. infrahub/core/schema/definitions/core/account.py +168 -0
  131. infrahub/core/schema/definitions/core/artifact.py +127 -0
  132. infrahub/core/schema/definitions/core/builtin.py +21 -0
  133. infrahub/core/schema/definitions/core/check.py +60 -0
  134. infrahub/core/schema/definitions/core/generator.py +96 -0
  135. infrahub/core/schema/definitions/core/graphql_query.py +77 -0
  136. infrahub/core/schema/definitions/core/group.py +105 -0
  137. infrahub/core/schema/definitions/core/ipam.py +252 -0
  138. infrahub/core/schema/definitions/core/lineage.py +17 -0
  139. infrahub/core/schema/definitions/core/menu.py +46 -0
  140. infrahub/core/schema/definitions/core/permission.py +161 -0
  141. infrahub/core/schema/definitions/core/profile.py +29 -0
  142. infrahub/core/schema/definitions/core/propose_change.py +88 -0
  143. infrahub/core/schema/definitions/core/propose_change_comment.py +188 -0
  144. infrahub/core/schema/definitions/core/propose_change_validator.py +326 -0
  145. infrahub/core/schema/definitions/core/repository.py +280 -0
  146. infrahub/core/schema/definitions/core/resource_pool.py +180 -0
  147. infrahub/core/schema/definitions/core/template.py +12 -0
  148. infrahub/core/schema/definitions/core/transform.py +87 -0
  149. infrahub/core/schema/definitions/core/webhook.py +108 -0
  150. infrahub/core/schema/definitions/internal.py +16 -0
  151. infrahub/core/schema/generated/genericnode_schema.py +5 -0
  152. infrahub/core/schema/generated/node_schema.py +5 -0
  153. infrahub/core/schema/generic_schema.py +5 -1
  154. infrahub/core/schema/manager.py +45 -42
  155. infrahub/core/schema/node_schema.py +4 -0
  156. infrahub/core/schema/profile_schema.py +4 -0
  157. infrahub/core/schema/relationship_schema.py +10 -2
  158. infrahub/core/schema/schema_branch.py +260 -16
  159. infrahub/core/schema/template_schema.py +36 -0
  160. infrahub/core/task/user_task.py +7 -5
  161. infrahub/core/timestamp.py +3 -3
  162. infrahub/core/utils.py +2 -2
  163. infrahub/core/validators/attribute/choices.py +1 -1
  164. infrahub/core/validators/attribute/enum.py +1 -1
  165. infrahub/core/validators/attribute/kind.py +1 -1
  166. infrahub/core/validators/attribute/length.py +1 -1
  167. infrahub/core/validators/attribute/optional.py +1 -1
  168. infrahub/core/validators/attribute/regex.py +1 -1
  169. infrahub/core/validators/attribute/unique.py +1 -1
  170. infrahub/core/validators/checks_runner.py +37 -0
  171. infrahub/core/validators/node/generate_profile.py +1 -1
  172. infrahub/core/validators/node/hierarchy.py +1 -1
  173. infrahub/core/validators/query.py +1 -1
  174. infrahub/core/validators/relationship/count.py +1 -1
  175. infrahub/core/validators/relationship/optional.py +1 -1
  176. infrahub/core/validators/relationship/peer.py +1 -1
  177. infrahub/core/validators/tasks.py +8 -6
  178. infrahub/core/validators/uniqueness/query.py +1 -1
  179. infrahub/database/__init__.py +3 -2
  180. infrahub/database/memgraph.py +1 -1
  181. infrahub/dependencies/builder/diff/combiner.py +1 -1
  182. infrahub/dependencies/builder/diff/conflicts_enricher.py +1 -1
  183. infrahub/dependencies/builder/diff/deserializer.py +4 -2
  184. infrahub/dependencies/builder/diff/enricher/hierarchy.py +3 -1
  185. infrahub/dependencies/builder/diff/enricher/summary_counts.py +8 -0
  186. infrahub/dependencies/builder/diff/parent_node_adder.py +8 -0
  187. infrahub/events/artifact_action.py +76 -0
  188. infrahub/events/branch_action.py +50 -21
  189. infrahub/events/group_action.py +117 -0
  190. infrahub/events/models.py +164 -51
  191. infrahub/events/node_action.py +70 -8
  192. infrahub/events/repository_action.py +8 -8
  193. infrahub/events/schema_action.py +21 -8
  194. infrahub/exceptions.py +9 -0
  195. infrahub/generators/models.py +1 -0
  196. infrahub/generators/tasks.py +34 -15
  197. infrahub/git/base.py +3 -5
  198. infrahub/git/constants.py +0 -1
  199. infrahub/git/integrator.py +60 -36
  200. infrahub/git/models.py +80 -1
  201. infrahub/git/repository.py +7 -8
  202. infrahub/git/tasks.py +432 -112
  203. infrahub/git_credential/helper.py +2 -3
  204. infrahub/graphql/analyzer.py +572 -11
  205. infrahub/graphql/app.py +34 -26
  206. infrahub/graphql/auth/query_permission_checker/anonymous_checker.py +5 -5
  207. infrahub/graphql/auth/query_permission_checker/default_branch_checker.py +4 -4
  208. infrahub/graphql/auth/query_permission_checker/merge_operation_checker.py +4 -4
  209. infrahub/graphql/auth/query_permission_checker/object_permission_checker.py +28 -35
  210. infrahub/graphql/auth/query_permission_checker/super_admin_checker.py +5 -5
  211. infrahub/graphql/context.py +33 -0
  212. infrahub/graphql/enums.py +1 -1
  213. infrahub/graphql/initialization.py +5 -1
  214. infrahub/graphql/loaders/node.py +2 -2
  215. infrahub/graphql/manager.py +63 -63
  216. infrahub/graphql/mutations/account.py +20 -13
  217. infrahub/graphql/mutations/artifact_definition.py +16 -12
  218. infrahub/graphql/mutations/branch.py +86 -40
  219. infrahub/graphql/mutations/computed_attribute.py +24 -15
  220. infrahub/graphql/mutations/diff.py +33 -17
  221. infrahub/graphql/mutations/diff_conflict.py +14 -8
  222. infrahub/graphql/mutations/generator.py +83 -0
  223. infrahub/graphql/mutations/graphql_query.py +19 -11
  224. infrahub/graphql/mutations/ipam.py +25 -23
  225. infrahub/graphql/mutations/main.py +233 -45
  226. infrahub/graphql/mutations/menu.py +10 -10
  227. infrahub/graphql/mutations/proposed_change.py +36 -28
  228. infrahub/graphql/mutations/relationship.py +341 -130
  229. infrahub/graphql/mutations/repository.py +41 -35
  230. infrahub/graphql/mutations/resource_manager.py +26 -26
  231. infrahub/graphql/mutations/schema.py +66 -33
  232. infrahub/graphql/mutations/tasks.py +10 -7
  233. infrahub/graphql/parser.py +1 -1
  234. infrahub/graphql/permissions.py +3 -10
  235. infrahub/graphql/queries/account.py +22 -18
  236. infrahub/graphql/queries/branch.py +6 -4
  237. infrahub/graphql/queries/diff/tree.py +63 -52
  238. infrahub/graphql/queries/event.py +115 -0
  239. infrahub/graphql/queries/internal.py +3 -3
  240. infrahub/graphql/queries/ipam.py +23 -18
  241. infrahub/graphql/queries/relationship.py +11 -10
  242. infrahub/graphql/queries/resource_manager.py +37 -25
  243. infrahub/graphql/queries/search.py +9 -8
  244. infrahub/graphql/queries/status.py +12 -9
  245. infrahub/graphql/queries/task.py +11 -9
  246. infrahub/graphql/resolvers/resolver.py +69 -43
  247. infrahub/graphql/resolvers/single_relationship.py +16 -10
  248. infrahub/graphql/schema.py +4 -0
  249. infrahub/graphql/subscription/__init__.py +1 -1
  250. infrahub/graphql/subscription/events.py +1 -1
  251. infrahub/graphql/subscription/graphql_query.py +8 -8
  252. infrahub/graphql/types/branch.py +2 -2
  253. infrahub/graphql/types/common.py +6 -1
  254. infrahub/graphql/types/context.py +12 -0
  255. infrahub/graphql/types/enums.py +2 -0
  256. infrahub/graphql/types/event.py +158 -0
  257. infrahub/graphql/types/interface.py +2 -2
  258. infrahub/graphql/types/node.py +3 -3
  259. infrahub/graphql/types/permission.py +2 -2
  260. infrahub/graphql/types/relationship.py +3 -3
  261. infrahub/graphql/types/standard_node.py +9 -11
  262. infrahub/graphql/utils.py +28 -182
  263. infrahub/groups/tasks.py +2 -3
  264. infrahub/lock.py +21 -21
  265. infrahub/menu/generator.py +0 -1
  266. infrahub/menu/menu.py +116 -138
  267. infrahub/menu/models.py +4 -4
  268. infrahub/message_bus/__init__.py +11 -13
  269. infrahub/message_bus/messages/__init__.py +0 -14
  270. infrahub/message_bus/messages/check_generator_run.py +1 -3
  271. infrahub/message_bus/messages/event_branch_merge.py +3 -0
  272. infrahub/message_bus/messages/proposed_change/request_proposedchange_refreshartifacts.py +6 -0
  273. infrahub/message_bus/messages/request_proposedchange_pipeline.py +2 -0
  274. infrahub/message_bus/messages/send_echo_request.py +1 -1
  275. infrahub/message_bus/operations/__init__.py +4 -13
  276. infrahub/message_bus/operations/check/__init__.py +2 -2
  277. infrahub/message_bus/operations/check/generator.py +1 -3
  278. infrahub/message_bus/operations/event/branch.py +7 -3
  279. infrahub/message_bus/operations/event/schema.py +1 -1
  280. infrahub/message_bus/operations/event/worker.py +0 -3
  281. infrahub/message_bus/operations/finalize/validator.py +1 -1
  282. infrahub/message_bus/operations/git/file.py +2 -2
  283. infrahub/message_bus/operations/git/repository.py +1 -1
  284. infrahub/message_bus/operations/requests/__init__.py +0 -4
  285. infrahub/message_bus/operations/requests/generator_definition.py +2 -4
  286. infrahub/message_bus/operations/requests/proposed_change.py +37 -20
  287. infrahub/message_bus/operations/send/echo.py +1 -1
  288. infrahub/message_bus/types.py +1 -1
  289. infrahub/permissions/globals.py +15 -0
  290. infrahub/pools/prefix.py +29 -165
  291. infrahub/prefect_server/__init__.py +0 -0
  292. infrahub/prefect_server/app.py +18 -0
  293. infrahub/prefect_server/database.py +20 -0
  294. infrahub/prefect_server/events.py +28 -0
  295. infrahub/prefect_server/models.py +46 -0
  296. infrahub/proposed_change/models.py +18 -1
  297. infrahub/proposed_change/tasks.py +195 -53
  298. infrahub/pytest_plugin.py +4 -4
  299. infrahub/server.py +13 -12
  300. infrahub/services/__init__.py +148 -63
  301. infrahub/services/adapters/cache/__init__.py +11 -11
  302. infrahub/services/adapters/cache/nats.py +42 -25
  303. infrahub/services/adapters/cache/redis.py +3 -11
  304. infrahub/services/adapters/event/__init__.py +10 -18
  305. infrahub/services/adapters/http/__init__.py +0 -5
  306. infrahub/services/adapters/http/httpx.py +22 -15
  307. infrahub/services/adapters/message_bus/__init__.py +25 -8
  308. infrahub/services/adapters/message_bus/local.py +9 -7
  309. infrahub/services/adapters/message_bus/nats.py +14 -8
  310. infrahub/services/adapters/message_bus/rabbitmq.py +23 -10
  311. infrahub/services/adapters/workflow/__init__.py +11 -8
  312. infrahub/services/adapters/workflow/local.py +27 -6
  313. infrahub/services/adapters/workflow/worker.py +23 -7
  314. infrahub/services/component.py +43 -40
  315. infrahub/services/protocols.py +7 -7
  316. infrahub/services/scheduler.py +30 -29
  317. infrahub/storage.py +2 -4
  318. infrahub/task_manager/constants.py +1 -1
  319. infrahub/task_manager/event.py +261 -0
  320. infrahub/task_manager/models.py +147 -3
  321. infrahub/task_manager/task.py +1 -1
  322. infrahub/tasks/artifact.py +19 -18
  323. infrahub/tasks/registry.py +1 -1
  324. infrahub/tasks/telemetry.py +13 -14
  325. infrahub/transformations/tasks.py +3 -5
  326. infrahub/trigger/__init__.py +0 -0
  327. infrahub/trigger/catalogue.py +16 -0
  328. infrahub/trigger/constants.py +9 -0
  329. infrahub/trigger/models.py +105 -0
  330. infrahub/trigger/tasks.py +91 -0
  331. infrahub/types.py +1 -1
  332. infrahub/utils.py +1 -1
  333. infrahub/webhook/constants.py +0 -2
  334. infrahub/webhook/models.py +161 -40
  335. infrahub/webhook/tasks.py +123 -202
  336. infrahub/webhook/triggers.py +27 -0
  337. infrahub/workers/infrahub_async.py +36 -25
  338. infrahub/workers/utils.py +63 -0
  339. infrahub/workflows/catalogue.py +71 -52
  340. infrahub/workflows/initialization.py +14 -8
  341. infrahub/workflows/models.py +28 -4
  342. infrahub/workflows/utils.py +1 -1
  343. infrahub_sdk/batch.py +2 -2
  344. infrahub_sdk/client.py +8 -0
  345. infrahub_sdk/config.py +1 -1
  346. infrahub_sdk/ctl/branch.py +3 -2
  347. infrahub_sdk/ctl/check.py +4 -4
  348. infrahub_sdk/ctl/cli_commands.py +16 -11
  349. infrahub_sdk/ctl/exceptions.py +0 -6
  350. infrahub_sdk/ctl/exporter.py +1 -1
  351. infrahub_sdk/ctl/generator.py +5 -5
  352. infrahub_sdk/ctl/importer.py +3 -2
  353. infrahub_sdk/ctl/menu.py +1 -1
  354. infrahub_sdk/ctl/object.py +1 -1
  355. infrahub_sdk/ctl/repository.py +23 -15
  356. infrahub_sdk/ctl/schema.py +2 -2
  357. infrahub_sdk/ctl/utils.py +6 -21
  358. infrahub_sdk/ctl/validate.py +2 -1
  359. infrahub_sdk/data.py +1 -1
  360. infrahub_sdk/exceptions.py +12 -0
  361. infrahub_sdk/generator.py +3 -0
  362. infrahub_sdk/node.py +5 -8
  363. infrahub_sdk/protocols.py +20 -8
  364. infrahub_sdk/schema/__init__.py +14 -5
  365. infrahub_sdk/schema/main.py +7 -0
  366. infrahub_sdk/task/__init__.py +1 -0
  367. infrahub_sdk/task/constants.py +3 -0
  368. infrahub_sdk/task/exceptions.py +25 -0
  369. infrahub_sdk/task/manager.py +545 -0
  370. infrahub_sdk/task/models.py +74 -0
  371. infrahub_sdk/testing/docker.py +30 -0
  372. infrahub_sdk/timestamp.py +134 -33
  373. infrahub_sdk/transfer/exporter/json.py +1 -1
  374. infrahub_sdk/utils.py +39 -1
  375. infrahub_sdk/yaml.py +2 -3
  376. {infrahub_server-1.1.7.dist-info → infrahub_server-1.2.0b1.dist-info}/METADATA +7 -6
  377. {infrahub_server-1.1.7.dist-info → infrahub_server-1.2.0b1.dist-info}/RECORD +383 -339
  378. infrahub_testcontainers/container.py +2 -3
  379. infrahub_testcontainers/docker-compose.test.yml +2 -2
  380. infrahub/core/branch/constants.py +0 -2
  381. infrahub/core/schema/definitions/core.py +0 -2274
  382. infrahub/graphql/query.py +0 -52
  383. infrahub/message_bus/messages/check_repository_checkdefinition.py +0 -20
  384. infrahub/message_bus/messages/check_repository_mergeconflicts.py +0 -16
  385. infrahub/message_bus/messages/check_repository_usercheck.py +0 -26
  386. infrahub/message_bus/messages/request_artifactdefinition_check.py +0 -17
  387. infrahub/message_bus/messages/request_repository_checks.py +0 -12
  388. infrahub/message_bus/messages/request_repository_userchecks.py +0 -18
  389. infrahub/message_bus/operations/check/repository.py +0 -293
  390. infrahub/message_bus/operations/requests/artifact_definition.py +0 -148
  391. infrahub/message_bus/operations/requests/repository.py +0 -133
  392. infrahub/schema/constants.py +0 -1
  393. infrahub/schema/tasks.py +0 -76
  394. infrahub/services/adapters/database/__init__.py +0 -9
  395. infrahub_sdk/ctl/_file.py +0 -13
  396. /infrahub/{schema → artifacts}/__init__.py +0 -0
  397. {infrahub_server-1.1.7.dist-info → infrahub_server-1.2.0b1.dist-info}/LICENSE.txt +0 -0
  398. {infrahub_server-1.1.7.dist-info → infrahub_server-1.2.0b1.dist-info}/WHEEL +0 -0
  399. {infrahub_server-1.1.7.dist-info → infrahub_server-1.2.0b1.dist-info}/entry_points.txt +0 -0
File without changes
@@ -0,0 +1,283 @@
1
+ from __future__ import annotations
2
+
3
+ from dataclasses import dataclass
4
+ from typing import TYPE_CHECKING, Sequence
5
+
6
+ from infrahub_sdk.utils import str_to_bool
7
+
8
+ from infrahub.core.constants import DiffAction, RelationshipCardinality
9
+ from infrahub.core.constants.database import DatabaseEdgeType
10
+ from infrahub.core.diff.model.path import ConflictSelection
11
+
12
+ from .models import (
13
+ AttributeChangelog,
14
+ NodeChangelog,
15
+ RelationshipCardinalityManyChangelog,
16
+ RelationshipCardinalityOneChangelog,
17
+ RelationshipPeerChangelog,
18
+ )
19
+
20
+ if TYPE_CHECKING:
21
+ from infrahub.core.branch import Branch
22
+ from infrahub.core.diff.model.path import (
23
+ EnrichedDiffAttribute,
24
+ EnrichedDiffNode,
25
+ EnrichedDiffProperty,
26
+ EnrichedDiffRelationship,
27
+ EnrichedDiffRoot,
28
+ )
29
+ from infrahub.core.models import SchemaUpdateMigrationInfo
30
+ from infrahub.core.schema import MainSchemaTypes
31
+ from infrahub.database import InfrahubDatabase
32
+
33
+
34
+ @dataclass
35
+ class NodeInDiff:
36
+ node_id: str
37
+ kind: str
38
+ label: str
39
+
40
+
41
+ class DiffChangelogCollector:
42
+ def __init__(
43
+ self,
44
+ diff: EnrichedDiffRoot,
45
+ branch: Branch,
46
+ db: InfrahubDatabase,
47
+ migration_tracker: MigrationTracker | None = None,
48
+ ) -> None:
49
+ self._diff = diff
50
+ self._branch = branch
51
+ self._db = db
52
+ self._diff_nodes: dict[str, NodeInDiff]
53
+ self.migration = migration_tracker or MigrationTracker()
54
+
55
+ def _populate_diff_nodes(self) -> None:
56
+ self._diff_nodes = {
57
+ node.uuid: NodeInDiff(node_id=node.uuid, kind=node.kind, label=node.label) for node in self._diff.nodes
58
+ }
59
+
60
+ def get_node(self, node_id: str) -> NodeInDiff:
61
+ return self._diff_nodes[node_id]
62
+
63
+ def get_peer_kind(self, peer_id: str, node_kind: str, relationship_name: str) -> str:
64
+ """If the peer kind doesn't exist in the diff use the peer kind from the schema"""
65
+ try:
66
+ return self.get_node(node_id=peer_id).kind
67
+ except KeyError:
68
+ schema = self._db.schema.get(node_kind, branch=self._branch, duplicate=False)
69
+ rel_schema = schema.get_relationship(name=relationship_name)
70
+ return rel_schema.peer
71
+
72
+ def _process_node(self, node: EnrichedDiffNode) -> NodeChangelog:
73
+ node_changelog = NodeChangelog(node_id=node.uuid, node_kind=node.kind, display_label=node.label)
74
+ schema = self._db.schema.get(node_changelog.node_kind, branch=self._branch, duplicate=False)
75
+ for attribute in node.attributes:
76
+ self._process_node_attribute(node=node_changelog, attribute=attribute, schema=schema)
77
+
78
+ for relationship in node.relationships:
79
+ self._process_node_relationship(node=node_changelog, relationship=relationship)
80
+
81
+ return node_changelog
82
+
83
+ def _process_node_attribute(
84
+ self, node: NodeChangelog, attribute: EnrichedDiffAttribute, schema: MainSchemaTypes
85
+ ) -> None:
86
+ try:
87
+ schema_attribute = schema.get_attribute(name=attribute.name)
88
+ attribute_kind = schema_attribute.kind
89
+ except ValueError:
90
+ # This would currently happen if there has been a schema migration as part of the merge
91
+ # then we don't have access to the attribute kind
92
+ attribute_kind = "n/a"
93
+
94
+ changelog_attribute = AttributeChangelog(
95
+ name=self.migration.get_attribute_name(node=node, attribute=attribute), kind=attribute_kind
96
+ )
97
+ for attr_property in attribute.properties:
98
+ match attr_property.property_type:
99
+ case DatabaseEdgeType.HAS_VALUE:
100
+ # TODO deserialize correct value type from string
101
+ if _keep_branch_update(diff_property=attr_property):
102
+ changelog_attribute.set_value(value=attr_property.new_value)
103
+ changelog_attribute.set_value_previous(value=attr_property.previous_value)
104
+ case DatabaseEdgeType.IS_PROTECTED:
105
+ if _keep_branch_update(diff_property=attr_property):
106
+ changelog_attribute.add_property(
107
+ name="is_protected",
108
+ value_current=self._convert_string_boolean_value(value=attr_property.new_value),
109
+ value_previous=self._convert_string_boolean_value(value=attr_property.previous_value),
110
+ )
111
+ case DatabaseEdgeType.IS_VISIBLE:
112
+ if _keep_branch_update(diff_property=attr_property):
113
+ changelog_attribute.add_property(
114
+ name="is_visible",
115
+ value_current=self._convert_string_boolean_value(value=attr_property.new_value),
116
+ value_previous=self._convert_string_boolean_value(value=attr_property.previous_value),
117
+ )
118
+ case DatabaseEdgeType.HAS_SOURCE:
119
+ if _keep_branch_update(diff_property=attr_property):
120
+ changelog_attribute.add_property(
121
+ name="source",
122
+ value_current=attr_property.new_value,
123
+ value_previous=attr_property.previous_value,
124
+ )
125
+ case DatabaseEdgeType.HAS_OWNER:
126
+ if _keep_branch_update(diff_property=attr_property):
127
+ changelog_attribute.add_property(
128
+ name="owner",
129
+ value_current=attr_property.new_value,
130
+ value_previous=attr_property.previous_value,
131
+ )
132
+
133
+ node.add_attribute(attribute=changelog_attribute)
134
+
135
+ def _process_node_relationship(self, node: NodeChangelog, relationship: EnrichedDiffRelationship) -> None:
136
+ match relationship.cardinality:
137
+ case RelationshipCardinality.ONE:
138
+ self._process_node_cardinality_one_relationship(node=node, relationship=relationship)
139
+
140
+ case RelationshipCardinality.MANY:
141
+ self._process_node_cardinality_many_relationship(node=node, relationship=relationship)
142
+
143
+ def _process_node_cardinality_one_relationship(
144
+ self, node: NodeChangelog, relationship: EnrichedDiffRelationship
145
+ ) -> None:
146
+ changelog_rel = RelationshipCardinalityOneChangelog(name=relationship.name)
147
+ for entry in relationship.relationships:
148
+ for rel_prop in entry.properties:
149
+ match rel_prop.property_type:
150
+ case DatabaseEdgeType.IS_RELATED:
151
+ if rel_prop.new_value:
152
+ changelog_rel.peer_id = rel_prop.new_value
153
+ changelog_rel.peer_kind = self.get_peer_kind(
154
+ peer_id=rel_prop.new_value,
155
+ node_kind=node.node_kind,
156
+ relationship_name=relationship.name,
157
+ )
158
+ if rel_prop.previous_value:
159
+ changelog_rel.peer_id_previous = rel_prop.previous_value
160
+ changelog_rel.peer_kind_previous = self.get_peer_kind(
161
+ peer_id=rel_prop.previous_value,
162
+ node_kind=node.node_kind,
163
+ relationship_name=relationship.name,
164
+ )
165
+ case DatabaseEdgeType.IS_PROTECTED:
166
+ changelog_rel.add_property(
167
+ name="is_protected",
168
+ value_current=self._convert_string_boolean_value(value=rel_prop.new_value),
169
+ value_previous=self._convert_string_boolean_value(value=rel_prop.previous_value),
170
+ )
171
+ case DatabaseEdgeType.IS_VISIBLE:
172
+ changelog_rel.add_property(
173
+ name="is_visible",
174
+ value_current=self._convert_string_boolean_value(value=rel_prop.new_value),
175
+ value_previous=self._convert_string_boolean_value(value=rel_prop.previous_value),
176
+ )
177
+ case DatabaseEdgeType.HAS_OWNER:
178
+ changelog_rel.add_property(
179
+ name="owner",
180
+ value_current=rel_prop.new_value,
181
+ value_previous=rel_prop.previous_value,
182
+ )
183
+ case DatabaseEdgeType.HAS_SOURCE:
184
+ changelog_rel.add_property(
185
+ name="source",
186
+ value_current=rel_prop.new_value,
187
+ value_previous=rel_prop.previous_value,
188
+ )
189
+
190
+ node.add_relationship(relationship_changelog=changelog_rel)
191
+
192
+ def _convert_string_boolean_value(self, value: str | None) -> bool | None:
193
+ """Convert string based boolean for is_protected and is_visible."""
194
+ if value is not None:
195
+ return str_to_bool(value)
196
+
197
+ return None
198
+
199
+ def _process_node_cardinality_many_relationship(
200
+ self, node: NodeChangelog, relationship: EnrichedDiffRelationship
201
+ ) -> None:
202
+ changelog_rel = RelationshipCardinalityManyChangelog(name=relationship.name)
203
+ for peer in relationship.relationships:
204
+ peer_log = RelationshipPeerChangelog(
205
+ peer_id=peer.peer_id,
206
+ peer_kind=self.get_peer_kind(
207
+ peer_id=peer.peer_id, node_kind=node.node_kind, relationship_name=relationship.name
208
+ ),
209
+ peer_status=peer.action,
210
+ )
211
+ for peer_prop in peer.properties:
212
+ match peer_prop.property_type:
213
+ case DatabaseEdgeType.IS_VISIBLE:
214
+ peer_log.add_property(
215
+ name="is_visible",
216
+ value_current=self._convert_string_boolean_value(value=peer_prop.new_value),
217
+ value_previous=self._convert_string_boolean_value(value=peer_prop.previous_value),
218
+ )
219
+ case DatabaseEdgeType.IS_PROTECTED:
220
+ peer_log.add_property(
221
+ name="is_protected",
222
+ value_current=self._convert_string_boolean_value(value=peer_prop.new_value),
223
+ value_previous=self._convert_string_boolean_value(value=peer_prop.previous_value),
224
+ )
225
+ case DatabaseEdgeType.HAS_OWNER:
226
+ peer_log.add_property(
227
+ name="owner",
228
+ value_current=peer_prop.new_value,
229
+ value_previous=peer_prop.previous_value,
230
+ )
231
+ case DatabaseEdgeType.HAS_SOURCE:
232
+ peer_log.add_property(
233
+ name="source",
234
+ value_current=peer_prop.new_value,
235
+ value_previous=peer_prop.previous_value,
236
+ )
237
+
238
+ changelog_rel.peers.append(peer_log)
239
+
240
+ node.add_relationship(relationship_changelog=changelog_rel)
241
+
242
+ def collect_changelogs(self) -> Sequence[tuple[DiffAction, NodeChangelog]]:
243
+ self._populate_diff_nodes()
244
+ changelogs = [
245
+ (node.action, self._process_node(node=node))
246
+ for node in self._diff.nodes
247
+ if node.action != DiffAction.UNCHANGED
248
+ ]
249
+ return [(action, node_changelog) for action, node_changelog in changelogs if node_changelog.has_changes]
250
+
251
+
252
+ def _keep_branch_update(diff_property: EnrichedDiffProperty) -> bool:
253
+ if diff_property.conflict and diff_property.conflict.selected_branch == ConflictSelection.BASE_BRANCH:
254
+ return False
255
+ return True
256
+
257
+
258
+ class MigrationTracker:
259
+ """Keeps track of schema updates that happened as part of a migration"""
260
+
261
+ def __init__(self, migrations: list[SchemaUpdateMigrationInfo] | None = None) -> None:
262
+ # A dictionary of Node kind, previous attribute name and new attribute
263
+ # {"TestPerson": {"old_attribute_name": "new_attribute_name"}}
264
+ self._migrations_attribute_map: dict[str, dict[str, str]] = {}
265
+
266
+ migrations = migrations or []
267
+ for migration in migrations:
268
+ if migration.migration_name == "attribute.name.update":
269
+ if migration.path.schema_kind not in self._migrations_attribute_map:
270
+ self._migrations_attribute_map[migration.path.schema_kind] = {}
271
+ if migration.path.property_name and migration.path.field_name:
272
+ self._migrations_attribute_map[migration.path.schema_kind][migration.path.property_name] = (
273
+ migration.path.field_name
274
+ )
275
+
276
+ def get_attribute_name(self, node: NodeChangelog, attribute: EnrichedDiffAttribute) -> str:
277
+ """Return the current name of the requested attribute"""
278
+ if node.node_kind not in self._migrations_attribute_map:
279
+ return attribute.name
280
+ if attribute.name not in self._migrations_attribute_map[node.node_kind]:
281
+ return attribute.name
282
+
283
+ return self._migrations_attribute_map[node.node_kind][attribute.name]