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
@@ -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,8 @@ from .types import (
59
60
  )
60
61
  from .types.attribute import BaseAttribute as BaseAttributeType
61
62
  from .types.attribute import TextAttributeType
63
+ from .types.context import ContextInput
64
+ from .types.event import EVENT_TYPES
62
65
 
63
66
  if TYPE_CHECKING:
64
67
  from graphql import GraphQLSchema
@@ -66,8 +69,6 @@ if TYPE_CHECKING:
66
69
  from infrahub.core.branch import Branch
67
70
  from infrahub.core.schema.schema_branch import SchemaBranch
68
71
 
69
- # pylint: disable=redefined-builtin,c-extension-no-member,too-many-lines,too-many-public-methods
70
-
71
72
 
72
73
  class DeleteInput(graphene.InputObjectType):
73
74
  id = graphene.String(required=False)
@@ -105,7 +106,7 @@ class BranchDetails:
105
106
  gql_manager: GraphQLSchemaManager
106
107
 
107
108
 
108
- class GraphQLSchemaManager: # pylint: disable=too-many-public-methods
109
+ class GraphQLSchemaManager:
109
110
  _extra_types: dict[str, GraphQLTypes] = {}
110
111
  _branch_details_by_name: dict[str, BranchDetails] = {}
111
112
 
@@ -161,6 +162,7 @@ class GraphQLSchemaManager: # pylint: disable=too-many-public-methods
161
162
  self._graphql_types: dict[str, GraphQLTypes] = {}
162
163
 
163
164
  self._load_attribute_types()
165
+ self._load_event_types()
164
166
  if config.SETTINGS.experimental_features.graphql_enums:
165
167
  self._load_all_enum_types(node_schemas=self.schema.get_all().values())
166
168
  self._load_node_interface()
@@ -251,7 +253,7 @@ class GraphQLSchemaManager: # pylint: disable=too-many-public-methods
251
253
 
252
254
  def get_type(self, name: str) -> type[InfrahubObject]:
253
255
  if name in self._graphql_types and issubclass(
254
- self._graphql_types[name], (BaseAttributeType, graphene.Interface, graphene.ObjectType)
256
+ self._graphql_types[name], BaseAttributeType | graphene.Interface | graphene.ObjectType
255
257
  ):
256
258
  return self._graphql_types[name]
257
259
  raise ValueError(f"Unable to find {name!r}")
@@ -273,6 +275,10 @@ class GraphQLSchemaManager: # pylint: disable=too-many-public-methods
273
275
  for data_type in ATTRIBUTE_TYPES.values():
274
276
  self.set_type(name=data_type.get_graphql_type_name(), graphql_type=data_type.get_graphql_type())
275
277
 
278
+ def _load_event_types(self) -> None:
279
+ for event in EVENT_TYPES.values():
280
+ self.set_type(name=event._meta.name, graphql_type=event)
281
+
276
282
  def _load_node_interface(self) -> None:
277
283
  node_interface_schema = GenericSchema(
278
284
  name="Node", namespace="Core", description="Interface for all nodes in Infrahub"
@@ -339,13 +345,13 @@ class GraphQLSchemaManager: # pylint: disable=too-many-public-methods
339
345
 
340
346
  return RelatedNodeInput
341
347
 
342
- def generate_object_types(self) -> None: # pylint: disable=too-many-branches,too-many-statements
348
+ def generate_object_types(self) -> None:
343
349
  """Generate all GraphQL objects for the schema and store them in the internal registry."""
344
350
 
345
351
  full_schema = self.schema.get_all(duplicate=False)
346
352
 
347
353
  # Generate all GraphQL Interface Object first and store them in the registry
348
- for node_name, node_schema in full_schema.items():
354
+ for node_schema in full_schema.values():
349
355
  if not isinstance(node_schema, GenericSchema):
350
356
  continue
351
357
  interface = self.generate_interface_object(schema=node_schema, populate_cache=True)
@@ -385,8 +391,8 @@ class GraphQLSchemaManager: # pylint: disable=too-many-public-methods
385
391
  self.set_type(name=nested_edged_interface._meta.name, graphql_type=nested_edged_interface)
386
392
 
387
393
  # 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)):
394
+ for node_schema in full_schema.values():
395
+ if isinstance(node_schema, NodeSchema | ProfileSchema | TemplateSchema):
390
396
  node_type = self.generate_graphql_object(schema=node_schema, populate_cache=True)
391
397
  node_type_edged = self.generate_graphql_edged_object(
392
398
  schema=node_schema, node=node_type, populate_cache=True
@@ -417,11 +423,13 @@ class GraphQLSchemaManager: # pylint: disable=too-many-public-methods
417
423
  continue
418
424
  peer_filters = self.generate_filters(schema=peer_schema, top_level=False)
419
425
 
420
- if rel.cardinality == "one":
426
+ if rel.cardinality == RelationshipCardinality.ONE:
421
427
  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)
428
+ node_type._meta.fields[rel.name] = graphene.Field(
429
+ peer_type, resolver=single_relationship_resolver, required=True
430
+ )
423
431
 
424
- elif rel.cardinality == "many":
432
+ elif rel.cardinality == RelationshipCardinality.MANY:
425
433
  peer_type = self.get_type(name=f"NestedPaginated{peer_schema.kind}")
426
434
 
427
435
  if (isinstance(node_schema, NodeSchema) and node_schema.hierarchy) or (
@@ -430,7 +438,7 @@ class GraphQLSchemaManager: # pylint: disable=too-many-public-methods
430
438
  peer_filters["include_descendants"] = graphene.Boolean()
431
439
 
432
440
  node_type._meta.fields[rel.name] = graphene.Field(
433
- peer_type, required=False, resolver=many_relationship_resolver, **peer_filters
441
+ peer_type, required=True, resolver=many_relationship_resolver, **peer_filters
434
442
  )
435
443
 
436
444
  if (isinstance(node_schema, NodeSchema) and node_schema.hierarchy) or (
@@ -448,16 +456,16 @@ class GraphQLSchemaManager: # pylint: disable=too-many-public-methods
448
456
  peer_type_edge = self.get_type(name=f"NestedEdged{hierarchy_name}")
449
457
 
450
458
  node_type._meta.fields["parent"] = graphene.Field(
451
- peer_type_edge, required=False, resolver=single_relationship_resolver
459
+ peer_type_edge, required=True, resolver=single_relationship_resolver
452
460
  )
453
461
  node_type._meta.fields["children"] = graphene.Field(
454
- peer_type, required=False, resolver=many_relationship_resolver, **peer_filters
462
+ peer_type, required=True, resolver=many_relationship_resolver, **peer_filters
455
463
  )
456
464
  node_type._meta.fields["ancestors"] = graphene.Field(
457
- peer_type, required=False, resolver=ancestors_resolver, **peer_filters
465
+ peer_type, required=True, resolver=ancestors_resolver, **peer_filters
458
466
  )
459
467
  node_type._meta.fields["descendants"] = graphene.Field(
460
- peer_type, required=False, resolver=descendants_resolver, **peer_filters
468
+ peer_type, required=True, resolver=descendants_resolver, **peer_filters
461
469
  )
462
470
 
463
471
  def generate_query_mixin(self) -> type[object]:
@@ -478,6 +486,7 @@ class GraphQLSchemaManager: # pylint: disable=too-many-public-methods
478
486
  class_attrs[node_schema.kind] = graphene.Field(
479
487
  node_type,
480
488
  resolver=default_paginated_list_resolver,
489
+ required=True,
481
490
  **node_filters,
482
491
  )
483
492
  if node_name == InfrahubKind.GENERICACCOUNT:
@@ -513,7 +522,7 @@ class GraphQLSchemaManager: # pylint: disable=too-many-public-methods
513
522
  else:
514
523
  base_class = mutation_map.get(node_schema.kind, InfrahubMutation)
515
524
 
516
- if isinstance(node_schema, (NodeSchema, ProfileSchema)):
525
+ if isinstance(node_schema, NodeSchema | ProfileSchema | TemplateSchema):
517
526
  mutations = self.generate_graphql_mutations(schema=node_schema, base_class=base_class)
518
527
 
519
528
  class_attrs[f"{node_schema.kind}Create"] = mutations.create.Field()
@@ -539,7 +548,7 @@ class GraphQLSchemaManager: # pylint: disable=too-many-public-methods
539
548
 
540
549
  interfaces: set[type[InfrahubObject]] = set()
541
550
 
542
- if isinstance(schema, (NodeSchema, ProfileSchema)) and schema.inherit_from:
551
+ if isinstance(schema, NodeSchema | ProfileSchema | TemplateSchema) and schema.inherit_from:
543
552
  for generic_name in schema.inherit_from:
544
553
  generic = self.get_type(name=generic_name)
545
554
  interfaces.add(generic)
@@ -559,7 +568,9 @@ class GraphQLSchemaManager: # pylint: disable=too-many-public-methods
559
568
  main_attrs = {
560
569
  "id": graphene.Field(graphene.String, required=True, description="Unique identifier"),
561
570
  "hfid": graphene.Field(
562
- graphene.List(of_type=graphene.String), required=False, description="Human friendly identifier"
571
+ graphene.List(of_type=graphene.NonNull(graphene.String)),
572
+ required=False,
573
+ description="Human friendly identifier",
563
574
  ),
564
575
  "_updated_at": graphene.DateTime(required=False),
565
576
  "display_label": graphene.String(required=False),
@@ -569,7 +580,8 @@ class GraphQLSchemaManager: # pylint: disable=too-many-public-methods
569
580
  for attr in schema.local_attributes:
570
581
  attr_kind = get_attr_kind(schema, attr)
571
582
  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)
583
+ req = "" if attr.optional else " (required)"
584
+ main_attrs[attr.name] = graphene.Field(attr_type, description=f"{attr.description}{req}")
573
585
 
574
586
  graphql_object = type(schema.kind, (InfrahubObject,), main_attrs)
575
587
 
@@ -589,7 +601,9 @@ class GraphQLSchemaManager: # pylint: disable=too-many-public-methods
589
601
  main_attrs = {
590
602
  "id": graphene.Field(graphene.String, required=False, description="Unique identifier"),
591
603
  "hfid": graphene.Field(
592
- graphene.List(of_type=graphene.String), required=False, description="Human friendly identifier"
604
+ graphene.List(of_type=graphene.NonNull(graphene.String)),
605
+ required=False,
606
+ description="Human friendly identifier",
593
607
  ),
594
608
  "display_label": graphene.String(required=False),
595
609
  "Meta": type("Meta", (object,), meta_attrs),
@@ -598,7 +612,7 @@ class GraphQLSchemaManager: # pylint: disable=too-many-public-methods
598
612
  for attr in schema.attributes:
599
613
  attr_kind = get_attr_kind(node_schema=schema, attr_schema=attr)
600
614
  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)
615
+ main_attrs[attr.name] = graphene.Field(attr_type, description=attr.description)
602
616
 
603
617
  interface_object = type(schema.kind, (InfrahubInterface,), main_attrs)
604
618
 
@@ -629,7 +643,7 @@ class GraphQLSchemaManager: # pylint: disable=too-many-public-methods
629
643
  self.set_type(name=type_name, graphql_type=relationship_property)
630
644
 
631
645
  def generate_graphql_mutations(
632
- self, schema: Union[NodeSchema, ProfileSchema], base_class: type[InfrahubMutation]
646
+ self, schema: NodeSchema | ProfileSchema | TemplateSchema, base_class: type[InfrahubMutation]
633
647
  ) -> GraphqlMutations:
634
648
  graphql_mutation_create_input = self.generate_graphql_mutation_create_input(schema)
635
649
  graphql_mutation_update_input = self.generate_graphql_mutation_update_input(schema)
@@ -657,7 +671,7 @@ class GraphQLSchemaManager: # pylint: disable=too-many-public-methods
657
671
  return GraphqlMutations(create=create, update=update, upsert=upsert, delete=delete)
658
672
 
659
673
  def generate_graphql_mutation_create_input(
660
- self, schema: Union[NodeSchema, ProfileSchema]
674
+ self, schema: NodeSchema | ProfileSchema | TemplateSchema
661
675
  ) -> type[graphene.InputObjectType]:
662
676
  """Generate an InputObjectType Object from a Infrahub NodeSchema
663
677
 
@@ -677,10 +691,7 @@ class GraphQLSchemaManager: # pylint: disable=too-many-public-methods
677
691
  attr_kind = get_attr_kind(schema, attr)
678
692
  attr_type = get_attribute_type(kind=attr_kind).get_graphql_create()
679
693
 
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)
694
+ attrs[attr.name] = graphene.InputField(attr_type, description=attr.description)
684
695
 
685
696
  for rel in schema.relationships:
686
697
  if rel.internal_peer or rel.read_only:
@@ -688,14 +699,11 @@ class GraphQLSchemaManager: # pylint: disable=too-many-public-methods
688
699
 
689
700
  input_type = self._get_related_input_type(relationship=rel)
690
701
 
691
- required = not rel.optional
692
- if rel.cardinality == "one":
693
- attrs[rel.name] = graphene.InputField(input_type, required=required, description=rel.description)
702
+ if rel.cardinality == RelationshipCardinality.ONE:
703
+ attrs[rel.name] = graphene.InputField(input_type, description=rel.description)
694
704
 
695
- elif rel.cardinality == "many":
696
- attrs[rel.name] = graphene.InputField(
697
- graphene.List(input_type), required=required, description=rel.description
698
- )
705
+ elif rel.cardinality == RelationshipCardinality.MANY:
706
+ attrs[rel.name] = graphene.InputField(graphene.List(input_type), description=rel.description)
699
707
 
700
708
  return type(f"{schema.kind}CreateInput", (graphene.InputObjectType,), attrs)
701
709
 
@@ -728,10 +736,10 @@ class GraphQLSchemaManager: # pylint: disable=too-many-public-methods
728
736
 
729
737
  input_type = self._get_related_input_type(relationship=rel)
730
738
 
731
- if rel.cardinality == "one":
739
+ if rel.cardinality == RelationshipCardinality.ONE:
732
740
  attrs[rel.name] = graphene.InputField(input_type, required=False, description=rel.description)
733
741
 
734
- elif rel.cardinality == "many":
742
+ elif rel.cardinality == RelationshipCardinality.MANY:
735
743
  attrs[rel.name] = graphene.InputField(
736
744
  graphene.List(input_type), required=False, description=rel.description
737
745
  )
@@ -739,7 +747,7 @@ class GraphQLSchemaManager: # pylint: disable=too-many-public-methods
739
747
  return type(f"{schema.kind}UpdateInput", (graphene.InputObjectType,), attrs)
740
748
 
741
749
  def generate_graphql_mutation_upsert_input(
742
- self, schema: Union[NodeSchema, ProfileSchema]
750
+ self, schema: NodeSchema | ProfileSchema | TemplateSchema
743
751
  ) -> type[graphene.InputObjectType]:
744
752
  """Generate an InputObjectType Object from a Infrahub NodeSchema
745
753
 
@@ -775,10 +783,10 @@ class GraphQLSchemaManager: # pylint: disable=too-many-public-methods
775
783
  input_type = self._get_related_input_type(relationship=rel)
776
784
 
777
785
  required = not rel.optional
778
- if rel.cardinality == "one":
786
+ if rel.cardinality == RelationshipCardinality.ONE:
779
787
  attrs[rel.name] = graphene.InputField(input_type, required=required, description=rel.description)
780
788
 
781
- elif rel.cardinality == "many":
789
+ elif rel.cardinality == RelationshipCardinality.MANY:
782
790
  attrs[rel.name] = graphene.InputField(
783
791
  graphene.List(input_type), required=required, description=rel.description
784
792
  )
@@ -787,7 +795,7 @@ class GraphQLSchemaManager: # pylint: disable=too-many-public-methods
787
795
 
788
796
  def generate_graphql_mutation_create(
789
797
  self,
790
- schema: Union[NodeSchema, ProfileSchema],
798
+ schema: NodeSchema | ProfileSchema | TemplateSchema,
791
799
  input_type: type[graphene.InputObjectType],
792
800
  base_class: type[InfrahubMutation] = InfrahubMutation,
793
801
  mutation_type: str = "Create",
@@ -802,9 +810,7 @@ class GraphQLSchemaManager: # pylint: disable=too-many-public-methods
802
810
  meta_attrs: dict[str, Any] = {"schema": schema, "name": name, "description": schema.description}
803
811
  main_attrs["Meta"] = type("Meta", (object,), meta_attrs)
804
812
 
805
- args_attrs = {
806
- "data": input_type(required=True),
807
- }
813
+ args_attrs = {"data": input_type(required=True), "context": ContextInput(required=False)}
808
814
  main_attrs["Arguments"] = type("Arguments", (object,), args_attrs)
809
815
 
810
816
  return type(name, (base_class,), main_attrs)
@@ -825,16 +831,14 @@ class GraphQLSchemaManager: # pylint: disable=too-many-public-methods
825
831
  meta_attrs: dict[str, Any] = {"schema": schema, "name": name, "description": schema.description}
826
832
  main_attrs["Meta"] = type("Meta", (object,), meta_attrs)
827
833
 
828
- args_attrs = {
829
- "data": input_type(required=True),
830
- }
834
+ args_attrs = {"data": input_type(required=True), "context": ContextInput(required=False)}
831
835
  main_attrs["Arguments"] = type("Arguments", (object,), args_attrs)
832
836
 
833
837
  return type(name, (base_class,), main_attrs)
834
838
 
835
839
  @staticmethod
836
840
  def generate_graphql_mutation_delete(
837
- schema: Union[NodeSchema, ProfileSchema], base_class: type[InfrahubMutation] = InfrahubMutation
841
+ schema: NodeSchema | ProfileSchema | TemplateSchema, base_class: type[InfrahubMutation] = InfrahubMutation
838
842
  ) -> type[InfrahubMutation]:
839
843
  """Generate a GraphQL Mutation to DELETE an object based on the specified NodeSchema."""
840
844
  name = f"{schema.kind}Delete"
@@ -844,9 +848,7 @@ class GraphQLSchemaManager: # pylint: disable=too-many-public-methods
844
848
  meta_attrs = {"schema": schema, "name": name, "description": schema.description}
845
849
  main_attrs["Meta"] = type("Meta", (object,), meta_attrs)
846
850
 
847
- args_attrs: dict[str, Any] = {
848
- "data": DeleteInput(required=True),
849
- }
851
+ args_attrs: dict[str, Any] = {"data": DeleteInput(required=True), "context": ContextInput(required=False)}
850
852
  main_attrs["Arguments"] = type("Arguments", (object,), args_attrs)
851
853
 
852
854
  return type(name, (base_class,), main_attrs)
@@ -940,7 +942,7 @@ class GraphQLSchemaManager: # pylint: disable=too-many-public-methods
940
942
  }
941
943
 
942
944
  if relation_property:
943
- main_attrs["properties"] = graphene.Field(relation_property)
945
+ main_attrs["properties"] = graphene.Field(relation_property, required=False)
944
946
 
945
947
  graphql_edged_object = type(object_name, (InfrahubObject,), main_attrs)
946
948
 
@@ -967,16 +969,14 @@ class GraphQLSchemaManager: # pylint: disable=too-many-public-methods
967
969
  }
968
970
 
969
971
  main_attrs: dict[str, Any] = {
970
- "count": graphene.Int(required=False),
971
- "edges": graphene.List(of_type=edge),
972
+ "count": graphene.Int(required=True),
973
+ "edges": graphene.List(of_type=graphene.NonNull(edge), required=True),
974
+ "permissions": graphene.Field(
975
+ PaginatedObjectPermission, required=True, resolver=parent_field_name_resolver
976
+ ),
972
977
  "Meta": type("Meta", (object,), meta_attrs),
973
978
  }
974
979
 
975
- if isinstance(schema, (NodeSchema, GenericSchema)):
976
- main_attrs["permissions"] = graphene.Field(
977
- PaginatedObjectPermission, required=True, resolver=parent_field_name_resolver
978
- )
979
-
980
980
  graphql_paginated_object = type(object_name, (InfrahubObject,), main_attrs)
981
981
 
982
982
  if populate_cache:
@@ -1004,7 +1004,7 @@ class GraphQLSchemaManager: # pylint: disable=too-many-public-methods
1004
1004
  }
1005
1005
 
1006
1006
  if relation_property:
1007
- main_attrs["properties"] = graphene.Field(relation_property)
1007
+ main_attrs["properties"] = graphene.Field(relation_property, required=False)
1008
1008
 
1009
1009
  object_name = f"NestedEdged{schema.kind}"
1010
1010
  nested_interface_object = type(object_name, (InfrahubObject,), main_attrs)
@@ -1025,8 +1025,8 @@ class GraphQLSchemaManager: # pylint: disable=too-many-public-methods
1025
1025
  }
1026
1026
 
1027
1027
  main_attrs: dict[str, Any] = {
1028
- "count": graphene.Int(required=False),
1029
- "edges": graphene.List(of_type=base_interface),
1028
+ "count": graphene.Int(required=True),
1029
+ "edges": graphene.List(of_type=graphene.NonNull(base_interface)),
1030
1030
  "Meta": type("Meta", (object,), meta_attrs),
1031
1031
  }
1032
1032
 
@@ -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