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
@@ -1,6 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  from pathlib import Path
4
+ from typing import Optional
4
5
 
5
6
  import typer
6
7
  import yaml
@@ -8,15 +9,14 @@ from pydantic import ValidationError
8
9
  from rich.console import Console
9
10
  from rich.table import Table
10
11
 
11
- from infrahub_sdk.ctl.client import initialize_client
12
-
13
12
  from ..async_typer import AsyncTyper
14
- from ..ctl.exceptions import FileNotValidError
15
- from ..ctl.utils import init_logging
13
+ from ..exceptions import FileNotValidError
16
14
  from ..graphql import Mutation, Query
17
15
  from ..schema.repository import InfrahubRepositoryConfig
18
- from ._file import read_file
16
+ from ..utils import read_file
17
+ from .client import initialize_client
19
18
  from .parameters import CONFIG_PARAM
19
+ from .utils import init_logging
20
20
 
21
21
  app = AsyncTyper()
22
22
  console = Console()
@@ -69,12 +69,11 @@ async def add(
69
69
  name: str,
70
70
  location: str,
71
71
  description: str = "",
72
- username: str | None = None,
72
+ username: Optional[str] = None,
73
73
  password: str = "",
74
- commit: str = "",
74
+ ref: str = "",
75
75
  read_only: bool = False,
76
76
  debug: bool = False,
77
- branch: str = typer.Option("main", help="Branch on which to add the repository."),
78
77
  _: str = CONFIG_PARAM,
79
78
  ) -> None:
80
79
  """Add a new repository."""
@@ -86,15 +85,24 @@ async def add(
86
85
  "name": {"value": name},
87
86
  "location": {"value": location},
88
87
  "description": {"value": description},
89
- "commit": {"value": commit},
90
88
  },
91
89
  }
90
+ if read_only:
91
+ input_data["data"]["ref"] = {"value": ref}
92
+ else:
93
+ input_data["data"]["default_branch"] = {"value": ref}
92
94
 
93
95
  client = initialize_client()
94
96
 
95
- credential = await client.create(kind="CorePasswordCredential", name=name, username=username, password=password)
96
- await credential.save(allow_upsert=True)
97
- input_data["data"]["credential"] = {"id": credential.id}
97
+ if username or password:
98
+ credential = await client.create(
99
+ kind="CorePasswordCredential",
100
+ name=name,
101
+ username=username,
102
+ password=password,
103
+ )
104
+ await credential.save(allow_upsert=True)
105
+ input_data["data"]["credential"] = {"id": credential.id}
98
106
 
99
107
  query = Mutation(
100
108
  mutation="CoreReadOnlyRepositoryCreate" if read_only else "CoreRepositoryCreate",
@@ -102,18 +110,18 @@ async def add(
102
110
  query={"ok": None},
103
111
  )
104
112
 
105
- await client.execute_graphql(query=query.render(), branch_name=branch, tracker="mutation-repository-create")
113
+ await client.execute_graphql(query=query.render(), tracker="mutation-repository-create")
106
114
 
107
115
 
108
116
  @app.command()
109
117
  async def list(
110
- branch: str | None = None,
118
+ branch: Optional[str] = typer.Option(None, help="Branch on which to list repositories."),
111
119
  debug: bool = False,
112
120
  _: str = CONFIG_PARAM,
113
121
  ) -> None:
114
122
  init_logging(debug=debug)
115
123
 
116
- client = initialize_client(branch=branch)
124
+ client = initialize_client()
117
125
 
118
126
  repo_status_query = {
119
127
  "CoreGenericRepository": {
@@ -108,7 +108,7 @@ def get_node(schemas_data: list[dict], schema_index: int, node_index: int) -> di
108
108
  async def load(
109
109
  schemas: list[Path],
110
110
  debug: bool = False,
111
- branch: str = typer.Option("main", help="Branch on which to load the schema."),
111
+ branch: str = typer.Option(None, help="Branch on which to load the schema."),
112
112
  wait: int = typer.Option(0, help="Time in seconds to wait until the schema has converged across all workers"),
113
113
  _: str = CONFIG_PARAM,
114
114
  ) -> None:
@@ -159,7 +159,7 @@ async def load(
159
159
  async def check(
160
160
  schemas: list[Path],
161
161
  debug: bool = False,
162
- branch: str = typer.Option("main", help="Branch on which to check the schema."),
162
+ branch: str = typer.Option(None, help="Branch on which to check the schema."),
163
163
  _: str = CONFIG_PARAM,
164
164
  ) -> None:
165
165
  """Check if schema files are valid and what would be the impact of loading them with Infrahub."""
infrahub_sdk/ctl/utils.py CHANGED
@@ -6,21 +6,19 @@ import traceback
6
6
  from collections.abc import Coroutine
7
7
  from functools import wraps
8
8
  from pathlib import Path
9
- from typing import TYPE_CHECKING, Any, Callable, NoReturn, TypeVar
9
+ from typing import TYPE_CHECKING, Any, Callable, NoReturn, Optional, TypeVar
10
10
 
11
- import pendulum
12
11
  import typer
13
12
  from click.exceptions import Exit
14
13
  from httpx import HTTPError
15
- from pendulum.datetime import DateTime
16
14
  from rich.console import Console
17
15
  from rich.logging import RichHandler
18
16
  from rich.markup import escape
19
17
 
20
- from ..ctl.exceptions import FileNotValidError, QueryNotFoundError
21
18
  from ..exceptions import (
22
19
  AuthenticationError,
23
20
  Error,
21
+ FileNotValidError,
24
22
  GraphQLError,
25
23
  NodeNotFoundError,
26
24
  ResourceNotDefinedError,
@@ -30,6 +28,7 @@ from ..exceptions import (
30
28
  )
31
29
  from ..yaml import YamlFile
32
30
  from .client import initialize_client_sync
31
+ from .exceptions import QueryNotFoundError
33
32
 
34
33
  if TYPE_CHECKING:
35
34
  from ..schema.repository import InfrahubRepositoryConfig
@@ -88,7 +87,7 @@ def catch_exception(
88
87
  async def async_wrapper(*args: Any, **kwargs: Any) -> T:
89
88
  try:
90
89
  return await func(*args, **kwargs)
91
- except (Error, Exception) as exc: # pylint: disable=broad-exception-caught
90
+ except (Error, Exception) as exc:
92
91
  return handle_exception(exc=exc, console=console, exit_code=exit_code)
93
92
 
94
93
  return async_wrapper
@@ -97,7 +96,7 @@ def catch_exception(
97
96
  def wrapper(*args: Any, **kwargs: Any) -> T:
98
97
  try:
99
98
  return func(*args, **kwargs)
100
- except (Error, Exception) as exc: # pylint: disable=broad-exception-caught
99
+ except (Error, Exception) as exc:
101
100
  return handle_exception(exc=exc, console=console, exit_code=exit_code)
102
101
 
103
102
  return wrapper
@@ -144,27 +143,13 @@ def print_graphql_errors(console: Console, errors: list) -> None:
144
143
  console.print(f"[red]{escape(str(error))}")
145
144
 
146
145
 
147
- def parse_cli_vars(variables: list[str] | None) -> dict[str, str]:
146
+ def parse_cli_vars(variables: Optional[list[str]]) -> dict[str, str]:
148
147
  if not variables:
149
148
  return {}
150
149
 
151
150
  return {var.split("=")[0]: var.split("=")[1] for var in variables if "=" in var}
152
151
 
153
152
 
154
- def calculate_time_diff(value: str) -> str | None:
155
- """Calculate the time in human format between a timedate in string format and now."""
156
- try:
157
- time_value = pendulum.parse(value)
158
- except pendulum.parsing.exceptions.ParserError:
159
- return None
160
-
161
- if not isinstance(time_value, DateTime):
162
- return None
163
-
164
- pendulum.set_locale("en")
165
- return time_value.diff_for_humans(other=pendulum.now(), absolute=True)
166
-
167
-
168
153
  def find_graphql_query(name: str, directory: str | Path = ".") -> str:
169
154
  if isinstance(directory, str):
170
155
  directory = Path(directory)
@@ -2,6 +2,7 @@ from __future__ import annotations
2
2
 
3
3
  import sys
4
4
  from pathlib import Path
5
+ from typing import Optional
5
6
 
6
7
  import typer
7
8
  import ujson
@@ -57,7 +58,7 @@ async def validate_schema(schema: Path, _: str = CONFIG_PARAM) -> None:
57
58
  @catch_exception(console=console)
58
59
  def validate_graphql(
59
60
  query: str,
60
- variables: list[str] | None = typer.Argument(
61
+ variables: Optional[list[str]] = typer.Argument(
61
62
  None, help="Variables to pass along with the query. Format key=value key=value."
62
63
  ),
63
64
  debug: bool = typer.Option(False, help="Display more troubleshooting information."),
infrahub_sdk/data.py CHANGED
@@ -20,7 +20,7 @@ class RepositoryData(BaseModel):
20
20
  branch_info: dict[str, RepositoryBranchInfo] = Field(default_factory=dict)
21
21
 
22
22
  def get_staging_branch(self) -> str | None:
23
- for branch, info in self.branch_info.items(): # pylint: disable=no-member
23
+ for branch, info in self.branch_info.items():
24
24
  if info.internal_status == "staging":
25
25
  return branch
26
26
  return None
@@ -131,3 +131,15 @@ class UninitializedError(Error):
131
131
 
132
132
  class InvalidResponseError(Error):
133
133
  """Raised when an object requires an initialization step before use"""
134
+
135
+
136
+ class FileNotValidError(Error):
137
+ def __init__(self, name: str, message: str = ""):
138
+ self.message = message or f"Cannot parse '{name}' content."
139
+ super().__init__(self.message)
140
+
141
+
142
+ class TimestampFormatError(Error):
143
+ def __init__(self, message: str | None = None):
144
+ self.message = message or "Invalid timestamp format"
145
+ super().__init__(self.message)
infrahub_sdk/generator.py CHANGED
@@ -1,5 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
+ import logging
3
4
  import os
4
5
  from abc import abstractmethod
5
6
  from typing import TYPE_CHECKING
@@ -27,6 +28,7 @@ class InfrahubGenerator:
27
28
  generator_instance: str = "",
28
29
  params: dict | None = None,
29
30
  convert_query_response: bool = False,
31
+ logger: logging.Logger | None = None,
30
32
  ) -> None:
31
33
  self.query = query
32
34
  self.branch = branch
@@ -41,6 +43,7 @@ class InfrahubGenerator:
41
43
  self._related_nodes: list[InfrahubNode] = []
42
44
  self.infrahub_node = infrahub_node
43
45
  self.convert_query_response = convert_query_response
46
+ self.logger = logger if logger else logging.getLogger("infrahub.tasks")
44
47
 
45
48
  @property
46
49
  def store(self) -> NodeStore:
infrahub_sdk/node.py CHANGED
@@ -25,7 +25,6 @@ if TYPE_CHECKING:
25
25
  from .schema import AttributeSchemaAPI, MainSchemaTypesAPI, RelationshipSchemaAPI
26
26
  from .types import Order
27
27
 
28
- # pylint: disable=too-many-lines
29
28
 
30
29
  PROPERTIES_FLAG = ["is_visible", "is_protected"]
31
30
  PROPERTIES_OBJECT = ["source", "owner"]
@@ -801,7 +800,7 @@ class InfrahubNodeBase:
801
800
  Returns:
802
801
  dict[str, Dict]: Representation of an input data in dict format
803
802
  """
804
- # pylint: disable=too-many-branches
803
+
805
804
  data = {}
806
805
  variables = {}
807
806
 
@@ -1119,14 +1118,14 @@ class InfrahubNode(InfrahubNodeBase):
1119
1118
  async def artifact_generate(self, name: str) -> None:
1120
1119
  self._validate_artifact_support(ARTIFACT_GENERATE_FEATURE_NOT_SUPPORTED_MESSAGE)
1121
1120
 
1122
- artifact = await self._client.get(kind="CoreArtifact", definition__name__value=name, object__ids=[self.id])
1121
+ artifact = await self._client.get(kind="CoreArtifact", name__value=name, object__ids=[self.id])
1123
1122
  await artifact.definition.fetch() # type: ignore[attr-defined]
1124
1123
  await artifact.definition.peer.generate([artifact.id]) # type: ignore[attr-defined]
1125
1124
 
1126
1125
  async def artifact_fetch(self, name: str) -> str | dict[str, Any]:
1127
1126
  self._validate_artifact_support(ARTIFACT_GENERATE_FEATURE_NOT_SUPPORTED_MESSAGE)
1128
1127
 
1129
- artifact = await self._client.get(kind="CoreArtifact", definition__name__value=name, object__ids=[self.id])
1128
+ artifact = await self._client.get(kind="CoreArtifact", name__value=name, object__ids=[self.id])
1130
1129
  content = await self._client.object_store.get(identifier=artifact.storage_id.value) # type: ignore[attr-defined]
1131
1130
  return content
1132
1131
 
@@ -1251,7 +1250,6 @@ class InfrahubNode(InfrahubNodeBase):
1251
1250
  Returns:
1252
1251
  dict[str, Union[Any, Dict]]: GraphQL query in dictionary format
1253
1252
  """
1254
- # pylint: disable=too-many-branches
1255
1253
 
1256
1254
  data: dict[str, Any] = {}
1257
1255
 
@@ -1637,13 +1635,13 @@ class InfrahubNodeSync(InfrahubNodeBase):
1637
1635
 
1638
1636
  def artifact_generate(self, name: str) -> None:
1639
1637
  self._validate_artifact_support(ARTIFACT_GENERATE_FEATURE_NOT_SUPPORTED_MESSAGE)
1640
- artifact = self._client.get(kind="CoreArtifact", definition__name__value=name, object__ids=[self.id])
1638
+ artifact = self._client.get(kind="CoreArtifact", name__value=name, object__ids=[self.id])
1641
1639
  artifact.definition.fetch() # type: ignore[attr-defined]
1642
1640
  artifact.definition.peer.generate([artifact.id]) # type: ignore[attr-defined]
1643
1641
 
1644
1642
  def artifact_fetch(self, name: str) -> str | dict[str, Any]:
1645
1643
  self._validate_artifact_support(ARTIFACT_FETCH_FEATURE_NOT_SUPPORTED_MESSAGE)
1646
- artifact = self._client.get(kind="CoreArtifact", definition__name__value=name, object__ids=[self.id])
1644
+ artifact = self._client.get(kind="CoreArtifact", name__value=name, object__ids=[self.id])
1647
1645
  content = self._client.object_store.get(identifier=artifact.storage_id.value) # type: ignore[attr-defined]
1648
1646
  return content
1649
1647
 
@@ -1763,7 +1761,6 @@ class InfrahubNodeSync(InfrahubNodeBase):
1763
1761
  Returns:
1764
1762
  dict[str, Union[Any, Dict]]: GraphQL query in dictionary format
1765
1763
  """
1766
- # pylint: disable=too-many-branches
1767
1764
 
1768
1765
  data: dict[str, Any] = {}
1769
1766
 
infrahub_sdk/protocols.py CHANGED
@@ -73,7 +73,7 @@ class CoreArtifactTarget(CoreNode):
73
73
 
74
74
 
75
75
  class CoreBasePermission(CoreNode):
76
- decision: Enum
76
+ description: StringOptional
77
77
  identifier: StringOptional
78
78
  roles: RelationshipManager
79
79
 
@@ -108,7 +108,6 @@ class CoreGenericAccount(CoreNode):
108
108
  label: StringOptional
109
109
  description: StringOptional
110
110
  account_type: Enum
111
- role: Enum
112
111
  status: Dropdown
113
112
  tokens: RelationshipManager
114
113
 
@@ -155,6 +154,10 @@ class CoreMenu(CoreNode):
155
154
  children: RelationshipManager
156
155
 
157
156
 
157
+ class CoreObjectTemplate(CoreNode):
158
+ template_name: String
159
+
160
+
158
161
  class CoreProfile(CoreNode):
159
162
  profile_name: String
160
163
  profile_priority: IntegerOptional
@@ -200,6 +203,8 @@ class CoreValidator(CoreNode):
200
203
 
201
204
  class CoreWebhook(CoreNode):
202
205
  name: String
206
+ event_type: Enum
207
+ branch_scope: Dropdown
203
208
  description: StringOptional
204
209
  url: URL
205
210
  validate_certificates: BooleanOptional
@@ -222,7 +227,7 @@ class CoreAccount(LineageOwner, LineageSource, CoreGenericAccount):
222
227
  pass
223
228
 
224
229
 
225
- class CoreAccountGroup(CoreGroup):
230
+ class CoreAccountGroup(LineageOwner, LineageSource, CoreGroup):
226
231
  roles: RelationshipManager
227
232
 
228
233
 
@@ -350,8 +355,8 @@ class CoreGeneratorValidator(CoreValidator):
350
355
 
351
356
 
352
357
  class CoreGlobalPermission(CoreBasePermission):
353
- name: String
354
358
  action: Dropdown
359
+ decision: Enum
355
360
 
356
361
 
357
362
  class CoreGraphQLQuery(CoreNode):
@@ -402,6 +407,7 @@ class CoreObjectPermission(CoreBasePermission):
402
407
  namespace: String
403
408
  name: String
404
409
  action: Enum
410
+ decision: Enum
405
411
 
406
412
 
407
413
  class CoreObjectThread(CoreThread):
@@ -538,7 +544,7 @@ class CoreArtifactTargetSync(CoreNodeSync):
538
544
 
539
545
 
540
546
  class CoreBasePermissionSync(CoreNodeSync):
541
- decision: Enum
547
+ description: StringOptional
542
548
  identifier: StringOptional
543
549
  roles: RelationshipManagerSync
544
550
 
@@ -573,7 +579,6 @@ class CoreGenericAccountSync(CoreNodeSync):
573
579
  label: StringOptional
574
580
  description: StringOptional
575
581
  account_type: Enum
576
- role: Enum
577
582
  status: Dropdown
578
583
  tokens: RelationshipManagerSync
579
584
 
@@ -620,6 +625,10 @@ class CoreMenuSync(CoreNodeSync):
620
625
  children: RelationshipManagerSync
621
626
 
622
627
 
628
+ class CoreObjectTemplateSync(CoreNodeSync):
629
+ template_name: String
630
+
631
+
623
632
  class CoreProfileSync(CoreNodeSync):
624
633
  profile_name: String
625
634
  profile_priority: IntegerOptional
@@ -665,6 +674,8 @@ class CoreValidatorSync(CoreNodeSync):
665
674
 
666
675
  class CoreWebhookSync(CoreNodeSync):
667
676
  name: String
677
+ event_type: Enum
678
+ branch_scope: Dropdown
668
679
  description: StringOptional
669
680
  url: URL
670
681
  validate_certificates: BooleanOptional
@@ -687,7 +698,7 @@ class CoreAccountSync(LineageOwnerSync, LineageSourceSync, CoreGenericAccountSyn
687
698
  pass
688
699
 
689
700
 
690
- class CoreAccountGroupSync(CoreGroupSync):
701
+ class CoreAccountGroupSync(LineageOwnerSync, LineageSourceSync, CoreGroupSync):
691
702
  roles: RelationshipManagerSync
692
703
 
693
704
 
@@ -815,8 +826,8 @@ class CoreGeneratorValidatorSync(CoreValidatorSync):
815
826
 
816
827
 
817
828
  class CoreGlobalPermissionSync(CoreBasePermissionSync):
818
- name: String
819
829
  action: Dropdown
830
+ decision: Enum
820
831
 
821
832
 
822
833
  class CoreGraphQLQuerySync(CoreNodeSync):
@@ -867,6 +878,7 @@ class CoreObjectPermissionSync(CoreBasePermissionSync):
867
878
  namespace: String
868
879
  name: String
869
880
  action: Enum
881
+ decision: Enum
870
882
 
871
883
 
872
884
  class CoreObjectThreadSync(CoreThreadSync):
@@ -34,6 +34,7 @@ from .main import (
34
34
  RelationshipSchemaAPI,
35
35
  SchemaRoot,
36
36
  SchemaRootAPI,
37
+ TemplateSchemaAPI,
37
38
  )
38
39
 
39
40
  if TYPE_CHECKING:
@@ -58,12 +59,10 @@ __all__ = [
58
59
  "RelationshipSchemaAPI",
59
60
  "SchemaRoot",
60
61
  "SchemaRootAPI",
62
+ "TemplateSchemaAPI",
61
63
  ]
62
64
 
63
65
 
64
- # pylint: disable=redefined-builtin
65
-
66
-
67
66
  class DropdownMutationOptionalArgs(TypedDict):
68
67
  color: str | None
69
68
  description: str | None
@@ -81,8 +80,10 @@ class EnumMutation(str, Enum):
81
80
 
82
81
 
83
82
  MainSchemaTypes: TypeAlias = Union[NodeSchema, GenericSchema]
84
- MainSchemaTypesAPI: TypeAlias = Union[NodeSchemaAPI, GenericSchemaAPI, ProfileSchemaAPI]
85
- MainSchemaTypesAll: TypeAlias = Union[NodeSchema, GenericSchema, NodeSchemaAPI, GenericSchemaAPI, ProfileSchemaAPI]
83
+ MainSchemaTypesAPI: TypeAlias = Union[NodeSchemaAPI, GenericSchemaAPI, ProfileSchemaAPI, TemplateSchemaAPI]
84
+ MainSchemaTypesAll: TypeAlias = Union[
85
+ NodeSchema, GenericSchema, NodeSchemaAPI, GenericSchemaAPI, ProfileSchemaAPI, TemplateSchemaAPI
86
+ ]
86
87
 
87
88
 
88
89
  class InfrahubSchemaBase:
@@ -420,6 +421,10 @@ class InfrahubSchema(InfrahubSchemaBase):
420
421
  profile = ProfileSchemaAPI(**profile_schema)
421
422
  nodes[profile.kind] = profile
422
423
 
424
+ for template_schema in data.get("templates", []):
425
+ template = TemplateSchemaAPI(**template_schema)
426
+ nodes[template.kind] = template
427
+
423
428
  return nodes
424
429
 
425
430
 
@@ -624,6 +629,10 @@ class InfrahubSchemaSync(InfrahubSchemaBase):
624
629
  profile = ProfileSchemaAPI(**profile_schema)
625
630
  nodes[profile.kind] = profile
626
631
 
632
+ for template_schema in data.get("templates", []):
633
+ template = TemplateSchemaAPI(**template_schema)
634
+ nodes[template.kind] = template
635
+
627
636
  return nodes
628
637
 
629
638
  def load(
@@ -31,6 +31,7 @@ class RelationshipKind(str, Enum):
31
31
  GROUP = "Group"
32
32
  HIERARCHY = "Hierarchy"
33
33
  PROFILE = "Profile"
34
+ TEMPLATE = "Template"
34
35
 
35
36
 
36
37
  class RelationshipDirection(str, Enum):
@@ -290,6 +291,7 @@ class BaseNodeSchema(BaseSchema):
290
291
  branch: BranchSupportType | None = None
291
292
  default_filter: str | None = None
292
293
  generate_profile: bool | None = None
294
+ generate_template: bool | None = None
293
295
  parent: str | None = None
294
296
  children: str | None = None
295
297
 
@@ -308,6 +310,10 @@ class ProfileSchemaAPI(BaseSchema, BaseSchemaAttrRelAPI):
308
310
  inherit_from: list[str] = Field(default_factory=list)
309
311
 
310
312
 
313
+ class TemplateSchemaAPI(BaseSchema, BaseSchemaAttrRelAPI):
314
+ inherit_from: list[str] = Field(default_factory=list)
315
+
316
+
311
317
  class NodeExtensionSchema(BaseModel):
312
318
  model_config = ConfigDict(use_enum_values=True)
313
319
 
@@ -341,3 +347,4 @@ class SchemaRootAPI(BaseModel):
341
347
  generics: list[GenericSchemaAPI] = Field(default_factory=list)
342
348
  nodes: list[NodeSchemaAPI] = Field(default_factory=list)
343
349
  profiles: list[ProfileSchemaAPI] = Field(default_factory=list)
350
+ templates: list[TemplateSchemaAPI] = Field(default_factory=list)
@@ -0,0 +1 @@
1
+
@@ -0,0 +1,3 @@
1
+ from .models import TaskState
2
+
3
+ FINAL_STATES = [TaskState.COMPLETED, TaskState.FAILED, TaskState.CANCELLED, TaskState.CRASHED]
@@ -0,0 +1,25 @@
1
+ from __future__ import annotations
2
+
3
+
4
+ class TaskError(Exception):
5
+ def __init__(self, message: str | None = None):
6
+ self.message = message
7
+ super().__init__(self.message)
8
+
9
+
10
+ class TaskNotFoundError(TaskError):
11
+ def __init__(self, id: str):
12
+ self.message = f"Task with id {id} not found"
13
+ super().__init__(self.message)
14
+
15
+
16
+ class TooManyTasksError(TaskError):
17
+ def __init__(self, expected_id: str, received_ids: list[str]):
18
+ self.message = f"Expected 1 task with id {expected_id}, but got {len(received_ids)}"
19
+ super().__init__(self.message)
20
+
21
+
22
+ class TaskNotCompletedError(TaskError):
23
+ def __init__(self, id: str, message: str | None = None):
24
+ self.message = message or f"Task with id {id} is not completed"
25
+ super().__init__(self.message)