infrahub-server 1.1.6__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 (407) 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 +54 -22
  22. infrahub/core/branch/models.py +4 -4
  23. infrahub/core/branch/tasks.py +137 -129
  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 +12 -8
  31. infrahub/core/diff/coordinator.py +49 -70
  32. infrahub/core/diff/data_check_synchronizer.py +86 -7
  33. infrahub/core/diff/enricher/aggregated.py +3 -3
  34. infrahub/core/diff/enricher/cardinality_one.py +7 -7
  35. infrahub/core/diff/enricher/hierarchy.py +22 -7
  36. infrahub/core/diff/enricher/labels.py +19 -4
  37. infrahub/core/diff/enricher/path_identifier.py +7 -9
  38. infrahub/core/diff/enricher/summary_counts.py +3 -1
  39. infrahub/core/diff/merger/merger.py +8 -4
  40. infrahub/core/diff/model/path.py +76 -35
  41. infrahub/core/diff/parent_node_adder.py +78 -0
  42. infrahub/core/diff/payload_builder.py +13 -2
  43. infrahub/core/diff/query/all_conflicts.py +6 -3
  44. infrahub/core/diff/query/artifact.py +1 -1
  45. infrahub/core/diff/query/delete_query.py +1 -1
  46. infrahub/core/diff/query/diff_get.py +3 -2
  47. infrahub/core/diff/query/diff_summary.py +1 -1
  48. infrahub/core/diff/query/field_specifiers.py +3 -1
  49. infrahub/core/diff/query/field_summary.py +3 -2
  50. infrahub/core/diff/query/filters.py +14 -3
  51. infrahub/core/diff/query/get_conflict_query.py +1 -1
  52. infrahub/core/diff/query/has_conflicts_query.py +6 -3
  53. infrahub/core/diff/query/merge.py +3 -3
  54. infrahub/core/diff/query/{drop_tracking_id.py → merge_tracking_id.py} +4 -4
  55. infrahub/core/diff/query/roots_metadata.py +9 -2
  56. infrahub/core/diff/query/save.py +233 -142
  57. infrahub/core/diff/query/summary_counts_enricher.py +267 -0
  58. infrahub/core/diff/query/time_range_query.py +3 -2
  59. infrahub/core/diff/query/update_conflict_query.py +1 -1
  60. infrahub/core/diff/query_parser.py +49 -24
  61. infrahub/core/diff/repository/deserializer.py +32 -28
  62. infrahub/core/diff/repository/repository.py +215 -41
  63. infrahub/core/diff/tasks.py +13 -12
  64. infrahub/core/enums.py +1 -1
  65. infrahub/core/graph/__init__.py +1 -1
  66. infrahub/core/graph/index.py +3 -0
  67. infrahub/core/integrity/object_conflict/conflict_recorder.py +1 -1
  68. infrahub/core/ipam/reconciler.py +1 -1
  69. infrahub/core/ipam/tasks.py +2 -3
  70. infrahub/core/manager.py +20 -15
  71. infrahub/core/merge.py +5 -2
  72. infrahub/core/migrations/graph/__init__.py +4 -0
  73. infrahub/core/migrations/graph/m001_add_version_to_graph.py +1 -1
  74. infrahub/core/migrations/graph/m002_attribute_is_default.py +2 -2
  75. infrahub/core/migrations/graph/m003_relationship_parent_optional.py +2 -2
  76. infrahub/core/migrations/graph/m004_add_attr_documentation.py +1 -1
  77. infrahub/core/migrations/graph/m005_add_rel_read_only.py +1 -1
  78. infrahub/core/migrations/graph/m006_add_rel_on_delete.py +1 -1
  79. infrahub/core/migrations/graph/m007_add_rel_allow_override.py +1 -1
  80. infrahub/core/migrations/graph/m008_add_human_friendly_id.py +1 -1
  81. infrahub/core/migrations/graph/m009_add_generate_profile_attr.py +1 -1
  82. infrahub/core/migrations/graph/m010_add_generate_profile_attr_generic.py +1 -1
  83. infrahub/core/migrations/graph/m011_remove_profile_relationship_schema.py +2 -2
  84. infrahub/core/migrations/graph/m012_convert_account_generic.py +12 -23
  85. infrahub/core/migrations/graph/m013_convert_git_password_credential.py +7 -11
  86. infrahub/core/migrations/graph/m014_remove_index_attr_value.py +2 -2
  87. infrahub/core/migrations/graph/m015_diff_format_update.py +1 -1
  88. infrahub/core/migrations/graph/m016_diff_delete_bug_fix.py +1 -1
  89. infrahub/core/migrations/graph/m017_add_core_profile.py +1 -1
  90. infrahub/core/migrations/graph/m018_uniqueness_nulls.py +2 -2
  91. infrahub/core/migrations/graph/m019_restore_rels_to_time.py +256 -0
  92. infrahub/core/migrations/graph/m020_add_generate_template_attr.py +48 -0
  93. infrahub/core/migrations/query/attribute_add.py +1 -1
  94. infrahub/core/migrations/query/attribute_rename.py +1 -1
  95. infrahub/core/migrations/query/delete_element_in_schema.py +1 -1
  96. infrahub/core/migrations/query/node_duplicate.py +39 -19
  97. infrahub/core/migrations/query/relationship_duplicate.py +1 -1
  98. infrahub/core/migrations/query/schema_attribute_update.py +1 -1
  99. infrahub/core/migrations/schema/node_attribute_remove.py +1 -1
  100. infrahub/core/migrations/schema/node_remove.py +27 -13
  101. infrahub/core/migrations/schema/tasks.py +5 -5
  102. infrahub/core/migrations/shared.py +4 -4
  103. infrahub/core/models.py +7 -8
  104. infrahub/core/node/__init__.py +170 -46
  105. infrahub/core/node/base.py +1 -1
  106. infrahub/core/node/constraints/grouped_uniqueness.py +9 -2
  107. infrahub/core/node/delete_validator.py +4 -4
  108. infrahub/core/node/ipam.py +13 -8
  109. infrahub/core/node/permissions.py +4 -0
  110. infrahub/core/node/resource_manager/ip_prefix_pool.py +8 -5
  111. infrahub/core/node/standard.py +3 -5
  112. infrahub/core/property.py +1 -1
  113. infrahub/core/protocols.py +6 -0
  114. infrahub/core/protocols_base.py +4 -2
  115. infrahub/core/query/__init__.py +2 -5
  116. infrahub/core/query/attribute.py +9 -9
  117. infrahub/core/query/branch.py +5 -5
  118. infrahub/core/query/delete.py +1 -1
  119. infrahub/core/query/diff.py +45 -7
  120. infrahub/core/query/ipam.py +4 -4
  121. infrahub/core/query/node.py +19 -14
  122. infrahub/core/query/relationship.py +213 -26
  123. infrahub/core/query/resource_manager.py +13 -11
  124. infrahub/core/query/standard_node.py +6 -6
  125. infrahub/core/query/task.py +3 -3
  126. infrahub/core/query/task_log.py +1 -1
  127. infrahub/core/query/utils.py +5 -5
  128. infrahub/core/registry.py +0 -2
  129. infrahub/core/relationship/constraints/count.py +1 -1
  130. infrahub/core/relationship/constraints/peer_kind.py +1 -1
  131. infrahub/core/relationship/model.py +76 -38
  132. infrahub/core/schema/__init__.py +6 -4
  133. infrahub/core/schema/attribute_schema.py +8 -0
  134. infrahub/core/schema/basenode_schema.py +13 -3
  135. infrahub/core/schema/definitions/core/__init__.py +153 -0
  136. infrahub/core/schema/definitions/core/account.py +168 -0
  137. infrahub/core/schema/definitions/core/artifact.py +127 -0
  138. infrahub/core/schema/definitions/core/builtin.py +21 -0
  139. infrahub/core/schema/definitions/core/check.py +60 -0
  140. infrahub/core/schema/definitions/core/generator.py +96 -0
  141. infrahub/core/schema/definitions/core/graphql_query.py +77 -0
  142. infrahub/core/schema/definitions/core/group.py +105 -0
  143. infrahub/core/schema/definitions/core/ipam.py +252 -0
  144. infrahub/core/schema/definitions/core/lineage.py +17 -0
  145. infrahub/core/schema/definitions/core/menu.py +46 -0
  146. infrahub/core/schema/definitions/core/permission.py +161 -0
  147. infrahub/core/schema/definitions/core/profile.py +29 -0
  148. infrahub/core/schema/definitions/core/propose_change.py +88 -0
  149. infrahub/core/schema/definitions/core/propose_change_comment.py +188 -0
  150. infrahub/core/schema/definitions/core/propose_change_validator.py +326 -0
  151. infrahub/core/schema/definitions/core/repository.py +280 -0
  152. infrahub/core/schema/definitions/core/resource_pool.py +180 -0
  153. infrahub/core/schema/definitions/core/template.py +12 -0
  154. infrahub/core/schema/definitions/core/transform.py +87 -0
  155. infrahub/core/schema/definitions/core/webhook.py +108 -0
  156. infrahub/core/schema/definitions/internal.py +16 -0
  157. infrahub/core/schema/generated/genericnode_schema.py +5 -0
  158. infrahub/core/schema/generated/node_schema.py +5 -0
  159. infrahub/core/schema/generic_schema.py +5 -1
  160. infrahub/core/schema/manager.py +45 -42
  161. infrahub/core/schema/node_schema.py +4 -0
  162. infrahub/core/schema/profile_schema.py +4 -0
  163. infrahub/core/schema/relationship_schema.py +10 -2
  164. infrahub/core/schema/schema_branch.py +260 -16
  165. infrahub/core/schema/template_schema.py +36 -0
  166. infrahub/core/task/user_task.py +7 -5
  167. infrahub/core/timestamp.py +3 -3
  168. infrahub/core/utils.py +3 -2
  169. infrahub/core/validators/attribute/choices.py +1 -1
  170. infrahub/core/validators/attribute/enum.py +1 -1
  171. infrahub/core/validators/attribute/kind.py +1 -1
  172. infrahub/core/validators/attribute/length.py +1 -1
  173. infrahub/core/validators/attribute/optional.py +1 -1
  174. infrahub/core/validators/attribute/regex.py +1 -1
  175. infrahub/core/validators/attribute/unique.py +1 -1
  176. infrahub/core/validators/checks_runner.py +37 -0
  177. infrahub/core/validators/node/generate_profile.py +1 -1
  178. infrahub/core/validators/node/hierarchy.py +1 -1
  179. infrahub/core/validators/query.py +1 -1
  180. infrahub/core/validators/relationship/count.py +1 -1
  181. infrahub/core/validators/relationship/optional.py +1 -1
  182. infrahub/core/validators/relationship/peer.py +1 -1
  183. infrahub/core/validators/tasks.py +8 -6
  184. infrahub/core/validators/uniqueness/query.py +20 -17
  185. infrahub/database/__init__.py +16 -2
  186. infrahub/database/memgraph.py +1 -1
  187. infrahub/dependencies/builder/constraint/grouped/node_runner.py +0 -2
  188. infrahub/dependencies/builder/diff/combiner.py +1 -1
  189. infrahub/dependencies/builder/diff/conflicts_enricher.py +1 -1
  190. infrahub/dependencies/builder/diff/coordinator.py +0 -2
  191. infrahub/dependencies/builder/diff/deserializer.py +4 -2
  192. infrahub/dependencies/builder/diff/enricher/hierarchy.py +3 -1
  193. infrahub/dependencies/builder/diff/enricher/summary_counts.py +1 -1
  194. infrahub/dependencies/builder/diff/parent_node_adder.py +8 -0
  195. infrahub/events/artifact_action.py +76 -0
  196. infrahub/events/branch_action.py +50 -21
  197. infrahub/events/group_action.py +117 -0
  198. infrahub/events/models.py +164 -51
  199. infrahub/events/node_action.py +70 -8
  200. infrahub/events/repository_action.py +8 -8
  201. infrahub/events/schema_action.py +21 -8
  202. infrahub/exceptions.py +9 -0
  203. infrahub/generators/models.py +1 -0
  204. infrahub/generators/tasks.py +34 -15
  205. infrahub/git/base.py +3 -5
  206. infrahub/git/constants.py +0 -1
  207. infrahub/git/integrator.py +60 -36
  208. infrahub/git/models.py +80 -1
  209. infrahub/git/repository.py +7 -8
  210. infrahub/git/tasks.py +432 -112
  211. infrahub/git_credential/helper.py +2 -3
  212. infrahub/graphql/analyzer.py +572 -11
  213. infrahub/graphql/app.py +34 -26
  214. infrahub/graphql/auth/query_permission_checker/anonymous_checker.py +5 -5
  215. infrahub/graphql/auth/query_permission_checker/default_branch_checker.py +4 -4
  216. infrahub/graphql/auth/query_permission_checker/merge_operation_checker.py +4 -4
  217. infrahub/graphql/auth/query_permission_checker/object_permission_checker.py +28 -35
  218. infrahub/graphql/auth/query_permission_checker/super_admin_checker.py +5 -5
  219. infrahub/graphql/context.py +33 -0
  220. infrahub/graphql/enums.py +1 -1
  221. infrahub/graphql/initialization.py +5 -1
  222. infrahub/graphql/loaders/node.py +2 -2
  223. infrahub/graphql/manager.py +63 -63
  224. infrahub/graphql/mutations/account.py +20 -13
  225. infrahub/graphql/mutations/artifact_definition.py +16 -12
  226. infrahub/graphql/mutations/branch.py +86 -40
  227. infrahub/graphql/mutations/computed_attribute.py +24 -13
  228. infrahub/graphql/mutations/diff.py +54 -14
  229. infrahub/graphql/mutations/diff_conflict.py +14 -8
  230. infrahub/graphql/mutations/generator.py +83 -0
  231. infrahub/graphql/mutations/graphql_query.py +19 -11
  232. infrahub/graphql/mutations/ipam.py +25 -23
  233. infrahub/graphql/mutations/main.py +243 -50
  234. infrahub/graphql/mutations/menu.py +10 -10
  235. infrahub/graphql/mutations/proposed_change.py +36 -28
  236. infrahub/graphql/mutations/relationship.py +343 -104
  237. infrahub/graphql/mutations/repository.py +41 -35
  238. infrahub/graphql/mutations/resource_manager.py +26 -26
  239. infrahub/graphql/mutations/schema.py +66 -33
  240. infrahub/graphql/mutations/tasks.py +16 -10
  241. infrahub/graphql/parser.py +1 -1
  242. infrahub/graphql/permissions.py +3 -10
  243. infrahub/graphql/queries/account.py +22 -18
  244. infrahub/graphql/queries/branch.py +6 -4
  245. infrahub/graphql/queries/diff/tree.py +63 -52
  246. infrahub/graphql/queries/event.py +115 -0
  247. infrahub/graphql/queries/internal.py +3 -3
  248. infrahub/graphql/queries/ipam.py +23 -18
  249. infrahub/graphql/queries/relationship.py +11 -10
  250. infrahub/graphql/queries/resource_manager.py +43 -27
  251. infrahub/graphql/queries/search.py +9 -8
  252. infrahub/graphql/queries/status.py +12 -9
  253. infrahub/graphql/queries/task.py +11 -9
  254. infrahub/graphql/resolvers/resolver.py +69 -43
  255. infrahub/graphql/resolvers/single_relationship.py +16 -10
  256. infrahub/graphql/schema.py +4 -0
  257. infrahub/graphql/subscription/__init__.py +1 -1
  258. infrahub/graphql/subscription/events.py +1 -1
  259. infrahub/graphql/subscription/graphql_query.py +8 -8
  260. infrahub/graphql/types/branch.py +2 -2
  261. infrahub/graphql/types/common.py +6 -1
  262. infrahub/graphql/types/context.py +12 -0
  263. infrahub/graphql/types/enums.py +2 -0
  264. infrahub/graphql/types/event.py +158 -0
  265. infrahub/graphql/types/interface.py +2 -2
  266. infrahub/graphql/types/node.py +3 -3
  267. infrahub/graphql/types/permission.py +2 -2
  268. infrahub/graphql/types/relationship.py +3 -3
  269. infrahub/graphql/types/standard_node.py +9 -11
  270. infrahub/graphql/utils.py +28 -182
  271. infrahub/groups/tasks.py +2 -3
  272. infrahub/lock.py +21 -21
  273. infrahub/menu/generator.py +0 -1
  274. infrahub/menu/menu.py +116 -138
  275. infrahub/menu/models.py +4 -4
  276. infrahub/message_bus/__init__.py +11 -13
  277. infrahub/message_bus/messages/__init__.py +0 -14
  278. infrahub/message_bus/messages/check_generator_run.py +1 -3
  279. infrahub/message_bus/messages/event_branch_merge.py +3 -0
  280. infrahub/message_bus/messages/proposed_change/request_proposedchange_refreshartifacts.py +6 -0
  281. infrahub/message_bus/messages/request_proposedchange_pipeline.py +2 -0
  282. infrahub/message_bus/messages/send_echo_request.py +1 -1
  283. infrahub/message_bus/operations/__init__.py +4 -13
  284. infrahub/message_bus/operations/check/__init__.py +2 -2
  285. infrahub/message_bus/operations/check/generator.py +1 -3
  286. infrahub/message_bus/operations/event/branch.py +7 -3
  287. infrahub/message_bus/operations/event/schema.py +1 -1
  288. infrahub/message_bus/operations/event/worker.py +0 -3
  289. infrahub/message_bus/operations/finalize/validator.py +1 -1
  290. infrahub/message_bus/operations/git/file.py +2 -2
  291. infrahub/message_bus/operations/git/repository.py +1 -1
  292. infrahub/message_bus/operations/requests/__init__.py +0 -4
  293. infrahub/message_bus/operations/requests/generator_definition.py +2 -4
  294. infrahub/message_bus/operations/requests/proposed_change.py +37 -20
  295. infrahub/message_bus/operations/send/echo.py +1 -1
  296. infrahub/message_bus/types.py +1 -1
  297. infrahub/permissions/__init__.py +2 -1
  298. infrahub/permissions/globals.py +15 -0
  299. infrahub/permissions/types.py +26 -0
  300. infrahub/pools/prefix.py +29 -165
  301. infrahub/prefect_server/__init__.py +0 -0
  302. infrahub/prefect_server/app.py +18 -0
  303. infrahub/prefect_server/database.py +20 -0
  304. infrahub/prefect_server/events.py +28 -0
  305. infrahub/prefect_server/models.py +46 -0
  306. infrahub/proposed_change/models.py +18 -1
  307. infrahub/proposed_change/tasks.py +195 -53
  308. infrahub/pytest_plugin.py +4 -4
  309. infrahub/server.py +13 -12
  310. infrahub/services/__init__.py +148 -63
  311. infrahub/services/adapters/cache/__init__.py +11 -11
  312. infrahub/services/adapters/cache/nats.py +42 -25
  313. infrahub/services/adapters/cache/redis.py +3 -11
  314. infrahub/services/adapters/event/__init__.py +10 -18
  315. infrahub/services/adapters/http/__init__.py +0 -5
  316. infrahub/services/adapters/http/httpx.py +22 -15
  317. infrahub/services/adapters/message_bus/__init__.py +25 -8
  318. infrahub/services/adapters/message_bus/local.py +9 -7
  319. infrahub/services/adapters/message_bus/nats.py +14 -8
  320. infrahub/services/adapters/message_bus/rabbitmq.py +23 -10
  321. infrahub/services/adapters/workflow/__init__.py +11 -8
  322. infrahub/services/adapters/workflow/local.py +27 -6
  323. infrahub/services/adapters/workflow/worker.py +23 -7
  324. infrahub/services/component.py +43 -40
  325. infrahub/services/protocols.py +7 -7
  326. infrahub/services/scheduler.py +30 -29
  327. infrahub/storage.py +2 -4
  328. infrahub/task_manager/constants.py +1 -1
  329. infrahub/task_manager/event.py +261 -0
  330. infrahub/task_manager/models.py +147 -3
  331. infrahub/task_manager/task.py +1 -1
  332. infrahub/tasks/artifact.py +19 -18
  333. infrahub/tasks/registry.py +1 -1
  334. infrahub/tasks/telemetry.py +13 -14
  335. infrahub/transformations/tasks.py +3 -5
  336. infrahub/trigger/__init__.py +0 -0
  337. infrahub/trigger/catalogue.py +16 -0
  338. infrahub/trigger/constants.py +9 -0
  339. infrahub/trigger/models.py +105 -0
  340. infrahub/trigger/tasks.py +91 -0
  341. infrahub/types.py +1 -1
  342. infrahub/utils.py +1 -1
  343. infrahub/webhook/constants.py +0 -2
  344. infrahub/webhook/models.py +161 -40
  345. infrahub/webhook/tasks.py +123 -202
  346. infrahub/webhook/triggers.py +27 -0
  347. infrahub/workers/infrahub_async.py +36 -25
  348. infrahub/workers/utils.py +63 -0
  349. infrahub/workflows/catalogue.py +71 -52
  350. infrahub/workflows/initialization.py +14 -8
  351. infrahub/workflows/models.py +28 -4
  352. infrahub/workflows/utils.py +1 -1
  353. infrahub_sdk/client.py +8 -0
  354. infrahub_sdk/ctl/branch.py +3 -2
  355. infrahub_sdk/ctl/check.py +3 -3
  356. infrahub_sdk/ctl/cli_commands.py +16 -11
  357. infrahub_sdk/ctl/exceptions.py +0 -6
  358. infrahub_sdk/ctl/exporter.py +1 -1
  359. infrahub_sdk/ctl/generator.py +5 -5
  360. infrahub_sdk/ctl/importer.py +3 -2
  361. infrahub_sdk/ctl/menu.py +1 -1
  362. infrahub_sdk/ctl/object.py +1 -1
  363. infrahub_sdk/ctl/repository.py +23 -15
  364. infrahub_sdk/ctl/schema.py +2 -2
  365. infrahub_sdk/ctl/utils.py +4 -19
  366. infrahub_sdk/ctl/validate.py +2 -1
  367. infrahub_sdk/exceptions.py +12 -0
  368. infrahub_sdk/generator.py +3 -0
  369. infrahub_sdk/node.py +4 -4
  370. infrahub_sdk/protocols.py +21 -8
  371. infrahub_sdk/schema/__init__.py +14 -2
  372. infrahub_sdk/schema/main.py +7 -0
  373. infrahub_sdk/task/__init__.py +1 -0
  374. infrahub_sdk/task/constants.py +3 -0
  375. infrahub_sdk/task/exceptions.py +25 -0
  376. infrahub_sdk/task/manager.py +545 -0
  377. infrahub_sdk/task/models.py +74 -0
  378. infrahub_sdk/timestamp.py +134 -33
  379. infrahub_sdk/utils.py +39 -1
  380. infrahub_sdk/yaml.py +2 -3
  381. {infrahub_server-1.1.6.dist-info → infrahub_server-1.2.0b1.dist-info}/METADATA +47 -12
  382. infrahub_server-1.2.0b1.dist-info/RECORD +725 -0
  383. infrahub_testcontainers/container.py +14 -6
  384. infrahub_testcontainers/docker-compose.test.yml +24 -5
  385. infrahub_testcontainers/haproxy.cfg +43 -0
  386. infrahub_testcontainers/helpers.py +85 -1
  387. infrahub/core/branch/constants.py +0 -2
  388. infrahub/core/schema/definitions/core.py +0 -2274
  389. infrahub/graphql/query.py +0 -52
  390. infrahub/message_bus/messages/check_repository_checkdefinition.py +0 -20
  391. infrahub/message_bus/messages/check_repository_mergeconflicts.py +0 -16
  392. infrahub/message_bus/messages/check_repository_usercheck.py +0 -26
  393. infrahub/message_bus/messages/request_artifactdefinition_check.py +0 -17
  394. infrahub/message_bus/messages/request_repository_checks.py +0 -12
  395. infrahub/message_bus/messages/request_repository_userchecks.py +0 -18
  396. infrahub/message_bus/operations/check/repository.py +0 -293
  397. infrahub/message_bus/operations/requests/artifact_definition.py +0 -148
  398. infrahub/message_bus/operations/requests/repository.py +0 -133
  399. infrahub/schema/constants.py +0 -1
  400. infrahub/schema/tasks.py +0 -76
  401. infrahub/services/adapters/database/__init__.py +0 -9
  402. infrahub_sdk/ctl/_file.py +0 -13
  403. infrahub_server-1.1.6.dist-info/RECORD +0 -681
  404. /infrahub/{schema → artifacts}/__init__.py +0 -0
  405. {infrahub_server-1.1.6.dist-info → infrahub_server-1.2.0b1.dist-info}/LICENSE.txt +0 -0
  406. {infrahub_server-1.1.6.dist-info → infrahub_server-1.2.0b1.dist-info}/WHEEL +0 -0
  407. {infrahub_server-1.1.6.dist-info → infrahub_server-1.2.0b1.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,117 @@
1
+ from typing import Any
2
+
3
+ from pydantic import Field, computed_field
4
+
5
+ from infrahub.core.constants import MutationAction
6
+ from infrahub.message_bus import InfrahubMessage
7
+
8
+ from .constants import EVENT_NAMESPACE
9
+ from .models import EventNode, InfrahubEvent
10
+
11
+
12
+ class GroupMutatedEvent(InfrahubEvent):
13
+ """Event generated when a node has been mutated"""
14
+
15
+ kind: str = Field(..., description="The type of updated group")
16
+ node_id: str = Field(..., description="The ID of the updated group")
17
+ action: MutationAction = Field(..., description="The action taken on the node")
18
+ members: list[EventNode] = Field(default_factory=list, description="Updated members during this event.")
19
+ ancestors: list[EventNode] = Field(
20
+ default_factory=list, description="A list of groups that are ancestors of this group."
21
+ )
22
+
23
+ def get_related(self) -> list[dict[str, str]]:
24
+ related = super().get_related()
25
+ related.append(
26
+ {
27
+ "prefect.resource.id": self.node_id,
28
+ "prefect.resource.role": "infrahub.related.node",
29
+ "infrahub.node.kind": self.kind,
30
+ }
31
+ )
32
+ related.append(
33
+ {
34
+ "prefect.resource.id": self.node_id,
35
+ "prefect.resource.role": "infrahub.group.update",
36
+ "infrahub.node.kind": self.kind,
37
+ }
38
+ )
39
+
40
+ for member in self.members:
41
+ related.append(
42
+ {
43
+ "prefect.resource.id": member.id,
44
+ "prefect.resource.role": "infrahub.group.member",
45
+ "infrahub.node.kind": member.kind,
46
+ }
47
+ )
48
+ related.append(
49
+ {
50
+ "prefect.resource.id": member.id,
51
+ "prefect.resource.role": "infrahub.related.node",
52
+ "infrahub.node.kind": member.kind,
53
+ }
54
+ )
55
+
56
+ for ancestor in self.ancestors:
57
+ related.append(
58
+ {
59
+ "prefect.resource.id": ancestor.id,
60
+ "prefect.resource.role": "infrahub.group.ancestor",
61
+ "infrahub.node.kind": ancestor.kind,
62
+ }
63
+ )
64
+ related.append(
65
+ {
66
+ "prefect.resource.id": ancestor.id,
67
+ "prefect.resource.role": "infrahub.related.node",
68
+ "infrahub.node.kind": ancestor.kind,
69
+ }
70
+ )
71
+ related.append(
72
+ {
73
+ "prefect.resource.id": ancestor.id,
74
+ "prefect.resource.role": "infrahub.group.update",
75
+ "infrahub.node.kind": ancestor.kind,
76
+ }
77
+ )
78
+
79
+ return related
80
+
81
+ @computed_field
82
+ def event_name(self) -> str:
83
+ return f"{EVENT_NAMESPACE}.group.{self.action.value}"
84
+
85
+ def get_resource(self) -> dict[str, str]:
86
+ return {
87
+ "prefect.resource.id": f"infrahub.node.{self.node_id}",
88
+ "infrahub.node.kind": self.kind,
89
+ "infrahub.node.id": self.node_id,
90
+ "infrahub.node.action": self.action.value,
91
+ "infrahub.node.root_id": self.node_id,
92
+ }
93
+
94
+ def get_payload(self) -> dict[str, Any]:
95
+ return {
96
+ "ancestors": [ancestor.model_dump() for ancestor in self.ancestors],
97
+ "members": [member.model_dump() for member in self.members],
98
+ }
99
+
100
+ def get_messages(self) -> list[InfrahubMessage]:
101
+ return []
102
+
103
+
104
+ class GroupMemberAddedEvent(GroupMutatedEvent):
105
+ action: MutationAction = MutationAction.CREATED
106
+
107
+ @computed_field
108
+ def event_name(self) -> str:
109
+ return f"{EVENT_NAMESPACE}.group.member_added"
110
+
111
+
112
+ class GroupMemberRemovedEvent(GroupMutatedEvent):
113
+ action: MutationAction = MutationAction.DELETED
114
+
115
+ @computed_field
116
+ def event_name(self) -> str:
117
+ return f"{EVENT_NAMESPACE}.group.member_removed"
infrahub/events/models.py CHANGED
@@ -1,93 +1,206 @@
1
- from typing import Any
1
+ from __future__ import annotations
2
2
 
3
- from pydantic import BaseModel, Field
3
+ from copy import deepcopy
4
+ from typing import Any, Self, cast, final
5
+ from uuid import UUID, uuid4
4
6
 
7
+ from pydantic import BaseModel, Field, PrivateAttr, computed_field, model_validator
8
+
9
+ from infrahub import __version__
10
+ from infrahub.auth import AccountSession, AuthType
11
+ from infrahub.context import InfrahubContext # noqa: TC001
12
+ from infrahub.core.branch import Branch # noqa: TC001
5
13
  from infrahub.message_bus import InfrahubMessage, Meta
14
+ from infrahub.worker import WORKER_IDENTITY
6
15
 
7
16
  from .constants import EVENT_NAMESPACE
8
17
 
9
18
 
19
+ class EventNode(BaseModel):
20
+ id: str
21
+ kind: str
22
+
23
+
24
+ class ParentEvent(BaseModel):
25
+ id: str
26
+ name: str
27
+
28
+
10
29
  class EventMeta(BaseModel):
30
+ branch: Branch | None = Field(default=None, description="The branch on which originate this event")
11
31
  request_id: str = ""
12
- account_id: str = ""
13
- initiator_id: str | None = Field(
14
- default=None, description="The worker identity of the initial sender of this message"
32
+ account_id: str | None = Field(default=None, description="The ID of the account triggering this event")
33
+ initiator_id: str = Field(
34
+ default=WORKER_IDENTITY, description="The worker identity of the initial sender of this message"
35
+ )
36
+ context: InfrahubContext = Field(..., description="The context used when originating this event")
37
+ level: int = Field(default=0)
38
+ has_children: bool = Field(
39
+ default=False, description="Indicates if this event might potentially have child events under it."
15
40
  )
16
41
 
42
+ id: UUID = Field(
43
+ default_factory=uuid4,
44
+ description="UUID of the event",
45
+ )
17
46
 
18
- class InfrahubEvent(BaseModel):
19
- meta: EventMeta | None = None
47
+ parent: UUID | None = Field(default=None, description="The UUID of the parent event if applicable")
48
+ ancestors: list[ParentEvent] = Field(default_factory=list, description="Any event used to trigger this event")
49
+ _created_with_context: bool = PrivateAttr(default=False)
20
50
 
21
- def get_event_namespace(self) -> str:
22
- return EVENT_NAMESPACE
51
+ def get_branch_id(self) -> str:
52
+ if self.context.branch.id:
53
+ return self.context.branch.id
23
54
 
24
- def get_name(self) -> str:
25
- return f"{self.get_event_namespace()}.unknown"
55
+ if self.branch:
56
+ return str(self.branch.get_uuid())
26
57
 
27
- def get_resource(self) -> dict[str, str]:
28
- raise NotImplementedError
58
+ return ""
29
59
 
30
- def get_messages(self) -> list[InfrahubMessage]:
31
- raise NotImplementedError
60
+ def get_id(self) -> str:
61
+ return str(self.id)
32
62
 
33
63
  def get_related(self) -> list[dict[str, str]]:
34
- related: list[dict[str, str]] = []
35
-
36
- if not self.meta:
37
- return related
38
-
39
- if self.meta.account_id:
40
- related.append(
41
- {
42
- "prefect.resource.id": f"infrahub.account.{self.meta.account_id}",
43
- "prefect.resource.role": "account",
44
- }
45
- )
46
-
47
- if self.meta.request_id:
64
+ related: list[dict[str, str]] = [
65
+ {"prefect.resource.id": __version__, "prefect.resource.role": "infrahub.version"},
66
+ {
67
+ "prefect.resource.id": self.get_id(),
68
+ "prefect.resource.role": "infrahub.event",
69
+ "infrahub.event.has_children": str(self.has_children).lower(),
70
+ "infrahub.event.level": str(self.level),
71
+ },
72
+ {
73
+ "prefect.resource.id": f"infrahub.account.{self.context.account.account_id}",
74
+ "prefect.resource.role": "infrahub.account",
75
+ "infrahub.resource.id": self.context.account.account_id,
76
+ },
77
+ {
78
+ "prefect.resource.id": f"infrahub.branch.{self.get_branch_id()}",
79
+ "prefect.resource.role": "infrahub.branch",
80
+ "infrahub.resource.id": self.get_branch_id(),
81
+ "infrahub.resource.label": self.context.branch.name,
82
+ },
83
+ ]
84
+
85
+ if self.parent:
48
86
  related.append(
49
87
  {
50
- "prefect.resource.id": f"infrahub.request.{self.meta.request_id}",
51
- "prefect.resource.role": "request",
88
+ "prefect.resource.id": self.get_id(),
89
+ "prefect.resource.role": "infrahub.child_event",
90
+ "infrahub.event_parent.id": str(self.parent),
52
91
  }
53
92
  )
54
93
 
55
- if self.meta.initiator_id:
94
+ for ancestor in self.ancestors:
56
95
  related.append(
57
96
  {
58
- "prefect.resource.id": f"infrahub.source.{self.meta.initiator_id}",
59
- "prefect.resource.role": "event_source",
97
+ "prefect.resource.id": ancestor.id,
98
+ "prefect.resource.role": "infrahub.ancestor_event",
99
+ "infrahub.ancestor_event.name": ancestor.name,
60
100
  }
61
101
  )
62
102
 
63
103
  return related
64
104
 
105
+ @classmethod
106
+ def with_dummy_context(cls, branch: Branch) -> EventMeta:
107
+ return cls(
108
+ branch=branch,
109
+ context=InfrahubContext.init(
110
+ branch=branch, account=AccountSession(auth_type=AuthType.NONE, authenticated=False, account_id="")
111
+ ),
112
+ )
113
+
114
+ @classmethod
115
+ def from_parent(cls, parent: InfrahubEvent, branch: Branch | None = None) -> EventMeta:
116
+ """Create the metadata from an existing event
117
+
118
+ Note that this action will modify the existing event to indicate that children might be attached to the event
119
+ """
120
+ parent.meta.has_children = True
121
+ context = deepcopy(parent.meta.context)
122
+ if branch:
123
+ context.branch.name = branch.name
124
+ context.branch.id = str(branch.get_uuid())
125
+
126
+ return cls(
127
+ parent=parent.meta.id,
128
+ branch=parent.meta.branch,
129
+ request_id=parent.meta.request_id,
130
+ initiator_id=parent.meta.initiator_id,
131
+ account_id=parent.meta.account_id,
132
+ level=parent.meta.level + 1,
133
+ context=context,
134
+ ancestors=[ParentEvent(id=parent.get_id(), name=parent.get_name())] + parent.meta.ancestors,
135
+ )
136
+
137
+ @classmethod
138
+ def from_context(cls, context: InfrahubContext, branch: Branch | None = None) -> EventMeta:
139
+ # Create a copy of the context so local changes aren't brought back to a parent object
140
+ meta = cls(context=deepcopy(context))
141
+ meta._created_with_context = True
142
+ if branch:
143
+ meta.context.branch.name = branch.name
144
+ meta.context.branch.id = str(branch.get_uuid())
145
+ return meta
146
+
147
+
148
+ class InfrahubEvent(BaseModel):
149
+ meta: EventMeta = Field(..., description="Metadata for the event")
150
+
151
+ def get_id(self) -> str:
152
+ return self.meta.get_id()
153
+
154
+ def get_event_namespace(self) -> str:
155
+ return EVENT_NAMESPACE
156
+
157
+ def get_name(self) -> str:
158
+ # Convince linters that @computed_field is a property and not a method...
159
+ return cast(str, self.event_name)
160
+
161
+ def get_resource(self) -> dict[str, str]:
162
+ raise NotImplementedError
163
+
164
+ def get_messages(self) -> list[InfrahubMessage]:
165
+ raise NotImplementedError
166
+
167
+ def get_related(self) -> list[dict[str, str]]:
168
+ if not self.meta:
169
+ return []
170
+ return self.meta.get_related()
171
+
65
172
  def get_payload(self) -> dict[str, Any]:
173
+ """The purpose if this method is to allow subclasses to define their own payload.
174
+
175
+ It should not be used to get the complete payload instead .get_event_payload() should
176
+ be used for that as it will always contain the 'context' key regardless of changes
177
+ in child classes
178
+ """
66
179
  return {}
67
180
 
181
+ @final
182
+ def get_event_payload(self) -> dict[str, Any]:
183
+ """This method should be used when emitting the event to the event broker"""
184
+ event_payload = self.get_payload()
185
+ event_payload["context"] = self.meta.context.model_dump(mode="json")
186
+ return event_payload
187
+
68
188
  def get_message_meta(self) -> Meta:
69
189
  meta = Meta()
70
- if not self.meta:
71
- return meta
72
190
 
73
- if self.meta.initiator_id:
74
- meta.initiator_id = self.meta.initiator_id
191
+ meta.initiator_id = self.meta.initiator_id
75
192
  if self.meta.request_id:
76
193
  meta.initiator_id = self.meta.request_id
77
194
 
78
195
  return meta
79
196
 
197
+ @computed_field
198
+ def event_name(self) -> str:
199
+ raise NotImplementedError("The event name has not been defined")
80
200
 
81
- class InfrahubBranchEvent(InfrahubEvent): # pylint: disable=abstract-method
82
- branch: str = Field(..., description="The branch on which the event happend")
83
-
84
- def get_related(self) -> list[dict[str, str]]:
85
- related = super().get_related()
86
- related.append(
87
- {
88
- "prefect.resource.id": "infrahub.branch",
89
- "prefect.resource.name": self.branch,
90
- "prefect.resource.role": "branch",
91
- }
92
- )
93
- return related
201
+ @model_validator(mode="after")
202
+ def update_context(self) -> Self:
203
+ """Update the context object using this event provided that the meta data was created with a context."""
204
+ if self.meta._created_with_context:
205
+ self.meta.context.set_event(self.get_name(), id=self.get_id())
206
+ return self
@@ -1,24 +1,73 @@
1
1
  from typing import Any
2
2
 
3
- from pydantic import Field
3
+ from pydantic import Field, computed_field
4
4
 
5
+ from infrahub.core.changelog.models import NodeChangelog
5
6
  from infrahub.core.constants import MutationAction
6
7
  from infrahub.message_bus import InfrahubMessage
7
8
 
8
- from .models import InfrahubBranchEvent
9
+ from .constants import EVENT_NAMESPACE
10
+ from .models import InfrahubEvent
9
11
 
10
12
 
11
- class NodeMutatedEvent(InfrahubBranchEvent):
13
+ class NodeMutatedEvent(InfrahubEvent):
12
14
  """Event generated when a node has been mutated"""
13
15
 
14
16
  kind: str = Field(..., description="The type of object modified")
15
17
  node_id: str = Field(..., description="The ID of the mutated node")
16
18
  action: MutationAction = Field(..., description="The action taken on the node")
17
- data: dict[str, Any] = Field(..., description="Data on modified object")
19
+ data: NodeChangelog = Field(..., description="Data on modified object")
18
20
  fields: list[str] = Field(default_factory=list, description="Fields provided in the mutation")
19
21
 
20
- def get_name(self) -> str:
21
- return f"{self.get_event_namespace()}.node.{self.action.value}"
22
+ def get_related(self) -> list[dict[str, str]]:
23
+ related = super().get_related()
24
+ for attribute in self.data.attributes.values():
25
+ related.append(
26
+ {
27
+ "prefect.resource.id": f"infrahub.node.{self.node_id}",
28
+ "prefect.resource.role": "infrahub.node.field_update",
29
+ "infrahub.attribute.name": attribute.name,
30
+ "infrahub.attribute.value": "NULL" if attribute.value is None else str(attribute.value),
31
+ "infrahub.attribute.kind": attribute.kind,
32
+ "infrahub.attribute.value_previous": "NULL"
33
+ if attribute.value_previous is None
34
+ else str(attribute.value_previous),
35
+ # Mypy doesn't understand that .value_update_status is a @computed_attribute
36
+ "infrahub.attribute.action": attribute.value_update_status.value, # type: ignore[attr-defined]
37
+ }
38
+ )
39
+ if self.data.parent:
40
+ related.append(
41
+ {
42
+ "prefect.resource.id": self.data.parent.node_id,
43
+ "prefect.resource.role": "infrahub.node.parent",
44
+ "infrahub.parent.kind": self.data.parent.node_kind,
45
+ "infrahub.parent.id": self.data.parent.node_id,
46
+ }
47
+ )
48
+
49
+ related.append(
50
+ {
51
+ "prefect.resource.id": self.node_id,
52
+ "prefect.resource.role": "infrahub.related.node",
53
+ "infrahub.node.kind": self.kind,
54
+ }
55
+ )
56
+
57
+ for related_node in self.data.get_related_nodes():
58
+ related.append(
59
+ {
60
+ "prefect.resource.id": related_node.node_id,
61
+ "prefect.resource.role": "infrahub.related.node",
62
+ "infrahub.node.kind": related_node.node_kind,
63
+ }
64
+ )
65
+
66
+ return related
67
+
68
+ @computed_field
69
+ def event_name(self) -> str:
70
+ return f"{EVENT_NAMESPACE}.node.{self.action.value}"
22
71
 
23
72
  def get_resource(self) -> dict[str, str]:
24
73
  return {
@@ -26,11 +75,12 @@ class NodeMutatedEvent(InfrahubBranchEvent):
26
75
  "infrahub.node.kind": self.kind,
27
76
  "infrahub.node.id": self.node_id,
28
77
  "infrahub.node.action": self.action.value,
29
- "infrahub.branch.name": self.branch,
78
+ "infrahub.node.root_id": self.data.root_node_id,
79
+ "infrahub.branch.name": self.meta.context.branch.name,
30
80
  }
31
81
 
32
82
  def get_payload(self) -> dict[str, Any]:
33
- return {"data": self.data, "fields": self.fields}
83
+ return {"data": self.data.model_dump(), "fields": self.fields}
34
84
 
35
85
  def get_messages(self) -> list[InfrahubMessage]:
36
86
  return [
@@ -43,3 +93,15 @@ class NodeMutatedEvent(InfrahubBranchEvent):
43
93
  # meta=self.get_message_meta(),
44
94
  # )
45
95
  ]
96
+
97
+
98
+ class NodeCreatedEvent(NodeMutatedEvent):
99
+ action: MutationAction = MutationAction.CREATED
100
+
101
+
102
+ class NodeUpdatedEvent(NodeMutatedEvent):
103
+ action: MutationAction = MutationAction.UPDATED
104
+
105
+
106
+ class NodeDeletedEvent(NodeMutatedEvent):
107
+ action: MutationAction = MutationAction.DELETED
@@ -1,33 +1,29 @@
1
1
  from typing import Any
2
2
 
3
- from pydantic import Field
3
+ from pydantic import Field, computed_field
4
4
 
5
5
  from infrahub.message_bus import InfrahubMessage
6
6
 
7
- from .models import InfrahubBranchEvent
7
+ from .constants import EVENT_NAMESPACE
8
+ from .models import InfrahubEvent
8
9
 
9
10
 
10
- class CommitUpdatedEvent(InfrahubBranchEvent):
11
+ class CommitUpdatedEvent(InfrahubEvent):
11
12
  """Event generated when the the commit within a repository has been updated."""
12
13
 
13
14
  commit: str = Field(..., description="The commit the repository was updated to")
14
15
  repository_id: str = Field(..., description="The ID of the repository")
15
16
  repository_name: str = Field(..., description="The name of the repository")
16
17
 
17
- def get_name(self) -> str:
18
- return f"{self.get_event_namespace()}.repository.update_commit"
19
-
20
18
  def get_resource(self) -> dict[str, str]:
21
19
  return {
22
20
  "prefect.resource.id": f"infrahub.repository.{self.repository_id}",
23
- "infrahub.branch.name": self.branch,
24
21
  "infrahub.repository.name": self.repository_name,
25
22
  "infrahub.repository.id": self.repository_id,
26
23
  }
27
24
 
28
25
  def get_payload(self) -> dict[str, Any]:
29
26
  return {
30
- "branch": self.branch,
31
27
  "commit": self.commit,
32
28
  "repository_id": self.repository_id,
33
29
  "repository_name": self.repository_name,
@@ -35,3 +31,7 @@ class CommitUpdatedEvent(InfrahubBranchEvent):
35
31
 
36
32
  def get_messages(self) -> list[InfrahubMessage]:
37
33
  return []
34
+
35
+ @computed_field
36
+ def event_name(self) -> str:
37
+ return f"{EVENT_NAMESPACE}.repository.update_commit"
@@ -1,30 +1,39 @@
1
1
  from typing import Any
2
2
 
3
- from pydantic import Field
3
+ from pydantic import Field, computed_field
4
4
 
5
5
  from infrahub.message_bus import InfrahubMessage
6
6
  from infrahub.message_bus.messages.refresh_registry_branches import RefreshRegistryBranches
7
7
 
8
- from .models import InfrahubBranchEvent
8
+ from .constants import EVENT_NAMESPACE
9
+ from .models import InfrahubEvent
9
10
 
10
11
 
11
- class SchemaUpdatedEvent(InfrahubBranchEvent):
12
+ class SchemaUpdatedEvent(InfrahubEvent):
12
13
  """Event generated when the schema within a branch has been updated."""
13
14
 
15
+ branch_name: str = Field(..., description="The name of the branch")
14
16
  schema_hash: str = Field(..., description="Schema hash after the update")
15
17
 
16
- def get_name(self) -> str:
17
- return f"{self.get_event_namespace()}.schema.update"
18
+ # NOTE
19
+ # We could add to the payload
20
+ # - Hash before and after the change
21
+ # - List of nodes and generics that have been modified
22
+ # - Diff of the change
23
+
24
+ # NOTE 2
25
+ # Should schema_update be a branch event ?
26
+ # if feels like the main resource should be the branch
18
27
 
19
28
  def get_resource(self) -> dict[str, str]:
20
29
  return {
21
- "prefect.resource.id": f"infrahub.schema_branch.{self.branch}",
22
- "infrahub.branch.name": self.branch,
30
+ "prefect.resource.id": f"infrahub.schema_branch.{self.branch_name}",
31
+ "infrahub.branch.name": self.branch_name,
23
32
  "infrahub.branch.schema_hash": self.schema_hash,
24
33
  }
25
34
 
26
35
  def get_payload(self) -> dict[str, Any]:
27
- return {"branch": self.branch, "schema_hash": self.schema_hash}
36
+ return {"branch": self.branch_name, "schema_hash": self.schema_hash}
28
37
 
29
38
  def get_messages(self) -> list[InfrahubMessage]:
30
39
  return [
@@ -34,3 +43,7 @@ class SchemaUpdatedEvent(InfrahubBranchEvent):
34
43
  # meta=self.get_message_meta(),
35
44
  # )
36
45
  ]
46
+
47
+ @computed_field
48
+ def event_name(self) -> str:
49
+ return f"{EVENT_NAMESPACE}.schema.update"
infrahub/exceptions.py CHANGED
@@ -49,6 +49,15 @@ class DatabaseError(Error):
49
49
  super().__init__(self.message)
50
50
 
51
51
 
52
+ class ServiceUnavailableError(Error):
53
+ HTTP_CODE: int = 503
54
+ DESCRIPTION = "Service unavailable"
55
+
56
+ def __init__(self, message: str) -> None:
57
+ self.message = message
58
+ super().__init__(self.message)
59
+
60
+
52
61
  class LockError(Error):
53
62
  pass
54
63
 
@@ -30,6 +30,7 @@ class RequestGeneratorDefinitionRun(BaseModel):
30
30
 
31
31
  generator_definition: ProposedChangeGeneratorDefinition = Field(..., description="The Generator Definition")
32
32
  branch: str = Field(..., description="The branch to target")
33
+ target_members: list[str] = Field(default_factory=list, description="List of targets to run the generator for")
33
34
 
34
35
 
35
36
  class ProposedChangeGeneratorDefinition(BaseModel):