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
@@ -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
@@ -21,8 +21,10 @@ from infrahub.pools.number import NumberUtilizationGetter
21
21
  if TYPE_CHECKING:
22
22
  from graphql import GraphQLResolveInfo
23
23
 
24
+ from infrahub.core.branch import Branch
24
25
  from infrahub.core.node import Node
25
26
  from infrahub.core.protocols import CoreNode
27
+ from infrahub.core.timestamp import Timestamp
26
28
  from infrahub.database import InfrahubDatabase
27
29
  from infrahub.graphql.initialization import GraphqlContext
28
30
 
@@ -69,19 +71,21 @@ def _validate_pool_type(pool_id: str, pool: CoreNode | None = None) -> CoreNode:
69
71
 
70
72
  class PoolAllocated(ObjectType):
71
73
  count = Field(Int, required=True, description="The number of allocations within the selected pool.")
72
- edges = Field(List(of_type=PoolAllocatedEdge, required=True), required=True)
74
+ edges = Field(List(of_type=NonNull(PoolAllocatedEdge), required=True), required=True)
73
75
 
74
76
  @staticmethod
75
- async def resolve( # pylint: disable=unused-argument
76
- root: dict,
77
+ async def resolve(
78
+ root: dict, # noqa: ARG004
77
79
  info: GraphQLResolveInfo,
78
80
  pool_id: str,
79
81
  resource_id: str,
80
82
  offset: int = 0,
81
83
  limit: int = 10,
82
84
  ) -> dict:
83
- context: GraphqlContext = info.context
84
- 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
+ )
85
89
 
86
90
  fields = await extract_fields_first_node(info=info)
87
91
 
@@ -90,14 +94,19 @@ class PoolAllocated(ObjectType):
90
94
  match pool.get_kind():
91
95
  case InfrahubKind.NUMBERPOOL:
92
96
  return await resolve_number_pool_allocation(
93
- 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,
94
103
  )
95
104
  case InfrahubKind.IPPREFIXPOOL:
96
105
  allocated_kinds.append(InfrahubKind.IPPREFIX)
97
106
  case InfrahubKind.IPADDRESSPOOL:
98
107
  allocated_kinds.append(InfrahubKind.IPADDRESS)
99
108
 
100
- 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]
101
110
  if resource_id not in resources:
102
111
  raise ValidationError(
103
112
  input_value=f"The selected pool_id={pool_id} doesn't contain the requested resource_id={resource_id}"
@@ -106,8 +115,8 @@ class PoolAllocated(ObjectType):
106
115
  resource = resources[resource_id]
107
116
 
108
117
  query = await IPPrefixUtilization.init(
109
- db=context.db,
110
- at=context.at,
118
+ db=graphql_context.db,
119
+ at=graphql_context.at,
111
120
  ip_prefixes=[resource],
112
121
  allocated_kinds=allocated_kinds,
113
122
  offset=offset,
@@ -115,10 +124,10 @@ class PoolAllocated(ObjectType):
115
124
  )
116
125
  response: dict[str, Any] = {}
117
126
  if "count" in fields:
118
- response["count"] = await query.count(db=context.db)
127
+ response["count"] = await query.count(db=graphql_context.db)
119
128
 
120
129
  if edges := fields.get("edges"):
121
- await query.execute(db=context.db)
130
+ await query.execute(db=graphql_context.db)
122
131
 
123
132
  node_fields = edges.get("node", {})
124
133
 
@@ -146,9 +155,9 @@ class PoolAllocated(ObjectType):
146
155
  if not identifier_query_class:
147
156
  raise ValidationError(input_value=f"This query doesn't get support {pool.get_kind()}")
148
157
  identifier_query = await identifier_query_class.init(
149
- 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
150
159
  )
151
- await identifier_query.execute(db=context.db)
160
+ await identifier_query.execute(db=graphql_context.db)
152
161
 
153
162
  reservations = {}
154
163
  for result in identifier_query.get_results():
@@ -171,20 +180,22 @@ class PoolUtilization(ObjectType):
171
180
  utilization_default_branch = Field(
172
181
  Float, required=True, description="The overall utilization of the pool isolated to the default branch."
173
182
  )
174
- edges = Field(List(of_type=IPPrefixUtilizationEdge, required=True), required=True)
183
+ edges = Field(List(of_type=NonNull(IPPrefixUtilizationEdge), required=True), required=True)
175
184
 
176
185
  @staticmethod
177
- async def resolve( # pylint: disable=unused-argument,too-many-branches
178
- root: dict,
186
+ async def resolve(
187
+ root: dict, # noqa: ARG004
179
188
  info: GraphQLResolveInfo,
180
189
  pool_id: str,
181
190
  ) -> dict:
182
- context: GraphqlContext = info.context
183
- db: InfrahubDatabase = context.db
184
- 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)
185
194
  pool = _validate_pool_type(pool_id=pool_id, pool=pool)
186
195
  if pool.get_kind() == "CoreNumberPool":
187
- return await resolve_number_pool_utilization(db=db, context=context, pool=pool)
196
+ return await resolve_number_pool_utilization(
197
+ db=db, at=graphql_context.at, pool=pool, branch=graphql_context.branch
198
+ )
188
199
 
189
200
  resources_map: dict[str, Node] = {}
190
201
 
@@ -193,7 +204,9 @@ class PoolUtilization(ObjectType):
193
204
  except SchemaNotFoundError:
194
205
  pass
195
206
 
196
- 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
+ )
197
210
  fields = await extract_fields_first_node(info=info)
198
211
  response: dict[str, Any] = {}
199
212
  total_utilization = None
@@ -262,11 +275,11 @@ class PoolUtilization(ObjectType):
262
275
 
263
276
 
264
277
  async def resolve_number_pool_allocation(
265
- 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
266
279
  ) -> dict:
267
280
  response: dict[str, Any] = {}
268
281
  query = await NumberPoolGetAllocated.init(
269
- 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
270
283
  )
271
284
 
272
285
  if "count" in fields:
@@ -290,8 +303,10 @@ async def resolve_number_pool_allocation(
290
303
  return response
291
304
 
292
305
 
293
- async def resolve_number_pool_utilization(db: InfrahubDatabase, context: GraphqlContext, pool: CoreNode) -> dict:
294
- number_pool = NumberUtilizationGetter(db=db, pool=pool, at=context.at, branch=context.branch)
306
+ async def resolve_number_pool_utilization(
307
+ db: InfrahubDatabase, pool: CoreNode, at: Timestamp | str | None, branch: Branch
308
+ ) -> dict:
309
+ number_pool = NumberUtilizationGetter(db=db, pool=pool, at=at, branch=branch)
295
310
  await number_pool.load_data()
296
311
 
297
312
  return {
@@ -322,9 +337,10 @@ InfrahubResourcePoolAllocated = Field(
322
337
  limit=Int(required=False),
323
338
  offset=Int(required=False),
324
339
  resolver=PoolAllocated.resolve,
340
+ required=True,
325
341
  )
326
342
 
327
343
 
328
344
  InfrahubResourcePoolUtilization = Field(
329
- PoolUtilization, pool_id=String(required=True), resolver=PoolUtilization.resolve
345
+ PoolUtilization, pool_id=String(required=True), resolver=PoolUtilization.resolve, required=True
330
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
  )