infrahub-server 1.1.6__py3-none-any.whl → 1.2.0rc0__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 (346) 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} +2 -4
  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/tasks.py +63 -17
  16. infrahub/computed_attribute/triggers.py +90 -0
  17. infrahub/config.py +1 -1
  18. infrahub/context.py +39 -0
  19. infrahub/core/account.py +5 -8
  20. infrahub/core/attribute.py +53 -21
  21. infrahub/core/branch/models.py +4 -4
  22. infrahub/core/branch/tasks.py +89 -130
  23. infrahub/core/changelog/__init__.py +0 -0
  24. infrahub/core/changelog/diff.py +232 -0
  25. infrahub/core/changelog/models.py +488 -0
  26. infrahub/core/constants/__init__.py +19 -2
  27. infrahub/core/constants/infrahubkind.py +1 -0
  28. infrahub/core/diff/combiner.py +12 -8
  29. infrahub/core/diff/coordinator.py +49 -70
  30. infrahub/core/diff/data_check_synchronizer.py +86 -7
  31. infrahub/core/diff/enricher/aggregated.py +3 -3
  32. infrahub/core/diff/enricher/cardinality_one.py +2 -7
  33. infrahub/core/diff/enricher/hierarchy.py +5 -3
  34. infrahub/core/diff/enricher/labels.py +14 -4
  35. infrahub/core/diff/enricher/path_identifier.py +3 -9
  36. infrahub/core/diff/enricher/summary_counts.py +3 -1
  37. infrahub/core/diff/merger/merger.py +8 -4
  38. infrahub/core/diff/model/path.py +47 -29
  39. infrahub/core/diff/query/all_conflicts.py +6 -3
  40. infrahub/core/diff/query/artifact.py +1 -1
  41. infrahub/core/diff/query/delete_query.py +1 -1
  42. infrahub/core/diff/query/diff_get.py +3 -2
  43. infrahub/core/diff/query/diff_summary.py +1 -1
  44. infrahub/core/diff/query/field_specifiers.py +3 -1
  45. infrahub/core/diff/query/field_summary.py +3 -2
  46. infrahub/core/diff/query/filters.py +12 -1
  47. infrahub/core/diff/query/get_conflict_query.py +1 -1
  48. infrahub/core/diff/query/has_conflicts_query.py +6 -3
  49. infrahub/core/diff/query/merge.py +3 -3
  50. infrahub/core/diff/query/{drop_tracking_id.py → merge_tracking_id.py} +4 -4
  51. infrahub/core/diff/query/roots_metadata.py +9 -2
  52. infrahub/core/diff/query/save.py +151 -66
  53. infrahub/core/diff/query/summary_counts_enricher.py +220 -0
  54. infrahub/core/diff/query/time_range_query.py +3 -2
  55. infrahub/core/diff/query/update_conflict_query.py +1 -1
  56. infrahub/core/diff/query_parser.py +49 -24
  57. infrahub/core/diff/repository/deserializer.py +24 -25
  58. infrahub/core/diff/repository/repository.py +76 -20
  59. infrahub/core/diff/tasks.py +9 -8
  60. infrahub/core/enums.py +1 -1
  61. infrahub/core/integrity/object_conflict/conflict_recorder.py +1 -1
  62. infrahub/core/ipam/reconciler.py +1 -1
  63. infrahub/core/ipam/tasks.py +2 -3
  64. infrahub/core/manager.py +18 -13
  65. infrahub/core/merge.py +5 -2
  66. infrahub/core/migrations/graph/m001_add_version_to_graph.py +1 -1
  67. infrahub/core/migrations/graph/m002_attribute_is_default.py +2 -2
  68. infrahub/core/migrations/graph/m003_relationship_parent_optional.py +2 -2
  69. infrahub/core/migrations/graph/m004_add_attr_documentation.py +1 -1
  70. infrahub/core/migrations/graph/m005_add_rel_read_only.py +1 -1
  71. infrahub/core/migrations/graph/m006_add_rel_on_delete.py +1 -1
  72. infrahub/core/migrations/graph/m007_add_rel_allow_override.py +1 -1
  73. infrahub/core/migrations/graph/m008_add_human_friendly_id.py +1 -1
  74. infrahub/core/migrations/graph/m009_add_generate_profile_attr.py +1 -1
  75. infrahub/core/migrations/graph/m010_add_generate_profile_attr_generic.py +1 -1
  76. infrahub/core/migrations/graph/m011_remove_profile_relationship_schema.py +2 -2
  77. infrahub/core/migrations/graph/m012_convert_account_generic.py +12 -23
  78. infrahub/core/migrations/graph/m013_convert_git_password_credential.py +7 -11
  79. infrahub/core/migrations/graph/m014_remove_index_attr_value.py +2 -2
  80. infrahub/core/migrations/graph/m015_diff_format_update.py +1 -1
  81. infrahub/core/migrations/graph/m016_diff_delete_bug_fix.py +1 -1
  82. infrahub/core/migrations/graph/m017_add_core_profile.py +1 -1
  83. infrahub/core/migrations/graph/m018_uniqueness_nulls.py +2 -2
  84. infrahub/core/migrations/query/attribute_add.py +1 -1
  85. infrahub/core/migrations/query/attribute_rename.py +1 -1
  86. infrahub/core/migrations/query/delete_element_in_schema.py +1 -1
  87. infrahub/core/migrations/query/node_duplicate.py +1 -1
  88. infrahub/core/migrations/query/relationship_duplicate.py +1 -1
  89. infrahub/core/migrations/query/schema_attribute_update.py +1 -1
  90. infrahub/core/migrations/schema/node_attribute_remove.py +1 -1
  91. infrahub/core/migrations/schema/node_remove.py +1 -1
  92. infrahub/core/migrations/schema/tasks.py +5 -5
  93. infrahub/core/migrations/shared.py +4 -4
  94. infrahub/core/models.py +7 -8
  95. infrahub/core/node/__init__.py +161 -40
  96. infrahub/core/node/base.py +1 -1
  97. infrahub/core/node/constraints/grouped_uniqueness.py +9 -2
  98. infrahub/core/node/delete_validator.py +4 -4
  99. infrahub/core/node/ipam.py +13 -8
  100. infrahub/core/node/permissions.py +4 -0
  101. infrahub/core/node/resource_manager/ip_prefix_pool.py +8 -5
  102. infrahub/core/node/standard.py +3 -5
  103. infrahub/core/property.py +1 -1
  104. infrahub/core/protocols.py +4 -0
  105. infrahub/core/protocols_base.py +4 -2
  106. infrahub/core/query/__init__.py +2 -5
  107. infrahub/core/query/attribute.py +9 -9
  108. infrahub/core/query/branch.py +5 -5
  109. infrahub/core/query/delete.py +1 -1
  110. infrahub/core/query/diff.py +45 -7
  111. infrahub/core/query/ipam.py +4 -4
  112. infrahub/core/query/node.py +19 -14
  113. infrahub/core/query/relationship.py +10 -11
  114. infrahub/core/query/resource_manager.py +13 -11
  115. infrahub/core/query/standard_node.py +6 -6
  116. infrahub/core/query/task.py +3 -3
  117. infrahub/core/query/task_log.py +1 -1
  118. infrahub/core/query/utils.py +5 -5
  119. infrahub/core/registry.py +0 -2
  120. infrahub/core/relationship/constraints/count.py +1 -1
  121. infrahub/core/relationship/constraints/peer_kind.py +1 -1
  122. infrahub/core/relationship/model.py +66 -26
  123. infrahub/core/schema/__init__.py +6 -4
  124. infrahub/core/schema/basenode_schema.py +1 -3
  125. infrahub/core/schema/definitions/core.py +14 -2
  126. infrahub/core/schema/definitions/internal.py +16 -0
  127. infrahub/core/schema/generated/genericnode_schema.py +5 -0
  128. infrahub/core/schema/generated/node_schema.py +5 -0
  129. infrahub/core/schema/generic_schema.py +5 -1
  130. infrahub/core/schema/manager.py +45 -42
  131. infrahub/core/schema/node_schema.py +4 -0
  132. infrahub/core/schema/profile_schema.py +4 -0
  133. infrahub/core/schema/relationship_schema.py +2 -2
  134. infrahub/core/schema/schema_branch.py +248 -14
  135. infrahub/core/schema/template_schema.py +36 -0
  136. infrahub/core/task/user_task.py +7 -5
  137. infrahub/core/timestamp.py +1 -1
  138. infrahub/core/utils.py +3 -2
  139. infrahub/core/validators/attribute/choices.py +1 -1
  140. infrahub/core/validators/attribute/enum.py +1 -1
  141. infrahub/core/validators/attribute/kind.py +1 -1
  142. infrahub/core/validators/attribute/length.py +1 -1
  143. infrahub/core/validators/attribute/optional.py +1 -1
  144. infrahub/core/validators/attribute/regex.py +1 -1
  145. infrahub/core/validators/attribute/unique.py +1 -1
  146. infrahub/core/validators/checks_runner.py +37 -0
  147. infrahub/core/validators/node/generate_profile.py +1 -1
  148. infrahub/core/validators/node/hierarchy.py +1 -1
  149. infrahub/core/validators/query.py +1 -1
  150. infrahub/core/validators/relationship/count.py +1 -1
  151. infrahub/core/validators/relationship/optional.py +1 -1
  152. infrahub/core/validators/relationship/peer.py +1 -1
  153. infrahub/core/validators/tasks.py +8 -6
  154. infrahub/core/validators/uniqueness/query.py +20 -17
  155. infrahub/database/__init__.py +15 -2
  156. infrahub/database/memgraph.py +1 -1
  157. infrahub/dependencies/builder/constraint/grouped/node_runner.py +0 -2
  158. infrahub/dependencies/builder/diff/combiner.py +1 -1
  159. infrahub/dependencies/builder/diff/conflicts_enricher.py +1 -1
  160. infrahub/dependencies/builder/diff/coordinator.py +0 -2
  161. infrahub/dependencies/builder/diff/deserializer.py +1 -1
  162. infrahub/dependencies/builder/diff/enricher/summary_counts.py +1 -1
  163. infrahub/events/branch_action.py +47 -21
  164. infrahub/events/group_action.py +73 -0
  165. infrahub/events/models.py +159 -51
  166. infrahub/events/node_action.py +74 -8
  167. infrahub/events/repository_action.py +8 -8
  168. infrahub/events/schema_action.py +21 -8
  169. infrahub/generators/tasks.py +12 -13
  170. infrahub/git/base.py +3 -5
  171. infrahub/git/constants.py +0 -1
  172. infrahub/git/integrator.py +36 -35
  173. infrahub/git/repository.py +7 -8
  174. infrahub/git/tasks.py +43 -107
  175. infrahub/git_credential/helper.py +2 -3
  176. infrahub/graphql/analyzer.py +572 -11
  177. infrahub/graphql/app.py +34 -26
  178. infrahub/graphql/auth/query_permission_checker/anonymous_checker.py +5 -5
  179. infrahub/graphql/auth/query_permission_checker/default_branch_checker.py +4 -4
  180. infrahub/graphql/auth/query_permission_checker/merge_operation_checker.py +4 -4
  181. infrahub/graphql/auth/query_permission_checker/object_permission_checker.py +28 -35
  182. infrahub/graphql/auth/query_permission_checker/super_admin_checker.py +5 -5
  183. infrahub/graphql/enums.py +1 -1
  184. infrahub/graphql/initialization.py +5 -1
  185. infrahub/graphql/loaders/node.py +2 -2
  186. infrahub/graphql/manager.py +59 -54
  187. infrahub/graphql/mutations/account.py +20 -13
  188. infrahub/graphql/mutations/artifact_definition.py +16 -12
  189. infrahub/graphql/mutations/branch.py +61 -40
  190. infrahub/graphql/mutations/computed_attribute.py +19 -13
  191. infrahub/graphql/mutations/diff.py +37 -9
  192. infrahub/graphql/mutations/diff_conflict.py +9 -8
  193. infrahub/graphql/mutations/graphql_query.py +19 -11
  194. infrahub/graphql/mutations/ipam.py +21 -19
  195. infrahub/graphql/mutations/main.py +197 -44
  196. infrahub/graphql/mutations/menu.py +8 -8
  197. infrahub/graphql/mutations/proposed_change.py +36 -28
  198. infrahub/graphql/mutations/relationship.py +302 -105
  199. infrahub/graphql/mutations/repository.py +41 -35
  200. infrahub/graphql/mutations/resource_manager.py +26 -26
  201. infrahub/graphql/mutations/schema.py +51 -33
  202. infrahub/graphql/mutations/tasks.py +16 -10
  203. infrahub/graphql/parser.py +1 -1
  204. infrahub/graphql/permissions.py +6 -4
  205. infrahub/graphql/queries/account.py +22 -18
  206. infrahub/graphql/queries/branch.py +6 -4
  207. infrahub/graphql/queries/diff/tree.py +48 -42
  208. infrahub/graphql/queries/event.py +112 -0
  209. infrahub/graphql/queries/internal.py +3 -3
  210. infrahub/graphql/queries/ipam.py +23 -18
  211. infrahub/graphql/queries/relationship.py +11 -10
  212. infrahub/graphql/queries/resource_manager.py +43 -27
  213. infrahub/graphql/queries/search.py +9 -8
  214. infrahub/graphql/queries/status.py +12 -9
  215. infrahub/graphql/queries/task.py +11 -9
  216. infrahub/graphql/resolvers/resolver.py +69 -43
  217. infrahub/graphql/resolvers/single_relationship.py +16 -10
  218. infrahub/graphql/schema.py +2 -0
  219. infrahub/graphql/subscription/__init__.py +1 -1
  220. infrahub/graphql/subscription/events.py +1 -1
  221. infrahub/graphql/subscription/graphql_query.py +8 -8
  222. infrahub/graphql/types/branch.py +2 -2
  223. infrahub/graphql/types/common.py +6 -1
  224. infrahub/graphql/types/enums.py +2 -0
  225. infrahub/graphql/types/event.py +100 -0
  226. infrahub/graphql/types/interface.py +2 -2
  227. infrahub/graphql/types/node.py +3 -3
  228. infrahub/graphql/types/permission.py +2 -2
  229. infrahub/graphql/types/relationship.py +3 -3
  230. infrahub/graphql/types/standard_node.py +9 -11
  231. infrahub/graphql/utils.py +28 -182
  232. infrahub/groups/tasks.py +2 -3
  233. infrahub/lock.py +1 -1
  234. infrahub/menu/constants.py +1 -0
  235. infrahub/menu/generator.py +14 -3
  236. infrahub/menu/menu.py +116 -127
  237. infrahub/menu/models.py +4 -4
  238. infrahub/message_bus/messages/__init__.py +0 -4
  239. infrahub/message_bus/messages/event_branch_merge.py +3 -0
  240. infrahub/message_bus/messages/request_proposedchange_pipeline.py +2 -0
  241. infrahub/message_bus/operations/__init__.py +3 -5
  242. infrahub/message_bus/operations/check/__init__.py +2 -2
  243. infrahub/message_bus/operations/check/generator.py +1 -3
  244. infrahub/message_bus/operations/check/repository.py +1 -1
  245. infrahub/message_bus/operations/event/branch.py +7 -3
  246. infrahub/message_bus/operations/event/schema.py +1 -1
  247. infrahub/message_bus/operations/finalize/validator.py +1 -1
  248. infrahub/message_bus/operations/git/file.py +2 -2
  249. infrahub/message_bus/operations/git/repository.py +1 -1
  250. infrahub/message_bus/operations/requests/__init__.py +0 -2
  251. infrahub/message_bus/operations/requests/generator_definition.py +1 -1
  252. infrahub/message_bus/operations/requests/proposed_change.py +26 -11
  253. infrahub/message_bus/operations/requests/repository.py +2 -2
  254. infrahub/message_bus/operations/send/echo.py +1 -1
  255. infrahub/message_bus/types.py +1 -1
  256. infrahub/permissions/__init__.py +2 -1
  257. infrahub/permissions/types.py +26 -0
  258. infrahub/pools/prefix.py +29 -165
  259. infrahub/prefect_server/__init__.py +0 -0
  260. infrahub/prefect_server/app.py +18 -0
  261. infrahub/prefect_server/database.py +20 -0
  262. infrahub/prefect_server/events.py +28 -0
  263. infrahub/prefect_server/models.py +46 -0
  264. infrahub/proposed_change/models.py +15 -1
  265. infrahub/proposed_change/tasks.py +173 -35
  266. infrahub/pytest_plugin.py +4 -4
  267. infrahub/server.py +12 -11
  268. infrahub/services/__init__.py +147 -62
  269. infrahub/services/adapters/cache/__init__.py +7 -5
  270. infrahub/services/adapters/cache/nats.py +40 -22
  271. infrahub/services/adapters/cache/redis.py +0 -4
  272. infrahub/services/adapters/event/__init__.py +10 -18
  273. infrahub/services/adapters/http/__init__.py +0 -5
  274. infrahub/services/adapters/http/httpx.py +22 -15
  275. infrahub/services/adapters/message_bus/__init__.py +23 -6
  276. infrahub/services/adapters/message_bus/local.py +8 -6
  277. infrahub/services/adapters/message_bus/nats.py +12 -6
  278. infrahub/services/adapters/message_bus/rabbitmq.py +22 -9
  279. infrahub/services/adapters/workflow/__init__.py +11 -8
  280. infrahub/services/adapters/workflow/local.py +28 -7
  281. infrahub/services/adapters/workflow/worker.py +23 -7
  282. infrahub/services/component.py +38 -35
  283. infrahub/services/scheduler.py +32 -29
  284. infrahub/storage.py +2 -4
  285. infrahub/task_manager/constants.py +1 -1
  286. infrahub/task_manager/event.py +182 -0
  287. infrahub/task_manager/models.py +125 -1
  288. infrahub/task_manager/task.py +1 -1
  289. infrahub/tasks/artifact.py +14 -16
  290. infrahub/tasks/registry.py +1 -1
  291. infrahub/tasks/telemetry.py +13 -14
  292. infrahub/transformations/tasks.py +3 -5
  293. infrahub/trigger/__init__.py +0 -0
  294. infrahub/trigger/catalogue.py +15 -0
  295. infrahub/trigger/constants.py +9 -0
  296. infrahub/trigger/models.py +69 -0
  297. infrahub/trigger/tasks.py +85 -0
  298. infrahub/types.py +1 -1
  299. infrahub/utils.py +1 -1
  300. infrahub/webhook/constants.py +0 -2
  301. infrahub/webhook/models.py +8 -2
  302. infrahub/webhook/tasks.py +20 -73
  303. infrahub/webhook/triggers.py +20 -0
  304. infrahub/workers/infrahub_async.py +36 -25
  305. infrahub/workers/utils.py +63 -0
  306. infrahub/workflows/catalogue.py +13 -37
  307. infrahub/workflows/initialization.py +6 -8
  308. infrahub/workflows/models.py +3 -5
  309. infrahub/workflows/utils.py +1 -1
  310. infrahub_sdk/ctl/check.py +3 -3
  311. infrahub_sdk/ctl/cli_commands.py +11 -10
  312. infrahub_sdk/ctl/exceptions.py +0 -6
  313. infrahub_sdk/ctl/exporter.py +1 -1
  314. infrahub_sdk/ctl/generator.py +5 -5
  315. infrahub_sdk/ctl/importer.py +3 -2
  316. infrahub_sdk/ctl/menu.py +1 -1
  317. infrahub_sdk/ctl/object.py +1 -1
  318. infrahub_sdk/ctl/repository.py +23 -15
  319. infrahub_sdk/ctl/schema.py +2 -2
  320. infrahub_sdk/ctl/utils.py +4 -3
  321. infrahub_sdk/ctl/validate.py +2 -1
  322. infrahub_sdk/exceptions.py +6 -0
  323. infrahub_sdk/generator.py +3 -0
  324. infrahub_sdk/node.py +2 -2
  325. infrahub_sdk/schema/__init__.py +14 -2
  326. infrahub_sdk/schema/main.py +7 -0
  327. infrahub_sdk/utils.py +11 -1
  328. infrahub_sdk/yaml.py +2 -3
  329. {infrahub_server-1.1.6.dist-info → infrahub_server-1.2.0rc0.dist-info}/METADATA +46 -12
  330. {infrahub_server-1.1.6.dist-info → infrahub_server-1.2.0rc0.dist-info}/RECORD +338 -321
  331. infrahub_testcontainers/container.py +14 -6
  332. infrahub_testcontainers/docker-compose.test.yml +24 -5
  333. infrahub_testcontainers/haproxy.cfg +43 -0
  334. infrahub_testcontainers/helpers.py +85 -1
  335. infrahub/core/branch/constants.py +0 -2
  336. infrahub/graphql/query.py +0 -52
  337. infrahub/message_bus/messages/request_artifactdefinition_check.py +0 -17
  338. infrahub/message_bus/operations/requests/artifact_definition.py +0 -148
  339. infrahub/schema/constants.py +0 -1
  340. infrahub/schema/tasks.py +0 -76
  341. infrahub/services/adapters/database/__init__.py +0 -9
  342. infrahub_sdk/ctl/_file.py +0 -13
  343. /infrahub/{schema → artifacts}/__init__.py +0 -0
  344. {infrahub_server-1.1.6.dist-info → infrahub_server-1.2.0rc0.dist-info}/LICENSE.txt +0 -0
  345. {infrahub_server-1.1.6.dist-info → infrahub_server-1.2.0rc0.dist-info}/WHEEL +0 -0
  346. {infrahub_server-1.1.6.dist-info → infrahub_server-1.2.0rc0.dist-info}/entry_points.txt +0 -0
@@ -61,11 +61,11 @@ class IPPrefixPoolGetResource(Mutation):
61
61
  @classmethod
62
62
  async def mutate(
63
63
  cls,
64
- root: dict, # pylint: disable=unused-argument
64
+ root: dict, # noqa: ARG003
65
65
  info: GraphQLResolveInfo,
66
66
  data: InputObjectType,
67
67
  ) -> Self:
68
- context: GraphqlContext = info.context
68
+ graphql_context: GraphqlContext = info.context
69
69
 
70
70
  member_type = data.get("member_type", None)
71
71
  allowed_member_types = [t.value for t in PrefixMemberType]
@@ -73,15 +73,15 @@ class IPPrefixPoolGetResource(Mutation):
73
73
  raise QueryValidationError(f"Invalid member_type value, allowed values are {allowed_member_types}")
74
74
 
75
75
  obj: CoreIPPrefixPool = await registry.manager.find_object( # type: ignore[assignment]
76
- db=context.db,
76
+ db=graphql_context.db,
77
77
  kind=InfrahubKind.IPPREFIXPOOL,
78
78
  id=data.get("id"),
79
79
  hfid=data.get("hfid"),
80
- branch=context.branch,
80
+ branch=graphql_context.branch,
81
81
  )
82
82
  resource = await obj.get_resource(
83
- db=context.db,
84
- branch=context.branch,
83
+ db=graphql_context.db,
84
+ branch=graphql_context.branch,
85
85
  identifier=data.get("identifier", None),
86
86
  prefixlen=data.get("prefix_length", None),
87
87
  member_type=member_type,
@@ -95,8 +95,8 @@ class IPPrefixPoolGetResource(Mutation):
95
95
  "id": resource.id,
96
96
  "kind": resource.get_kind(),
97
97
  "identifier": data.get("identifier", None),
98
- "display_label": await resource.render_display_label(db=context.db),
99
- "branch": context.branch.name,
98
+ "display_label": await resource.render_display_label(db=graphql_context.db),
99
+ "branch": graphql_context.branch.name,
100
100
  },
101
101
  }
102
102
 
@@ -113,26 +113,26 @@ class IPAddressPoolGetResource(Mutation):
113
113
  @classmethod
114
114
  async def mutate(
115
115
  cls,
116
- root: dict, # pylint: disable=unused-argument
116
+ root: dict, # noqa: ARG003
117
117
  info: GraphQLResolveInfo,
118
118
  data: dict[str, Any],
119
119
  ) -> Self:
120
- context: GraphqlContext = info.context
120
+ graphql_context: GraphqlContext = info.context
121
121
 
122
122
  obj: CoreIPAddressPool = await registry.manager.find_object(
123
- db=context.db,
123
+ db=graphql_context.db,
124
124
  kind=InfrahubKind.IPADDRESSPOOL,
125
125
  id=data.get("id"),
126
126
  hfid=data.get("hfid"),
127
- branch=context.branch,
127
+ branch=graphql_context.branch,
128
128
  )
129
129
  resource = await obj.get_resource(
130
- db=context.db,
131
- branch=context.branch,
132
- identifier=data.get("identifier", None),
133
- prefixlen=data.get("prefix_length", None),
134
- address_type=data.get("address_type", None),
135
- data=data.get("data", None),
130
+ db=graphql_context.db,
131
+ branch=graphql_context.branch,
132
+ identifier=data.get("identifier"),
133
+ prefixlen=data.get("prefix_length"),
134
+ address_type=data.get("address_type"),
135
+ data=data.get("data"),
136
136
  )
137
137
 
138
138
  result = {
@@ -140,9 +140,9 @@ class IPAddressPoolGetResource(Mutation):
140
140
  "node": {
141
141
  "id": resource.id,
142
142
  "kind": resource.get_kind(),
143
- "identifier": data.get("identifier", None),
144
- "display_label": await resource.render_display_label(db=context.db),
145
- "branch": context.branch.name,
143
+ "identifier": data.get("identifier"),
144
+ "display_label": await resource.render_display_label(db=graphql_context.db),
145
+ "branch": graphql_context.branch.name,
146
146
  },
147
147
  }
148
148
 
@@ -151,7 +151,7 @@ class IPAddressPoolGetResource(Mutation):
151
151
 
152
152
  class InfrahubNumberPoolMutation(InfrahubMutationMixin, Mutation):
153
153
  @classmethod
154
- def __init_subclass_with_meta__( # pylint: disable=arguments-differ
154
+ def __init_subclass_with_meta__(
155
155
  cls,
156
156
  schema: NodeSchema | None = None,
157
157
  _meta: InfrahubMutationOptions | None = None,
@@ -174,7 +174,7 @@ class InfrahubNumberPoolMutation(InfrahubMutationMixin, Mutation):
174
174
  info: GraphQLResolveInfo,
175
175
  data: InputObjectType,
176
176
  branch: Branch,
177
- database: InfrahubDatabase | None = None,
177
+ database: InfrahubDatabase | None = None, # noqa: ARG003
178
178
  ) -> Any:
179
179
  try:
180
180
  pool_node = registry.get_node_schema(name=data["node"].value)
@@ -204,16 +204,16 @@ class InfrahubNumberPoolMutation(InfrahubMutationMixin, Mutation):
204
204
  info: GraphQLResolveInfo,
205
205
  data: InputObjectType,
206
206
  branch: Branch,
207
- database: InfrahubDatabase | None = None,
207
+ database: InfrahubDatabase | None = None, # noqa: ARG003
208
208
  node: Node | None = None,
209
209
  ) -> tuple[Node, Self]:
210
210
  if (data.get("node") and data.get("node").value) or (
211
211
  data.get("node_attribute") and data.get("node_attribute").value
212
212
  ):
213
213
  raise ValidationError(input_value="The fields 'node' or 'node_attribute' can't be changed.")
214
- context: GraphqlContext = info.context
214
+ graphql_context: GraphqlContext = info.context
215
215
 
216
- async with context.db.start_transaction() as dbt:
216
+ async with graphql_context.db.start_transaction() as dbt:
217
217
  number_pool, result = await super().mutate_update(
218
218
  info=info, data=data, branch=branch, database=dbt, node=node
219
219
  )
@@ -21,6 +21,7 @@ from ..types import DropdownFields
21
21
  if TYPE_CHECKING:
22
22
  from graphql import GraphQLResolveInfo
23
23
 
24
+ from infrahub.context import InfrahubContext
24
25
  from infrahub.core.branch import Branch
25
26
  from infrahub.services import InfrahubServices
26
27
 
@@ -58,13 +59,13 @@ class SchemaDropdownAdd(Mutation):
58
59
  @retry_db_transaction(name="schema_dropdown_add")
59
60
  async def mutate(
60
61
  cls,
61
- root: dict, # pylint: disable=unused-argument
62
+ root: dict, # noqa: ARG003
62
63
  info: GraphQLResolveInfo,
63
64
  data: SchemaDropdownAddInput,
64
65
  ) -> Self:
65
- context: GraphqlContext = info.context
66
+ graphql_context: GraphqlContext = info.context
66
67
 
67
- kind = context.db.schema.get(name=str(data.kind), branch=context.branch.name)
68
+ kind = graphql_context.db.schema.get(name=str(data.kind), branch=graphql_context.branch.name)
68
69
  attribute = str(data.attribute)
69
70
  validate_kind_dropdown(kind=kind, attribute=attribute)
70
71
  dropdown = str(data.dropdown)
@@ -80,13 +81,14 @@ class SchemaDropdownAdd(Mutation):
80
81
 
81
82
  await update_registry(
82
83
  kind=kind,
83
- branch=context.branch,
84
- db=context.db,
85
- account_id=context.active_account_session.account_id,
86
- service=context.active_service,
84
+ branch=graphql_context.branch,
85
+ db=graphql_context.db,
86
+ account_id=graphql_context.active_account_session.account_id,
87
+ service=graphql_context.active_service,
88
+ context=graphql_context.get_context(),
87
89
  )
88
90
 
89
- kind = context.db.schema.get(name=str(data.kind), branch=context.branch.name)
91
+ kind = graphql_context.db.schema.get(name=str(data.kind), branch=graphql_context.branch.name)
90
92
  attrib = kind.get_attribute(attribute)
91
93
  dropdown_entry = {}
92
94
  success = False
@@ -114,19 +116,22 @@ class SchemaDropdownRemove(Mutation):
114
116
  @retry_db_transaction(name="schema_dropdown_remove")
115
117
  async def mutate(
116
118
  cls,
117
- root: dict, # pylint: disable=unused-argument
119
+ root: dict, # noqa: ARG003
118
120
  info: GraphQLResolveInfo,
119
121
  data: SchemaDropdownRemoveInput,
120
122
  ) -> dict[str, bool]:
121
- context: GraphqlContext = info.context
123
+ graphql_context: GraphqlContext = info.context
122
124
 
123
- kind = context.db.schema.get(name=str(data.kind), branch=context.branch.name)
125
+ kind = graphql_context.db.schema.get(name=str(data.kind), branch=graphql_context.branch.name)
124
126
 
125
127
  attribute = str(data.attribute)
126
128
  validate_kind_dropdown(kind=kind, attribute=attribute)
127
129
  dropdown = str(data.dropdown)
128
130
  nodes_with_dropdown = await NodeManager.query(
129
- db=context.db, schema=kind.kind, filters={f"{attribute}__value": dropdown}, branch=context.branch
131
+ db=graphql_context.db,
132
+ schema=kind.kind,
133
+ filters={f"{attribute}__value": dropdown},
134
+ branch=graphql_context.branch,
130
135
  )
131
136
  if nodes_with_dropdown:
132
137
  raise ValidationError(f"There are still {kind.kind} objects using this dropdown")
@@ -143,10 +148,11 @@ class SchemaDropdownRemove(Mutation):
143
148
 
144
149
  await update_registry(
145
150
  kind=kind,
146
- branch=context.branch,
147
- db=context.db,
148
- account_id=context.active_account_session.account_id,
149
- service=context.active_service,
151
+ branch=graphql_context.branch,
152
+ db=graphql_context.db,
153
+ account_id=graphql_context.active_account_session.account_id,
154
+ service=graphql_context.active_service,
155
+ context=graphql_context.get_context(),
150
156
  )
151
157
 
152
158
  return {"ok": True}
@@ -162,13 +168,13 @@ class SchemaEnumAdd(Mutation):
162
168
  @retry_db_transaction(name="schema_dropdown_add")
163
169
  async def mutate(
164
170
  cls,
165
- root: dict, # pylint: disable=unused-argument
171
+ root: dict, # noqa: ARG003
166
172
  info: GraphQLResolveInfo,
167
173
  data: SchemaEnumInput,
168
174
  ) -> dict[str, bool]:
169
- context: GraphqlContext = info.context
175
+ graphql_context: GraphqlContext = info.context
170
176
 
171
- kind = context.db.schema.get(name=str(data.kind), branch=context.branch.name)
177
+ kind = graphql_context.db.schema.get(name=str(data.kind), branch=graphql_context.branch.name)
172
178
 
173
179
  attribute = str(data.attribute)
174
180
  enum = str(data.enum)
@@ -184,10 +190,11 @@ class SchemaEnumAdd(Mutation):
184
190
 
185
191
  await update_registry(
186
192
  kind=kind,
187
- branch=context.branch,
188
- db=context.db,
189
- account_id=context.active_account_session.account_id,
190
- service=context.active_service,
193
+ branch=graphql_context.branch,
194
+ db=graphql_context.db,
195
+ account_id=graphql_context.active_account_session.account_id,
196
+ service=graphql_context.active_service,
197
+ context=graphql_context.get_context(),
191
198
  )
192
199
 
193
200
  return {"ok": True}
@@ -203,19 +210,22 @@ class SchemaEnumRemove(Mutation):
203
210
  @retry_db_transaction(name="schema_enum_remove")
204
211
  async def mutate(
205
212
  cls,
206
- root: dict, # pylint: disable=unused-argument
213
+ root: dict, # noqa: ARG003
207
214
  info: GraphQLResolveInfo,
208
215
  data: SchemaEnumInput,
209
216
  ) -> dict[str, bool]:
210
- context: GraphqlContext = info.context
217
+ graphql_context: GraphqlContext = info.context
211
218
 
212
- kind = context.db.schema.get(name=str(data.kind), branch=context.branch.name)
219
+ kind = graphql_context.db.schema.get(name=str(data.kind), branch=graphql_context.branch.name)
213
220
 
214
221
  attribute = str(data.attribute)
215
222
  enum = str(data.enum)
216
223
  validate_kind_enum(kind=kind, attribute=attribute)
217
224
  nodes_with_enum = await NodeManager.query(
218
- db=context.db, schema=kind.kind, filters={f"{attribute}__value": enum}, branch=context.branch
225
+ db=graphql_context.db,
226
+ schema=kind.kind,
227
+ filters={f"{attribute}__value": enum},
228
+ branch=graphql_context.branch,
219
229
  )
220
230
  if nodes_with_enum:
221
231
  raise ValidationError(f"There are still {kind.kind} objects using this enum")
@@ -232,10 +242,11 @@ class SchemaEnumRemove(Mutation):
232
242
 
233
243
  await update_registry(
234
244
  kind=kind,
235
- branch=context.branch,
236
- db=context.db,
237
- account_id=context.active_account_session.account_id,
238
- service=context.active_service,
245
+ branch=graphql_context.branch,
246
+ db=graphql_context.db,
247
+ account_id=graphql_context.active_account_session.account_id,
248
+ service=graphql_context.active_service,
249
+ context=graphql_context.get_context(),
239
250
  )
240
251
 
241
252
  return {"ok": True}
@@ -268,7 +279,12 @@ def validate_kind(kind: Union[GenericSchema, NodeSchema], attribute: str) -> Non
268
279
 
269
280
 
270
281
  async def update_registry(
271
- kind: NodeSchema, db: InfrahubDatabase, branch: Branch, account_id: str, service: InfrahubServices
282
+ kind: NodeSchema,
283
+ db: InfrahubDatabase,
284
+ branch: Branch,
285
+ account_id: str,
286
+ service: InfrahubServices,
287
+ context: InfrahubContext,
272
288
  ) -> None:
273
289
  async with lock.registry.global_schema_lock():
274
290
  branch_schema = registry.schema.get_schema_branch(name=branch.name)
@@ -296,12 +312,14 @@ async def update_registry(
296
312
  log_data = get_log_data()
297
313
  request_id = log_data.get("request_id", "")
298
314
  event = SchemaUpdatedEvent(
299
- branch=branch.name,
315
+ branch_name=branch.name,
300
316
  schema_hash=branch.active_schema_hash.main,
301
317
  meta=EventMeta(
302
318
  initiator_id=WORKER_IDENTITY,
303
319
  request_id=request_id,
304
320
  account_id=account_id,
321
+ branch=branch,
322
+ context=context,
305
323
  ),
306
324
  )
307
325
  await service.event.send(event=event)
@@ -2,6 +2,7 @@ from __future__ import annotations
2
2
 
3
3
  from prefect import flow
4
4
 
5
+ from infrahub.context import InfrahubContext # noqa: TC001 needed for prefect flow
5
6
  from infrahub.core import registry
6
7
  from infrahub.core.branch import Branch
7
8
  from infrahub.core.diff.coordinator import DiffCoordinator
@@ -13,15 +14,14 @@ from infrahub.core.validators.models.validate_migration import SchemaValidateMig
13
14
  from infrahub.core.validators.tasks import schema_validate_migrations
14
15
  from infrahub.dependencies.registry import get_component_registry
15
16
  from infrahub.exceptions import ValidationError
16
- from infrahub.services import services
17
+ from infrahub.services import InfrahubServices # noqa: TC001 needed for prefect flow
17
18
  from infrahub.workflows.catalogue import BRANCH_MERGE
18
- from infrahub.workflows.utils import add_branch_tag
19
+ from infrahub.workflows.utils import add_tags
19
20
 
20
21
 
21
22
  @flow(name="merge-branch-mutation", flow_run_name="Merge branch graphQL mutation")
22
- async def merge_branch_mutation(branch: str) -> None:
23
- service = services.service
24
- await add_branch_tag(branch_name=branch)
23
+ async def merge_branch_mutation(branch: str, context: InfrahubContext, service: InfrahubServices) -> None:
24
+ await add_tags(branches=[branch])
25
25
 
26
26
  async with service.database.start_session() as db:
27
27
  obj = await Branch.get_by_name(db=db, name=branch)
@@ -31,14 +31,17 @@ async def merge_branch_mutation(branch: str) -> None:
31
31
  diff_coordinator = await component_registry.get_component(DiffCoordinator, db=db, branch=obj)
32
32
  diff_repository = await component_registry.get_component(DiffRepository, db=db, branch=obj)
33
33
  diff_merger = await component_registry.get_component(DiffMerger, db=db, branch=obj)
34
- enriched_diff = await diff_coordinator.update_branch_diff_and_return(base_branch=base_branch, diff_branch=obj)
35
- if enriched_diff.get_all_conflicts():
34
+ enriched_diff_metadata = await diff_coordinator.update_branch_diff(base_branch=base_branch, diff_branch=obj)
35
+ async for _ in diff_repository.get_all_conflicts_for_diff(
36
+ diff_branch_name=enriched_diff_metadata.diff_branch_name, diff_id=enriched_diff_metadata.uuid
37
+ ):
38
+ # if there are any conflicts, raise the error
36
39
  raise ValidationError(
37
40
  f"Branch {obj.name} contains conflicts with the default branch."
38
41
  " Please create a Proposed Change to resolve the conflicts or manually update them before merging."
39
42
  )
40
43
  node_diff_field_summaries = await diff_repository.get_node_field_summaries(
41
- diff_branch_name=enriched_diff.diff_branch_name, diff_id=enriched_diff.uuid
44
+ diff_branch_name=enriched_diff_metadata.diff_branch_name, diff_id=enriched_diff_metadata.uuid
42
45
  )
43
46
 
44
47
  merger = BranchMerger(
@@ -57,10 +60,13 @@ async def merge_branch_mutation(branch: str) -> None:
57
60
 
58
61
  if constraints:
59
62
  responses = await schema_validate_migrations(
60
- message=SchemaValidateMigrationData(branch=obj, schema_branch=candidate_schema, constraints=constraints)
63
+ message=SchemaValidateMigrationData(
64
+ branch=obj, schema_branch=candidate_schema, constraints=constraints
65
+ ),
66
+ service=service,
61
67
  )
62
68
  error_messages = [violation.message for response in responses for violation in response.violations]
63
69
  if error_messages:
64
70
  raise ValidationError(",\n".join(error_messages))
65
71
 
66
- await service.workflow.execute_workflow(workflow=BRANCH_MERGE, parameters={"branch": obj.name})
72
+ await service.workflow.execute_workflow(workflow=BRANCH_MERGE, context=context, parameters={"branch": obj.name})
@@ -162,7 +162,7 @@ class GraphQLExtractor:
162
162
  FieldNode(
163
163
  kind="field",
164
164
  name=NameNode(kind="name", value=sub_node.key),
165
- selection_set=SelectionSetNode(selections=tuple([sub_node.node])),
165
+ selection_set=SelectionSetNode(selections=(sub_node.node,)),
166
166
  )
167
167
  )
168
168
  selection_set.selections = tuple(selections)
@@ -11,23 +11,25 @@ if TYPE_CHECKING:
11
11
  from infrahub.graphql.initialization import GraphqlContext
12
12
 
13
13
 
14
- async def get_permissions(schema: MainSchemaTypes, context: GraphqlContext) -> dict[str, Any]:
14
+ async def get_permissions(schema: MainSchemaTypes, graphql_context: GraphqlContext) -> dict[str, Any]:
15
15
  schema_objects = [schema]
16
16
  if isinstance(schema, GenericSchema):
17
17
  for node_name in schema.used_by:
18
18
  schema_object: MainSchemaTypes
19
19
  try:
20
- schema_object = registry.schema.get_node_schema(name=node_name, branch=context.branch, duplicate=False)
20
+ schema_object = registry.schema.get_node_schema(
21
+ name=node_name, branch=graphql_context.branch, duplicate=False
22
+ )
21
23
  except ValueError:
22
24
  schema_object = registry.schema.get_profile_schema(
23
- name=node_name, branch=context.branch, duplicate=False
25
+ name=node_name, branch=graphql_context.branch, duplicate=False
24
26
  )
25
27
  schema_objects.append(schema_object)
26
28
 
27
29
  response: dict[str, Any] = {"count": len(schema_objects), "edges": []}
28
30
 
29
31
  nodes = await report_schema_permissions(
30
- branch=context.branch, permission_manager=context.active_permissions, schemas=schema_objects
32
+ branch=graphql_context.branch, permission_manager=graphql_context.active_permissions, schemas=schema_objects
31
33
  )
32
34
  response["edges"] = [{"node": node} for node in nodes]
33
35
 
@@ -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
 
8
8
  from infrahub.core.manager import NodeManager
@@ -27,32 +27,32 @@ class AccountTokenEdge(ObjectType):
27
27
 
28
28
  class AccountTokenEdges(ObjectType):
29
29
  count = Field(Int, required=True)
30
- edges = Field(List(of_type=AccountTokenEdge, required=True), required=True)
30
+ edges = Field(List(of_type=NonNull(AccountTokenEdge), required=True), required=True)
31
31
 
32
32
 
33
33
  async def resolve_account_tokens(
34
- root: dict, # pylint: disable=unused-argument
34
+ root: dict, # noqa: ARG001
35
35
  info: GraphQLResolveInfo,
36
36
  limit: int = 10,
37
37
  offset: int = 0,
38
38
  ) -> dict:
39
- context: GraphqlContext = info.context
39
+ graphql_context: GraphqlContext = info.context
40
40
 
41
- if not context.account_session:
41
+ if not graphql_context.account_session:
42
42
  raise ValueError("An account_session is mandatory to execute this query")
43
43
 
44
- if not context.account_session.authenticated_by_jwt:
44
+ if not graphql_context.account_session.authenticated_by_jwt:
45
45
  raise PermissionDeniedError("This operation requires authentication with a JWT token")
46
46
 
47
47
  fields = await extract_fields_first_node(info)
48
48
 
49
- filters = {"account__ids": [context.account_session.account_id]}
49
+ filters = {"account__ids": [graphql_context.account_session.account_id]}
50
50
  response: dict[str, Any] = {}
51
51
  if "count" in fields:
52
- response["count"] = await NodeManager.count(db=context.db, schema=InternalAccountToken, filters=filters)
52
+ response["count"] = await NodeManager.count(db=graphql_context.db, schema=InternalAccountToken, filters=filters)
53
53
  if "edges" in fields:
54
54
  objs = await NodeManager.query(
55
- db=context.db, schema=InternalAccountToken, filters=filters, limit=limit, offset=offset
55
+ db=graphql_context.db, schema=InternalAccountToken, filters=filters, limit=limit, offset=offset
56
56
  )
57
57
  response["edges"] = [
58
58
  {"node": {"id": obj.id, "name": obj.name.value, "expiration": obj.expiration.value}} for obj in objs
@@ -62,7 +62,11 @@ async def resolve_account_tokens(
62
62
 
63
63
 
64
64
  AccountToken = Field(
65
- AccountTokenEdges, resolver=resolve_account_tokens, limit=Int(required=False), offset=Int(required=False)
65
+ AccountTokenEdges,
66
+ limit=Int(required=False),
67
+ offset=Int(required=False),
68
+ resolver=resolve_account_tokens,
69
+ required=True,
66
70
  )
67
71
 
68
72
 
@@ -95,12 +99,12 @@ class AccountObjectPermissionEdge(ObjectType):
95
99
 
96
100
  class AccountGlobalPermissionEdges(ObjectType):
97
101
  count = Field(Int, required=True)
98
- edges = Field(List(of_type=AccountGlobalPermissionEdge, required=True), required=True)
102
+ edges = Field(List(of_type=NonNull(AccountGlobalPermissionEdge), required=True), required=True)
99
103
 
100
104
 
101
105
  class AccountObjectPermissionEdges(ObjectType):
102
106
  count = Field(Int, required=True)
103
- edges = Field(List(of_type=AccountObjectPermissionEdge, required=True), required=True)
107
+ edges = Field(List(of_type=NonNull(AccountObjectPermissionEdge), required=True), required=True)
104
108
 
105
109
 
106
110
  class AccountPermissionsEdges(ObjectType):
@@ -109,19 +113,19 @@ class AccountPermissionsEdges(ObjectType):
109
113
 
110
114
 
111
115
  async def resolve_account_permissions(
112
- root: dict, # pylint: disable=unused-argument
116
+ root: dict, # noqa: ARG001
113
117
  info: GraphQLResolveInfo,
114
118
  ) -> dict:
115
- context: GraphqlContext = info.context
119
+ graphql_context: GraphqlContext = info.context
116
120
 
117
- if not context.account_session:
121
+ if not graphql_context.account_session:
118
122
  raise ValueError("An account_session is mandatory to execute this query")
119
123
 
120
124
  fields = await extract_fields_first_node(info)
121
125
 
122
126
  response: dict[str, dict[str, Any]] = {}
123
127
  if "global_permissions" in fields:
124
- global_list = context.active_permissions.permissions["global_permissions"]
128
+ global_list = graphql_context.active_permissions.permissions["global_permissions"]
125
129
  response["global_permissions"] = {"count": len(global_list)}
126
130
  response["global_permissions"]["edges"] = [
127
131
  {
@@ -136,7 +140,7 @@ async def resolve_account_permissions(
136
140
  for obj in global_list
137
141
  ]
138
142
  if "object_permissions" in fields:
139
- object_list = context.active_permissions.permissions["object_permissions"]
143
+ object_list = graphql_context.active_permissions.permissions["object_permissions"]
140
144
  response["object_permissions"] = {"count": len(object_list)}
141
145
  response["object_permissions"]["edges"] = [
142
146
  {
@@ -155,4 +159,4 @@ async def resolve_account_permissions(
155
159
  return response
156
160
 
157
161
 
158
- AccountPermissions = Field(AccountPermissionsEdges, resolver=resolve_account_permissions)
162
+ AccountPermissions = Field(AccountPermissionsEdges, resolver=resolve_account_permissions, required=True)
@@ -2,7 +2,7 @@ from __future__ import annotations
2
2
 
3
3
  from typing import TYPE_CHECKING, Any
4
4
 
5
- from graphene import ID, Field, List, String
5
+ from graphene import ID, Field, List, NonNull, String
6
6
  from infrahub_sdk.utils import extract_fields_first_node
7
7
 
8
8
  from infrahub.graphql.types import BranchType
@@ -12,17 +12,19 @@ if TYPE_CHECKING:
12
12
 
13
13
 
14
14
  async def branch_resolver(
15
- root: dict, # pylint: disable=unused-argument
15
+ root: dict, # noqa: ARG001
16
16
  info: GraphQLResolveInfo,
17
17
  **kwargs: Any,
18
18
  ) -> list[dict[str, Any]]:
19
19
  fields = await extract_fields_first_node(info)
20
- return await BranchType.get_list(context=info.context, fields=fields, **kwargs)
20
+ return await BranchType.get_list(graphql_context=info.context, fields=fields, **kwargs)
21
21
 
22
22
 
23
23
  BranchQueryList = Field(
24
- List(BranchType),
24
+ List(of_type=NonNull(BranchType)),
25
25
  ids=List(ID),
26
26
  name=String(),
27
+ description="Retrieve information about active branches.",
27
28
  resolver=branch_resolver,
29
+ required=True,
28
30
  )