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
@@ -4,13 +4,14 @@ import ipaddress
4
4
  from typing import TYPE_CHECKING, Optional
5
5
 
6
6
  from graphene import Field, Int, ObjectType, String
7
+ from netaddr import IPSet
7
8
 
8
9
  from infrahub.core.constants import InfrahubKind
9
10
  from infrahub.core.manager import NodeManager
10
11
  from infrahub.core.query.ipam import get_ip_addresses, get_subnets
11
12
  from infrahub.exceptions import NodeNotFoundError, ValidationError
12
13
  from infrahub.pools.address import get_available
13
- from infrahub.pools.prefix import PrefixPool
14
+ from infrahub.pools.prefix import get_next_available_prefix
14
15
 
15
16
  if TYPE_CHECKING:
16
17
  from graphql import GraphQLResolveInfo
@@ -23,18 +24,18 @@ class IPAddressGetNextAvailable(ObjectType):
23
24
 
24
25
  @staticmethod
25
26
  async def resolve(
26
- root: dict, # pylint: disable=unused-argument
27
+ root: dict, # noqa: ARG004
27
28
  info: GraphQLResolveInfo,
28
29
  prefix_id: str,
29
30
  prefix_length: Optional[int] = None,
30
31
  ) -> dict[str, str]:
31
- context: GraphqlContext = info.context
32
+ graphql_context: GraphqlContext = info.context
32
33
 
33
- prefix = await NodeManager.get_one(id=prefix_id, db=context.db, branch=context.branch)
34
+ prefix = await NodeManager.get_one(id=prefix_id, db=graphql_context.db, branch=graphql_context.branch)
34
35
 
35
36
  if not prefix:
36
37
  raise NodeNotFoundError(
37
- branch_name=context.branch.name, node_type=InfrahubKind.IPPREFIX, identifier=prefix_id
38
+ branch_name=graphql_context.branch.name, node_type=InfrahubKind.IPPREFIX, identifier=prefix_id
38
39
  )
39
40
 
40
41
  ip_prefix = ipaddress.ip_network(prefix.prefix.value) # type: ignore[attr-defined]
@@ -43,12 +44,12 @@ class IPAddressGetNextAvailable(ObjectType):
43
44
  if not ip_prefix.prefixlen <= prefix_length <= ip_prefix.max_prefixlen:
44
45
  raise ValidationError(input_value="Invalid prefix length for current selected prefix")
45
46
 
46
- namespace = await prefix.ip_namespace.get_peer(db=context.db) # type: ignore[attr-defined]
47
+ namespace = await prefix.ip_namespace.get_peer(db=graphql_context.db) # type: ignore[attr-defined]
47
48
  addresses = await get_ip_addresses(
48
- db=context.db,
49
+ db=graphql_context.db,
49
50
  ip_prefix=ip_prefix,
50
51
  namespace=namespace,
51
- branch=context.branch,
52
+ branch=graphql_context.branch,
52
53
  )
53
54
 
54
55
  available = get_available(
@@ -70,33 +71,35 @@ class IPPrefixGetNextAvailable(ObjectType):
70
71
 
71
72
  @staticmethod
72
73
  async def resolve(
73
- root: dict, # pylint: disable=unused-argument
74
+ root: dict, # noqa: ARG004
74
75
  info: GraphQLResolveInfo,
75
76
  prefix_id: str,
76
77
  prefix_length: int,
77
78
  ) -> dict[str, str]:
78
- context: GraphqlContext = info.context
79
+ graphql_context: GraphqlContext = info.context
79
80
 
80
- prefix = await NodeManager.get_one(id=prefix_id, db=context.db, branch=context.branch)
81
+ prefix = await NodeManager.get_one(id=prefix_id, db=graphql_context.db, branch=graphql_context.branch)
81
82
 
82
83
  if not prefix:
83
84
  raise NodeNotFoundError(
84
- branch_name=context.branch.name, node_type=InfrahubKind.IPPREFIX, identifier=prefix_id
85
+ branch_name=graphql_context.branch.name, node_type=InfrahubKind.IPPREFIX, identifier=prefix_id
85
86
  )
86
87
 
87
- namespace = await prefix.ip_namespace.get_peer(db=context.db) # type: ignore[attr-defined]
88
+ namespace = await prefix.ip_namespace.get_peer(db=graphql_context.db) # type: ignore[attr-defined]
88
89
  subnets = await get_subnets(
89
- db=context.db,
90
+ db=graphql_context.db,
90
91
  ip_prefix=ipaddress.ip_network(prefix.prefix.value), # type: ignore[attr-defined]
91
92
  namespace=namespace,
92
- branch=context.branch,
93
+ branch=graphql_context.branch,
93
94
  )
94
95
 
95
- pool = PrefixPool(prefix.prefix.value) # type: ignore[attr-defined]
96
+ pool = IPSet([prefix.prefix.value])
96
97
  for subnet in subnets:
97
- pool.reserve(subnet=str(subnet.prefix))
98
+ pool.remove(addr=str(subnet.prefix))
99
+
100
+ prefix_ver = ipaddress.ip_network(prefix.prefix.value).version
101
+ next_available = get_next_available_prefix(pool=pool, prefix_length=prefix_length, prefix_ver=prefix_ver)
98
102
 
99
- next_available = pool.get(prefixlen=prefix_length)
100
103
  return {"prefix": str(next_available)}
101
104
 
102
105
 
@@ -105,6 +108,7 @@ InfrahubIPAddressGetNextAvailable = Field(
105
108
  prefix_id=String(required=True),
106
109
  prefix_length=Int(required=False),
107
110
  resolver=IPAddressGetNextAvailable.resolve,
111
+ required=True,
108
112
  )
109
113
 
110
114
 
@@ -113,4 +117,5 @@ InfrahubIPPrefixGetNextAvailable = Field(
113
117
  prefix_id=String(required=True),
114
118
  prefix_length=Int(required=False),
115
119
  resolver=IPPrefixGetNextAvailable.resolve,
120
+ required=True,
116
121
  )
@@ -15,30 +15,30 @@ if TYPE_CHECKING:
15
15
 
16
16
 
17
17
  class Relationships(ObjectType):
18
- edges = List(RelationshipNode)
19
- count = Int()
18
+ edges = List(of_type=NonNull(RelationshipNode), required=True)
19
+ count = Int(required=True)
20
20
 
21
21
  @staticmethod
22
22
  async def resolve(
23
- root: dict, # pylint: disable=unused-argument
23
+ root: dict, # noqa: ARG004
24
24
  info: GraphQLResolveInfo,
25
25
  ids: list[str],
26
26
  limit: int = 10,
27
27
  offset: int = 0,
28
28
  excluded_namespaces: Optional[list[str]] = None,
29
29
  ) -> dict[str, Any]:
30
- context: GraphqlContext = info.context
30
+ graphql_context: GraphqlContext = info.context
31
31
 
32
32
  fields = await extract_fields_first_node(info)
33
33
  excluded_namespaces = excluded_namespaces or []
34
34
 
35
35
  response: dict[str, Any] = {"edges": [], "count": None}
36
36
 
37
- async with context.db.start_session() as db:
37
+ async with graphql_context.db.start_session() as db:
38
38
  query = await RelationshipGetByIdentifierQuery.init(
39
39
  db=db,
40
- branch=context.branch,
41
- at=context.at,
40
+ branch=graphql_context.branch,
41
+ at=graphql_context.at,
42
42
  identifiers=ids,
43
43
  excluded_namespaces=excluded_namespaces,
44
44
  limit=limit,
@@ -74,9 +74,10 @@ class Relationships(ObjectType):
74
74
 
75
75
  Relationship = Field(
76
76
  Relationships,
77
- resolver=Relationships.resolve,
78
- limit=Int(required=False),
79
- offset=Int(required=False),
80
77
  ids=List(NonNull(String), required=True),
81
78
  excluded_namespaces=List(String),
79
+ limit=Int(required=False),
80
+ offset=Int(required=False),
81
+ resolver=Relationships.resolve,
82
+ required=True,
82
83
  )
@@ -2,7 +2,7 @@ from __future__ import annotations
2
2
 
3
3
  from typing import TYPE_CHECKING, Any
4
4
 
5
- from graphene import Field, Float, Int, List, ObjectType, String
5
+ from graphene import Field, Float, Int, List, NonNull, ObjectType, String
6
6
  from infrahub_sdk.utils import extract_fields_first_node
7
7
 
8
8
  from infrahub.core import registry
@@ -71,19 +71,21 @@ def _validate_pool_type(pool_id: str, pool: CoreNode | None = None) -> CoreNode:
71
71
 
72
72
  class PoolAllocated(ObjectType):
73
73
  count = Field(Int, required=True, description="The number of allocations within the selected pool.")
74
- edges = Field(List(of_type=PoolAllocatedEdge, required=True), required=True)
74
+ edges = Field(List(of_type=NonNull(PoolAllocatedEdge), required=True), required=True)
75
75
 
76
76
  @staticmethod
77
- async def resolve( # pylint: disable=unused-argument
78
- root: dict,
77
+ async def resolve(
78
+ root: dict, # noqa: ARG004
79
79
  info: GraphQLResolveInfo,
80
80
  pool_id: str,
81
81
  resource_id: str,
82
82
  offset: int = 0,
83
83
  limit: int = 10,
84
84
  ) -> dict:
85
- context: GraphqlContext = info.context
86
- pool: CoreNode | None = await NodeManager.get_one(id=pool_id, db=context.db, branch=context.branch)
85
+ graphql_context: GraphqlContext = info.context
86
+ pool: CoreNode | None = await NodeManager.get_one(
87
+ id=pool_id, db=graphql_context.db, branch=graphql_context.branch
88
+ )
87
89
 
88
90
  fields = await extract_fields_first_node(info=info)
89
91
 
@@ -92,14 +94,19 @@ class PoolAllocated(ObjectType):
92
94
  match pool.get_kind():
93
95
  case InfrahubKind.NUMBERPOOL:
94
96
  return await resolve_number_pool_allocation(
95
- db=context.db, context=context, pool=pool, fields=fields, offset=offset, limit=limit
97
+ db=graphql_context.db,
98
+ graphql_context=graphql_context,
99
+ pool=pool,
100
+ fields=fields,
101
+ offset=offset,
102
+ limit=limit,
96
103
  )
97
104
  case InfrahubKind.IPPREFIXPOOL:
98
105
  allocated_kinds.append(InfrahubKind.IPPREFIX)
99
106
  case InfrahubKind.IPADDRESSPOOL:
100
107
  allocated_kinds.append(InfrahubKind.IPADDRESS)
101
108
 
102
- resources = await pool.resources.get_peers(db=context.db) # type: ignore[attr-defined,union-attr]
109
+ resources = await pool.resources.get_peers(db=graphql_context.db) # type: ignore[attr-defined,union-attr]
103
110
  if resource_id not in resources:
104
111
  raise ValidationError(
105
112
  input_value=f"The selected pool_id={pool_id} doesn't contain the requested resource_id={resource_id}"
@@ -108,8 +115,8 @@ class PoolAllocated(ObjectType):
108
115
  resource = resources[resource_id]
109
116
 
110
117
  query = await IPPrefixUtilization.init(
111
- db=context.db,
112
- at=context.at,
118
+ db=graphql_context.db,
119
+ at=graphql_context.at,
113
120
  ip_prefixes=[resource],
114
121
  allocated_kinds=allocated_kinds,
115
122
  offset=offset,
@@ -117,10 +124,10 @@ class PoolAllocated(ObjectType):
117
124
  )
118
125
  response: dict[str, Any] = {}
119
126
  if "count" in fields:
120
- response["count"] = await query.count(db=context.db)
127
+ response["count"] = await query.count(db=graphql_context.db)
121
128
 
122
129
  if edges := fields.get("edges"):
123
- await query.execute(db=context.db)
130
+ await query.execute(db=graphql_context.db)
124
131
 
125
132
  node_fields = edges.get("node", {})
126
133
 
@@ -148,9 +155,9 @@ class PoolAllocated(ObjectType):
148
155
  if not identifier_query_class:
149
156
  raise ValidationError(input_value=f"This query doesn't get support {pool.get_kind()}")
150
157
  identifier_query = await identifier_query_class.init(
151
- db=context.db, at=context.at, pool_id=pool_id, allocated=allocated_ids
158
+ db=graphql_context.db, at=graphql_context.at, pool_id=pool_id, allocated=allocated_ids
152
159
  )
153
- await identifier_query.execute(db=context.db)
160
+ await identifier_query.execute(db=graphql_context.db)
154
161
 
155
162
  reservations = {}
156
163
  for result in identifier_query.get_results():
@@ -173,20 +180,22 @@ class PoolUtilization(ObjectType):
173
180
  utilization_default_branch = Field(
174
181
  Float, required=True, description="The overall utilization of the pool isolated to the default branch."
175
182
  )
176
- edges = Field(List(of_type=IPPrefixUtilizationEdge, required=True), required=True)
183
+ edges = Field(List(of_type=NonNull(IPPrefixUtilizationEdge), required=True), required=True)
177
184
 
178
185
  @staticmethod
179
- async def resolve( # pylint: disable=unused-argument,too-many-branches
180
- root: dict,
186
+ async def resolve(
187
+ root: dict, # noqa: ARG004
181
188
  info: GraphQLResolveInfo,
182
189
  pool_id: str,
183
190
  ) -> dict:
184
- context: GraphqlContext = info.context
185
- db: InfrahubDatabase = context.db
186
- pool: CoreNode | None = await NodeManager.get_one(id=pool_id, db=db, branch=context.branch)
191
+ graphql_context: GraphqlContext = info.context
192
+ db: InfrahubDatabase = graphql_context.db
193
+ pool: CoreNode | None = await NodeManager.get_one(id=pool_id, db=db, branch=graphql_context.branch)
187
194
  pool = _validate_pool_type(pool_id=pool_id, pool=pool)
188
195
  if pool.get_kind() == "CoreNumberPool":
189
- return await resolve_number_pool_utilization(db=db, at=context.at, pool=pool, branch=context.branch)
196
+ return await resolve_number_pool_utilization(
197
+ db=db, at=graphql_context.at, pool=pool, branch=graphql_context.branch
198
+ )
190
199
 
191
200
  resources_map: dict[str, Node] = {}
192
201
 
@@ -195,7 +204,9 @@ class PoolUtilization(ObjectType):
195
204
  except SchemaNotFoundError:
196
205
  pass
197
206
 
198
- utilization_getter = PrefixUtilizationGetter(db=db, ip_prefixes=list(resources_map.values()), at=context.at)
207
+ utilization_getter = PrefixUtilizationGetter(
208
+ db=db, ip_prefixes=list(resources_map.values()), at=graphql_context.at
209
+ )
199
210
  fields = await extract_fields_first_node(info=info)
200
211
  response: dict[str, Any] = {}
201
212
  total_utilization = None
@@ -264,11 +275,11 @@ class PoolUtilization(ObjectType):
264
275
 
265
276
 
266
277
  async def resolve_number_pool_allocation(
267
- db: InfrahubDatabase, context: GraphqlContext, pool: CoreNode, fields: dict, offset: int, limit: int
278
+ db: InfrahubDatabase, graphql_context: GraphqlContext, pool: CoreNode, fields: dict, offset: int, limit: int
268
279
  ) -> dict:
269
280
  response: dict[str, Any] = {}
270
281
  query = await NumberPoolGetAllocated.init(
271
- db=db, pool=pool, offset=offset, limit=limit, branch=context.branch, branch_agnostic=True
282
+ db=db, pool=pool, offset=offset, limit=limit, branch=graphql_context.branch, branch_agnostic=True
272
283
  )
273
284
 
274
285
  if "count" in fields:
@@ -326,9 +337,10 @@ InfrahubResourcePoolAllocated = Field(
326
337
  limit=Int(required=False),
327
338
  offset=Int(required=False),
328
339
  resolver=PoolAllocated.resolve,
340
+ required=True,
329
341
  )
330
342
 
331
343
 
332
344
  InfrahubResourcePoolUtilization = Field(
333
- PoolUtilization, pool_id=String(required=True), resolver=PoolUtilization.resolve
345
+ PoolUtilization, pool_id=String(required=True), resolver=PoolUtilization.resolve, required=True
334
346
  )
@@ -3,7 +3,7 @@ from __future__ import annotations
3
3
  import ipaddress
4
4
  from typing import TYPE_CHECKING, Any, Optional
5
5
 
6
- from graphene import Boolean, Field, Int, List, ObjectType, String
6
+ from graphene import Boolean, Field, Int, List, NonNull, ObjectType, String
7
7
  from infrahub_sdk.utils import extract_fields_first_node, is_valid_uuid
8
8
 
9
9
  from infrahub.core.constants import InfrahubKind
@@ -27,7 +27,7 @@ class NodeEdge(ObjectType):
27
27
 
28
28
  class NodeEdges(ObjectType):
29
29
  count = Field(Int, required=True)
30
- edges = Field(List(of_type=NodeEdge, required=True), required=False)
30
+ edges = Field(List(of_type=NonNull(NodeEdge)), required=True)
31
31
 
32
32
 
33
33
  def _collapse_ipv6(s: str) -> str:
@@ -97,13 +97,13 @@ def _collapse_ipv6(s: str) -> str:
97
97
 
98
98
 
99
99
  async def search_resolver(
100
- root: dict, # pylint: disable=unused-argument
100
+ root: dict, # noqa: ARG001
101
101
  info: GraphQLResolveInfo,
102
102
  q: str,
103
103
  limit: int = 10,
104
104
  partial_match: bool = True,
105
105
  ) -> dict[str, Any]:
106
- context: GraphqlContext = info.context
106
+ graphql_context: GraphqlContext = info.context
107
107
  response: dict[str, Any] = {}
108
108
  results: list[CoreNode] = []
109
109
 
@@ -111,7 +111,7 @@ async def search_resolver(
111
111
 
112
112
  if is_valid_uuid(q):
113
113
  matching: Optional[CoreNode] = await NodeManager.get_one(
114
- db=context.db, branch=context.branch, at=context.at, id=q
114
+ db=graphql_context.db, branch=graphql_context.branch, at=graphql_context.at, id=q
115
115
  )
116
116
  if matching:
117
117
  results.append(matching)
@@ -124,8 +124,8 @@ async def search_resolver(
124
124
 
125
125
  for kind in [InfrahubKind.NODE, InfrahubKind.GENERICGROUP]:
126
126
  objs = await NodeManager.query(
127
- db=context.db,
128
- branch=context.branch,
127
+ db=graphql_context.db,
128
+ branch=graphql_context.branch,
129
129
  schema=kind,
130
130
  filters={"any__value": q},
131
131
  limit=limit,
@@ -133,7 +133,7 @@ async def search_resolver(
133
133
  )
134
134
  results.extend(objs)
135
135
 
136
- if "edges" in fields and len(results) > 0:
136
+ if "edges" in fields:
137
137
  response["edges"] = [{"node": {"id": obj.id, "kind": obj.get_kind()}} for obj in results]
138
138
 
139
139
  if "count" in fields:
@@ -148,4 +148,5 @@ InfrahubSearchAnywhere = Field(
148
148
  limit=Int(required=False),
149
149
  partial_match=Boolean(required=False),
150
150
  resolver=search_resolver,
151
+ required=True,
151
152
  )
@@ -2,11 +2,9 @@ from __future__ import annotations
2
2
 
3
3
  from typing import TYPE_CHECKING, Any
4
4
 
5
- from graphene import Boolean, Field, List, ObjectType, String
5
+ from graphene import Boolean, Field, List, NonNull, ObjectType, String
6
6
  from infrahub_sdk.utils import extract_fields_first_node
7
7
 
8
- from infrahub.services import services
9
-
10
8
  if TYPE_CHECKING:
11
9
  from graphql import GraphQLResolveInfo
12
10
 
@@ -30,7 +28,7 @@ class StatusWorkerEdge(ObjectType):
30
28
 
31
29
 
32
30
  class StatusWorkerEdges(ObjectType):
33
- edges = Field(List(of_type=StatusWorkerEdge, required=True), required=True)
31
+ edges = Field(List(of_type=NonNull(StatusWorkerEdge), required=True), required=True)
34
32
 
35
33
 
36
34
  class Status(ObjectType):
@@ -39,15 +37,18 @@ class Status(ObjectType):
39
37
 
40
38
 
41
39
  async def resolve_status(
42
- root: dict, # pylint: disable=unused-argument
40
+ root: dict, # noqa: ARG001
43
41
  info: GraphQLResolveInfo,
44
42
  ) -> dict:
45
- context: GraphqlContext = info.context
46
- service = context.service or services.service
43
+ graphql_context: GraphqlContext = info.context
44
+ service = graphql_context.service
45
+ if service is None:
46
+ raise ValueError("GraphqlContext.service is None")
47
+
47
48
  fields = await extract_fields_first_node(info)
48
49
  response: dict[str, Any] = {}
49
50
  workers = await service.component.list_workers(
50
- branch=str(context.branch.uuid) or context.branch.name, schema_hash=True
51
+ branch=str(graphql_context.branch.uuid) or graphql_context.branch.name, schema_hash=True
51
52
  )
52
53
 
53
54
  if summary := fields.get("summary"):
@@ -63,4 +64,6 @@ async def resolve_status(
63
64
  return response
64
65
 
65
66
 
66
- InfrahubStatus = Field(Status, resolver=resolve_status)
67
+ InfrahubStatus = Field(
68
+ Status, description="Retrieve the status of all infrahub workers.", resolver=resolve_status, required=True
69
+ )
@@ -2,7 +2,7 @@ from __future__ import annotations
2
2
 
3
3
  from typing import TYPE_CHECKING, Any
4
4
 
5
- from graphene import Field, Int, List, ObjectType, String
5
+ from graphene import Field, Int, List, NonNull, ObjectType, String
6
6
  from infrahub_sdk.utils import extract_fields_first_node
7
7
  from prefect.client.schemas.objects import StateType
8
8
 
@@ -17,12 +17,12 @@ if TYPE_CHECKING:
17
17
 
18
18
 
19
19
  class Tasks(ObjectType):
20
- edges = List(TaskNodes)
21
- count = Int()
20
+ edges = List(NonNull(TaskNodes), required=True)
21
+ count = Int(required=True)
22
22
 
23
23
  @staticmethod
24
24
  async def resolve(
25
- root: dict, # pylint: disable=unused-argument
25
+ root: dict, # noqa: ARG004
26
26
  info: GraphQLResolveInfo,
27
27
  limit: int = 10,
28
28
  offset: int = 0,
@@ -49,7 +49,7 @@ class Tasks(ObjectType):
49
49
 
50
50
  @staticmethod
51
51
  async def resolve_branch_status(
52
- root: dict, # pylint: disable=unused-argument
52
+ root: dict, # noqa: ARG004
53
53
  info: GraphQLResolveInfo,
54
54
  branch: str,
55
55
  ) -> dict[str, Any]:
@@ -72,11 +72,11 @@ class Tasks(ObjectType):
72
72
  limit: int | None = None,
73
73
  offset: int | None = None,
74
74
  ) -> dict[str, Any]:
75
- context: GraphqlContext = info.context
75
+ graphql_context: GraphqlContext = info.context
76
76
  fields = await extract_fields_first_node(info)
77
77
 
78
78
  prefect_tasks = await PrefectTask.query(
79
- db=context.db,
79
+ db=graphql_context.db,
80
80
  fields=fields,
81
81
  q=q,
82
82
  ids=ids,
@@ -97,7 +97,6 @@ class Tasks(ObjectType):
97
97
 
98
98
  Task = Field(
99
99
  Tasks,
100
- resolver=Tasks.resolve,
101
100
  limit=Int(required=False),
102
101
  offset=Int(required=False),
103
102
  related_node__ids=List(String),
@@ -106,11 +105,14 @@ Task = Field(
106
105
  workflow=List(String),
107
106
  ids=List(String),
108
107
  q=String(required=False),
108
+ resolver=Tasks.resolve,
109
+ required=True,
109
110
  )
110
111
 
111
112
  TaskBranchStatus = Field(
112
113
  Tasks,
113
- resolver=Tasks.resolve_branch_status,
114
114
  branch=String(required=False),
115
115
  description="Return the list of all pending or running tasks that can modify the data, for a given branch",
116
+ resolver=Tasks.resolve_branch_status,
117
+ required=True,
116
118
  )