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
@@ -7,7 +7,7 @@ import graphene
7
7
 
8
8
  from infrahub import config
9
9
  from infrahub.core.attribute import String
10
- from infrahub.core.constants import InfrahubKind, RelationshipKind
10
+ from infrahub.core.constants import InfrahubKind, RelationshipCardinality, RelationshipKind
11
11
  from infrahub.core.schema import (
12
12
  AttributeSchema,
13
13
  GenericSchema,
@@ -15,6 +15,7 @@ from infrahub.core.schema import (
15
15
  NodeSchema,
16
16
  ProfileSchema,
17
17
  RelationshipSchema,
18
+ TemplateSchema,
18
19
  )
19
20
  from infrahub.core.timestamp import Timestamp
20
21
  from infrahub.graphql.mutations.attribute import BaseAttributeCreate, BaseAttributeUpdate
@@ -59,6 +60,7 @@ from .types import (
59
60
  )
60
61
  from .types.attribute import BaseAttribute as BaseAttributeType
61
62
  from .types.attribute import TextAttributeType
63
+ from .types.event import EVENT_TYPES
62
64
 
63
65
  if TYPE_CHECKING:
64
66
  from graphql import GraphQLSchema
@@ -66,8 +68,6 @@ if TYPE_CHECKING:
66
68
  from infrahub.core.branch import Branch
67
69
  from infrahub.core.schema.schema_branch import SchemaBranch
68
70
 
69
- # pylint: disable=redefined-builtin,c-extension-no-member,too-many-lines,too-many-public-methods
70
-
71
71
 
72
72
  class DeleteInput(graphene.InputObjectType):
73
73
  id = graphene.String(required=False)
@@ -105,7 +105,7 @@ class BranchDetails:
105
105
  gql_manager: GraphQLSchemaManager
106
106
 
107
107
 
108
- class GraphQLSchemaManager: # pylint: disable=too-many-public-methods
108
+ class GraphQLSchemaManager:
109
109
  _extra_types: dict[str, GraphQLTypes] = {}
110
110
  _branch_details_by_name: dict[str, BranchDetails] = {}
111
111
 
@@ -161,6 +161,7 @@ class GraphQLSchemaManager: # pylint: disable=too-many-public-methods
161
161
  self._graphql_types: dict[str, GraphQLTypes] = {}
162
162
 
163
163
  self._load_attribute_types()
164
+ self._load_event_types()
164
165
  if config.SETTINGS.experimental_features.graphql_enums:
165
166
  self._load_all_enum_types(node_schemas=self.schema.get_all().values())
166
167
  self._load_node_interface()
@@ -251,7 +252,7 @@ class GraphQLSchemaManager: # pylint: disable=too-many-public-methods
251
252
 
252
253
  def get_type(self, name: str) -> type[InfrahubObject]:
253
254
  if name in self._graphql_types and issubclass(
254
- self._graphql_types[name], (BaseAttributeType, graphene.Interface, graphene.ObjectType)
255
+ self._graphql_types[name], BaseAttributeType | graphene.Interface | graphene.ObjectType
255
256
  ):
256
257
  return self._graphql_types[name]
257
258
  raise ValueError(f"Unable to find {name!r}")
@@ -273,6 +274,10 @@ class GraphQLSchemaManager: # pylint: disable=too-many-public-methods
273
274
  for data_type in ATTRIBUTE_TYPES.values():
274
275
  self.set_type(name=data_type.get_graphql_type_name(), graphql_type=data_type.get_graphql_type())
275
276
 
277
+ def _load_event_types(self) -> None:
278
+ for event in EVENT_TYPES.values():
279
+ self.set_type(name=event._meta.name, graphql_type=event)
280
+
276
281
  def _load_node_interface(self) -> None:
277
282
  node_interface_schema = GenericSchema(
278
283
  name="Node", namespace="Core", description="Interface for all nodes in Infrahub"
@@ -339,13 +344,13 @@ class GraphQLSchemaManager: # pylint: disable=too-many-public-methods
339
344
 
340
345
  return RelatedNodeInput
341
346
 
342
- def generate_object_types(self) -> None: # pylint: disable=too-many-branches,too-many-statements
347
+ def generate_object_types(self) -> None:
343
348
  """Generate all GraphQL objects for the schema and store them in the internal registry."""
344
349
 
345
350
  full_schema = self.schema.get_all(duplicate=False)
346
351
 
347
352
  # Generate all GraphQL Interface Object first and store them in the registry
348
- for node_name, node_schema in full_schema.items():
353
+ for node_schema in full_schema.values():
349
354
  if not isinstance(node_schema, GenericSchema):
350
355
  continue
351
356
  interface = self.generate_interface_object(schema=node_schema, populate_cache=True)
@@ -385,8 +390,8 @@ class GraphQLSchemaManager: # pylint: disable=too-many-public-methods
385
390
  self.set_type(name=nested_edged_interface._meta.name, graphql_type=nested_edged_interface)
386
391
 
387
392
  # Generate all GraphQL ObjectType, Nested, Paginated & NestedPaginated and store them in the registry
388
- for node_name, node_schema in full_schema.items():
389
- if isinstance(node_schema, (NodeSchema, ProfileSchema)):
393
+ for node_schema in full_schema.values():
394
+ if isinstance(node_schema, NodeSchema | ProfileSchema | TemplateSchema):
390
395
  node_type = self.generate_graphql_object(schema=node_schema, populate_cache=True)
391
396
  node_type_edged = self.generate_graphql_edged_object(
392
397
  schema=node_schema, node=node_type, populate_cache=True
@@ -417,11 +422,13 @@ class GraphQLSchemaManager: # pylint: disable=too-many-public-methods
417
422
  continue
418
423
  peer_filters = self.generate_filters(schema=peer_schema, top_level=False)
419
424
 
420
- if rel.cardinality == "one":
425
+ if rel.cardinality == RelationshipCardinality.ONE:
421
426
  peer_type = self.get_type(name=f"NestedEdged{peer_schema.kind}")
422
- node_type._meta.fields[rel.name] = graphene.Field(peer_type, resolver=single_relationship_resolver)
427
+ node_type._meta.fields[rel.name] = graphene.Field(
428
+ peer_type, resolver=single_relationship_resolver, required=True
429
+ )
423
430
 
424
- elif rel.cardinality == "many":
431
+ elif rel.cardinality == RelationshipCardinality.MANY:
425
432
  peer_type = self.get_type(name=f"NestedPaginated{peer_schema.kind}")
426
433
 
427
434
  if (isinstance(node_schema, NodeSchema) and node_schema.hierarchy) or (
@@ -430,7 +437,7 @@ class GraphQLSchemaManager: # pylint: disable=too-many-public-methods
430
437
  peer_filters["include_descendants"] = graphene.Boolean()
431
438
 
432
439
  node_type._meta.fields[rel.name] = graphene.Field(
433
- peer_type, required=False, resolver=many_relationship_resolver, **peer_filters
440
+ peer_type, required=True, resolver=many_relationship_resolver, **peer_filters
434
441
  )
435
442
 
436
443
  if (isinstance(node_schema, NodeSchema) and node_schema.hierarchy) or (
@@ -448,16 +455,16 @@ class GraphQLSchemaManager: # pylint: disable=too-many-public-methods
448
455
  peer_type_edge = self.get_type(name=f"NestedEdged{hierarchy_name}")
449
456
 
450
457
  node_type._meta.fields["parent"] = graphene.Field(
451
- peer_type_edge, required=False, resolver=single_relationship_resolver
458
+ peer_type_edge, required=True, resolver=single_relationship_resolver
452
459
  )
453
460
  node_type._meta.fields["children"] = graphene.Field(
454
- peer_type, required=False, resolver=many_relationship_resolver, **peer_filters
461
+ peer_type, required=True, resolver=many_relationship_resolver, **peer_filters
455
462
  )
456
463
  node_type._meta.fields["ancestors"] = graphene.Field(
457
- peer_type, required=False, resolver=ancestors_resolver, **peer_filters
464
+ peer_type, required=True, resolver=ancestors_resolver, **peer_filters
458
465
  )
459
466
  node_type._meta.fields["descendants"] = graphene.Field(
460
- peer_type, required=False, resolver=descendants_resolver, **peer_filters
467
+ peer_type, required=True, resolver=descendants_resolver, **peer_filters
461
468
  )
462
469
 
463
470
  def generate_query_mixin(self) -> type[object]:
@@ -478,6 +485,7 @@ class GraphQLSchemaManager: # pylint: disable=too-many-public-methods
478
485
  class_attrs[node_schema.kind] = graphene.Field(
479
486
  node_type,
480
487
  resolver=default_paginated_list_resolver,
488
+ required=True,
481
489
  **node_filters,
482
490
  )
483
491
  if node_name == InfrahubKind.GENERICACCOUNT:
@@ -513,7 +521,7 @@ class GraphQLSchemaManager: # pylint: disable=too-many-public-methods
513
521
  else:
514
522
  base_class = mutation_map.get(node_schema.kind, InfrahubMutation)
515
523
 
516
- if isinstance(node_schema, (NodeSchema, ProfileSchema)):
524
+ if isinstance(node_schema, NodeSchema | ProfileSchema | TemplateSchema):
517
525
  mutations = self.generate_graphql_mutations(schema=node_schema, base_class=base_class)
518
526
 
519
527
  class_attrs[f"{node_schema.kind}Create"] = mutations.create.Field()
@@ -539,7 +547,7 @@ class GraphQLSchemaManager: # pylint: disable=too-many-public-methods
539
547
 
540
548
  interfaces: set[type[InfrahubObject]] = set()
541
549
 
542
- if isinstance(schema, (NodeSchema, ProfileSchema)) and schema.inherit_from:
550
+ if isinstance(schema, NodeSchema | ProfileSchema | TemplateSchema) and schema.inherit_from:
543
551
  for generic_name in schema.inherit_from:
544
552
  generic = self.get_type(name=generic_name)
545
553
  interfaces.add(generic)
@@ -559,7 +567,9 @@ class GraphQLSchemaManager: # pylint: disable=too-many-public-methods
559
567
  main_attrs = {
560
568
  "id": graphene.Field(graphene.String, required=True, description="Unique identifier"),
561
569
  "hfid": graphene.Field(
562
- graphene.List(of_type=graphene.String), required=False, description="Human friendly identifier"
570
+ graphene.List(of_type=graphene.NonNull(graphene.String)),
571
+ required=False,
572
+ description="Human friendly identifier",
563
573
  ),
564
574
  "_updated_at": graphene.DateTime(required=False),
565
575
  "display_label": graphene.String(required=False),
@@ -569,7 +579,8 @@ class GraphQLSchemaManager: # pylint: disable=too-many-public-methods
569
579
  for attr in schema.local_attributes:
570
580
  attr_kind = get_attr_kind(schema, attr)
571
581
  attr_type = self.get_type(name=get_attribute_type(kind=attr_kind).get_graphql_type_name())
572
- main_attrs[attr.name] = graphene.Field(attr_type, required=not attr.optional, description=attr.description)
582
+ req = "" if attr.optional else " (required)"
583
+ main_attrs[attr.name] = graphene.Field(attr_type, description=f"{attr.description}{req}")
573
584
 
574
585
  graphql_object = type(schema.kind, (InfrahubObject,), main_attrs)
575
586
 
@@ -589,7 +600,9 @@ class GraphQLSchemaManager: # pylint: disable=too-many-public-methods
589
600
  main_attrs = {
590
601
  "id": graphene.Field(graphene.String, required=False, description="Unique identifier"),
591
602
  "hfid": graphene.Field(
592
- graphene.List(of_type=graphene.String), required=False, description="Human friendly identifier"
603
+ graphene.List(of_type=graphene.NonNull(graphene.String)),
604
+ required=False,
605
+ description="Human friendly identifier",
593
606
  ),
594
607
  "display_label": graphene.String(required=False),
595
608
  "Meta": type("Meta", (object,), meta_attrs),
@@ -598,7 +611,7 @@ class GraphQLSchemaManager: # pylint: disable=too-many-public-methods
598
611
  for attr in schema.attributes:
599
612
  attr_kind = get_attr_kind(node_schema=schema, attr_schema=attr)
600
613
  attr_type = self.get_type(name=get_attribute_type(kind=attr_kind).get_graphql_type_name())
601
- main_attrs[attr.name] = graphene.Field(attr_type, required=not attr.optional, description=attr.description)
614
+ main_attrs[attr.name] = graphene.Field(attr_type, description=attr.description)
602
615
 
603
616
  interface_object = type(schema.kind, (InfrahubInterface,), main_attrs)
604
617
 
@@ -629,7 +642,7 @@ class GraphQLSchemaManager: # pylint: disable=too-many-public-methods
629
642
  self.set_type(name=type_name, graphql_type=relationship_property)
630
643
 
631
644
  def generate_graphql_mutations(
632
- self, schema: Union[NodeSchema, ProfileSchema], base_class: type[InfrahubMutation]
645
+ self, schema: NodeSchema | ProfileSchema | TemplateSchema, base_class: type[InfrahubMutation]
633
646
  ) -> GraphqlMutations:
634
647
  graphql_mutation_create_input = self.generate_graphql_mutation_create_input(schema)
635
648
  graphql_mutation_update_input = self.generate_graphql_mutation_update_input(schema)
@@ -657,7 +670,7 @@ class GraphQLSchemaManager: # pylint: disable=too-many-public-methods
657
670
  return GraphqlMutations(create=create, update=update, upsert=upsert, delete=delete)
658
671
 
659
672
  def generate_graphql_mutation_create_input(
660
- self, schema: Union[NodeSchema, ProfileSchema]
673
+ self, schema: NodeSchema | ProfileSchema | TemplateSchema
661
674
  ) -> type[graphene.InputObjectType]:
662
675
  """Generate an InputObjectType Object from a Infrahub NodeSchema
663
676
 
@@ -677,10 +690,7 @@ class GraphQLSchemaManager: # pylint: disable=too-many-public-methods
677
690
  attr_kind = get_attr_kind(schema, attr)
678
691
  attr_type = get_attribute_type(kind=attr_kind).get_graphql_create()
679
692
 
680
- # A Field is not required if explicitly indicated or if a default value has been provided
681
- required = not attr.optional if not attr.default_value else False
682
-
683
- attrs[attr.name] = graphene.InputField(attr_type, required=required, description=attr.description)
693
+ attrs[attr.name] = graphene.InputField(attr_type, description=attr.description)
684
694
 
685
695
  for rel in schema.relationships:
686
696
  if rel.internal_peer or rel.read_only:
@@ -688,14 +698,11 @@ class GraphQLSchemaManager: # pylint: disable=too-many-public-methods
688
698
 
689
699
  input_type = self._get_related_input_type(relationship=rel)
690
700
 
691
- required = not rel.optional
692
- if rel.cardinality == "one":
693
- attrs[rel.name] = graphene.InputField(input_type, required=required, description=rel.description)
701
+ if rel.cardinality == RelationshipCardinality.ONE:
702
+ attrs[rel.name] = graphene.InputField(input_type, description=rel.description)
694
703
 
695
- elif rel.cardinality == "many":
696
- attrs[rel.name] = graphene.InputField(
697
- graphene.List(input_type), required=required, description=rel.description
698
- )
704
+ elif rel.cardinality == RelationshipCardinality.MANY:
705
+ attrs[rel.name] = graphene.InputField(graphene.List(input_type), description=rel.description)
699
706
 
700
707
  return type(f"{schema.kind}CreateInput", (graphene.InputObjectType,), attrs)
701
708
 
@@ -728,10 +735,10 @@ class GraphQLSchemaManager: # pylint: disable=too-many-public-methods
728
735
 
729
736
  input_type = self._get_related_input_type(relationship=rel)
730
737
 
731
- if rel.cardinality == "one":
738
+ if rel.cardinality == RelationshipCardinality.ONE:
732
739
  attrs[rel.name] = graphene.InputField(input_type, required=False, description=rel.description)
733
740
 
734
- elif rel.cardinality == "many":
741
+ elif rel.cardinality == RelationshipCardinality.MANY:
735
742
  attrs[rel.name] = graphene.InputField(
736
743
  graphene.List(input_type), required=False, description=rel.description
737
744
  )
@@ -739,7 +746,7 @@ class GraphQLSchemaManager: # pylint: disable=too-many-public-methods
739
746
  return type(f"{schema.kind}UpdateInput", (graphene.InputObjectType,), attrs)
740
747
 
741
748
  def generate_graphql_mutation_upsert_input(
742
- self, schema: Union[NodeSchema, ProfileSchema]
749
+ self, schema: NodeSchema | ProfileSchema | TemplateSchema
743
750
  ) -> type[graphene.InputObjectType]:
744
751
  """Generate an InputObjectType Object from a Infrahub NodeSchema
745
752
 
@@ -775,10 +782,10 @@ class GraphQLSchemaManager: # pylint: disable=too-many-public-methods
775
782
  input_type = self._get_related_input_type(relationship=rel)
776
783
 
777
784
  required = not rel.optional
778
- if rel.cardinality == "one":
785
+ if rel.cardinality == RelationshipCardinality.ONE:
779
786
  attrs[rel.name] = graphene.InputField(input_type, required=required, description=rel.description)
780
787
 
781
- elif rel.cardinality == "many":
788
+ elif rel.cardinality == RelationshipCardinality.MANY:
782
789
  attrs[rel.name] = graphene.InputField(
783
790
  graphene.List(input_type), required=required, description=rel.description
784
791
  )
@@ -787,7 +794,7 @@ class GraphQLSchemaManager: # pylint: disable=too-many-public-methods
787
794
 
788
795
  def generate_graphql_mutation_create(
789
796
  self,
790
- schema: Union[NodeSchema, ProfileSchema],
797
+ schema: NodeSchema | ProfileSchema | TemplateSchema,
791
798
  input_type: type[graphene.InputObjectType],
792
799
  base_class: type[InfrahubMutation] = InfrahubMutation,
793
800
  mutation_type: str = "Create",
@@ -834,7 +841,7 @@ class GraphQLSchemaManager: # pylint: disable=too-many-public-methods
834
841
 
835
842
  @staticmethod
836
843
  def generate_graphql_mutation_delete(
837
- schema: Union[NodeSchema, ProfileSchema], base_class: type[InfrahubMutation] = InfrahubMutation
844
+ schema: NodeSchema | ProfileSchema | TemplateSchema, base_class: type[InfrahubMutation] = InfrahubMutation
838
845
  ) -> type[InfrahubMutation]:
839
846
  """Generate a GraphQL Mutation to DELETE an object based on the specified NodeSchema."""
840
847
  name = f"{schema.kind}Delete"
@@ -940,7 +947,7 @@ class GraphQLSchemaManager: # pylint: disable=too-many-public-methods
940
947
  }
941
948
 
942
949
  if relation_property:
943
- main_attrs["properties"] = graphene.Field(relation_property)
950
+ main_attrs["properties"] = graphene.Field(relation_property, required=False)
944
951
 
945
952
  graphql_edged_object = type(object_name, (InfrahubObject,), main_attrs)
946
953
 
@@ -967,16 +974,14 @@ class GraphQLSchemaManager: # pylint: disable=too-many-public-methods
967
974
  }
968
975
 
969
976
  main_attrs: dict[str, Any] = {
970
- "count": graphene.Int(required=False),
971
- "edges": graphene.List(of_type=edge),
977
+ "count": graphene.Int(required=True),
978
+ "edges": graphene.List(of_type=graphene.NonNull(edge), required=True),
979
+ "permissions": graphene.Field(
980
+ PaginatedObjectPermission, required=True, resolver=parent_field_name_resolver
981
+ ),
972
982
  "Meta": type("Meta", (object,), meta_attrs),
973
983
  }
974
984
 
975
- if isinstance(schema, (NodeSchema, GenericSchema)):
976
- main_attrs["permissions"] = graphene.Field(
977
- PaginatedObjectPermission, required=True, resolver=parent_field_name_resolver
978
- )
979
-
980
985
  graphql_paginated_object = type(object_name, (InfrahubObject,), main_attrs)
981
986
 
982
987
  if populate_cache:
@@ -1004,7 +1009,7 @@ class GraphQLSchemaManager: # pylint: disable=too-many-public-methods
1004
1009
  }
1005
1010
 
1006
1011
  if relation_property:
1007
- main_attrs["properties"] = graphene.Field(relation_property)
1012
+ main_attrs["properties"] = graphene.Field(relation_property, required=False)
1008
1013
 
1009
1014
  object_name = f"NestedEdged{schema.kind}"
1010
1015
  nested_interface_object = type(object_name, (InfrahubObject,), main_attrs)
@@ -1025,8 +1030,8 @@ class GraphQLSchemaManager: # pylint: disable=too-many-public-methods
1025
1030
  }
1026
1031
 
1027
1032
  main_attrs: dict[str, Any] = {
1028
- "count": graphene.Int(required=False),
1029
- "edges": graphene.List(of_type=base_interface),
1033
+ "count": graphene.Int(required=True),
1034
+ "edges": graphene.List(of_type=graphene.NonNull(base_interface)),
1030
1035
  "Meta": type("Meta", (object,), meta_attrs),
1031
1036
  }
1032
1037
 
@@ -22,9 +22,6 @@ if TYPE_CHECKING:
22
22
  from ..initialization import GraphqlContext
23
23
 
24
24
 
25
- # pylint: disable=unused-argument
26
-
27
-
28
25
  class InfrahubAccountTokenCreateInput(InputObjectType):
29
26
  name = InputField(String(required=False), description="The name of the token")
30
27
  expiration = InputField(String(required=False), description="Timestamp when the token expires")
@@ -52,23 +49,25 @@ class AccountMixin:
52
49
  @classmethod
53
50
  async def mutate(
54
51
  cls,
55
- root: dict,
52
+ root: dict, # noqa: ARG003
56
53
  info: GraphQLResolveInfo,
57
54
  data: dict[str, Any],
58
55
  ) -> Self:
59
- context: GraphqlContext = info.context
56
+ graphql_context: GraphqlContext = info.context
60
57
 
61
- if not context.account_session:
58
+ if not graphql_context.account_session:
62
59
  raise ValueError("An account_session is mandatory to execute this mutation")
63
60
 
64
- if context.account_session.auth_type != AuthType.JWT:
61
+ if graphql_context.account_session.auth_type != AuthType.JWT:
65
62
  raise PermissionDeniedError("This operation requires authentication with a JWT token")
66
63
 
67
64
  results = await NodeManager.query(
68
- schema=CoreAccount, filters={"ids": [context.account_session.account_id]}, db=context.db
65
+ schema=CoreAccount, filters={"ids": [graphql_context.account_session.account_id]}, db=graphql_context.db
69
66
  )
70
67
  if not results:
71
- raise NodeNotFoundError(node_type=InfrahubKind.ACCOUNT, identifier=context.account_session.account_id)
68
+ raise NodeNotFoundError(
69
+ node_type=InfrahubKind.ACCOUNT, identifier=graphql_context.account_session.account_id
70
+ )
72
71
 
73
72
  account = results[0]
74
73
 
@@ -77,10 +76,10 @@ class AccountMixin:
77
76
  "InfrahubAccountTokenDelete": cls.delete_token,
78
77
  "InfrahubAccountSelfUpdate": cls.update_self,
79
78
  }
80
- response = await mutation_map[cls.__name__](db=context.db, account=account, data=data, info=info)
79
+ response = await mutation_map[cls.__name__](db=graphql_context.db, account=account, data=data, info=info)
81
80
 
82
81
  # Reset the time of the query to guarantee that all resolvers executed after this point will account for the changes
83
- context.at = Timestamp()
82
+ graphql_context.at = Timestamp()
84
83
 
85
84
  return response
86
85
 
@@ -108,7 +107,11 @@ class AccountMixin:
108
107
  @classmethod
109
108
  @retry_db_transaction(name="account_token_delete")
110
109
  async def delete_token(
111
- cls, db: InfrahubDatabase, account: CoreNode, data: dict[str, Any], info: GraphQLResolveInfo
110
+ cls,
111
+ db: InfrahubDatabase,
112
+ account: CoreNode,
113
+ data: dict[str, Any],
114
+ info: GraphQLResolveInfo, # noqa: ARG003
112
115
  ) -> Self:
113
116
  token_id = str(data.get("id"))
114
117
 
@@ -130,7 +133,11 @@ class AccountMixin:
130
133
  @classmethod
131
134
  @retry_db_transaction(name="account_update_self")
132
135
  async def update_self(
133
- cls, db: InfrahubDatabase, account: CoreNode, data: dict[str, Any], info: GraphQLResolveInfo
136
+ cls,
137
+ db: InfrahubDatabase,
138
+ account: CoreNode,
139
+ data: dict[str, Any],
140
+ info: GraphQLResolveInfo, # noqa: ARG003
134
141
  ) -> Self:
135
142
  for field in ("password", "description"):
136
143
  if value := data.get(field):
@@ -25,7 +25,7 @@ log = get_logger()
25
25
 
26
26
  class InfrahubArtifactDefinitionMutation(InfrahubMutationMixin, Mutation):
27
27
  @classmethod
28
- def __init_subclass_with_meta__( # pylint: disable=arguments-differ
28
+ def __init_subclass_with_meta__(
29
29
  cls,
30
30
  schema: NodeSchema,
31
31
  _meta: Optional[Any] = None,
@@ -48,20 +48,22 @@ class InfrahubArtifactDefinitionMutation(InfrahubMutationMixin, Mutation):
48
48
  info: GraphQLResolveInfo,
49
49
  data: InputObjectType,
50
50
  branch: Branch,
51
- database: Optional[InfrahubDatabase] = None,
51
+ database: Optional[InfrahubDatabase] = None, # noqa: ARG003
52
52
  ) -> tuple[Node, Self]:
53
- context: GraphqlContext = info.context
53
+ graphql_context: GraphqlContext = info.context
54
54
 
55
55
  artifact_definition, result = await super().mutate_create(info=info, data=data, branch=branch)
56
56
 
57
- if context.service:
57
+ if graphql_context.service:
58
58
  model = RequestArtifactDefinitionGenerate(
59
59
  branch=branch.name,
60
60
  artifact_definition_id=artifact_definition.id,
61
61
  artifact_definition_name=artifact_definition.name.value, # type: ignore[attr-defined]
62
62
  )
63
- await context.service.workflow.submit_workflow(
64
- workflow=REQUEST_ARTIFACT_DEFINITION_GENERATE, parameters={"model": model}
63
+ await graphql_context.service.workflow.submit_workflow(
64
+ workflow=REQUEST_ARTIFACT_DEFINITION_GENERATE,
65
+ context=graphql_context.get_context(),
66
+ parameters={"model": model},
65
67
  )
66
68
 
67
69
  return artifact_definition, result
@@ -72,21 +74,23 @@ class InfrahubArtifactDefinitionMutation(InfrahubMutationMixin, Mutation):
72
74
  info: GraphQLResolveInfo,
73
75
  data: InputObjectType,
74
76
  branch: Branch,
75
- database: Optional[InfrahubDatabase] = None,
76
- node: Optional[Node] = None,
77
+ database: Optional[InfrahubDatabase] = None, # noqa: ARG003
78
+ node: Optional[Node] = None, # noqa: ARG003
77
79
  ) -> tuple[Node, Self]:
78
- context: GraphqlContext = info.context
80
+ graphql_context: GraphqlContext = info.context
79
81
 
80
82
  artifact_definition, result = await super().mutate_update(info=info, data=data, branch=branch)
81
83
 
82
- if context.service:
84
+ if graphql_context.service:
83
85
  model = RequestArtifactDefinitionGenerate(
84
86
  branch=branch.name,
85
87
  artifact_definition_id=artifact_definition.id,
86
88
  artifact_definition_name=artifact_definition.name.value, # type: ignore[attr-defined]
87
89
  )
88
- await context.service.workflow.submit_workflow(
89
- workflow=REQUEST_ARTIFACT_DEFINITION_GENERATE, parameters={"model": model}
90
+ await graphql_context.service.workflow.submit_workflow(
91
+ workflow=REQUEST_ARTIFACT_DEFINITION_GENERATE,
92
+ context=graphql_context.get_context(),
93
+ parameters={"model": model},
90
94
  )
91
95
 
92
96
  return artifact_definition, result