mage-ai 0.9.44__py3-none-any.whl → 0.9.46__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.

Potentially problematic release.


This version of mage-ai might be problematic. Click here for more details.

Files changed (540) hide show
  1. mage_ai/api/constants.py +2 -0
  2. mage_ai/api/operations/base.py +208 -12
  3. mage_ai/api/policies/BasePolicy.py +3 -3
  4. mage_ai/api/policies/ComputeClusterPolicy.py +96 -0
  5. mage_ai/api/policies/ComputeConnectionPolicy.py +74 -0
  6. mage_ai/api/policies/ComputeServicePolicy.py +50 -0
  7. mage_ai/api/policies/DownloadPolicy.py +29 -0
  8. mage_ai/api/policies/GitCustomBranchPolicy.py +1 -0
  9. mage_ai/api/policies/GlobalHookPolicy.py +126 -0
  10. mage_ai/api/policies/OauthPolicy.py +56 -7
  11. mage_ai/api/policies/ProjectPolicy.py +1 -0
  12. mage_ai/api/policies/RolePolicy.py +12 -1
  13. mage_ai/api/presenters/ComputeClusterPresenter.py +19 -0
  14. mage_ai/api/presenters/ComputeConnectionPresenter.py +26 -0
  15. mage_ai/api/presenters/ComputeServicePresenter.py +15 -0
  16. mage_ai/api/presenters/DownloadPresenter.py +13 -0
  17. mage_ai/api/presenters/GlobalHookPresenter.py +74 -0
  18. mage_ai/api/presenters/OauthPresenter.py +1 -0
  19. mage_ai/api/presenters/PipelinePresenter.py +1 -0
  20. mage_ai/api/presenters/ProjectPresenter.py +1 -0
  21. mage_ai/api/presenters/SparkApplicationPresenter.py +2 -0
  22. mage_ai/api/presenters/WorkspacePresenter.py +22 -22
  23. mage_ai/api/resources/AsyncBaseResource.py +39 -0
  24. mage_ai/api/resources/BackfillResource.py +1 -0
  25. mage_ai/api/resources/BlockResource.py +57 -0
  26. mage_ai/api/resources/ClusterResource.py +1 -1
  27. mage_ai/api/resources/ComputeClusterResource.py +109 -0
  28. mage_ai/api/resources/ComputeConnectionResource.py +103 -0
  29. mage_ai/api/resources/ComputeServiceResource.py +35 -0
  30. mage_ai/api/resources/DownloadResource.py +56 -0
  31. mage_ai/api/resources/ExecutionStateResource.py +1 -1
  32. mage_ai/api/resources/GitBranchResource.py +35 -29
  33. mage_ai/api/resources/GitCustomBranchResource.py +9 -0
  34. mage_ai/api/resources/GlobalHookResource.py +192 -0
  35. mage_ai/api/resources/KernelResource.py +10 -0
  36. mage_ai/api/resources/OauthResource.py +60 -98
  37. mage_ai/api/resources/PipelineResource.py +4 -4
  38. mage_ai/api/resources/PipelineScheduleResource.py +37 -16
  39. mage_ai/api/resources/ProjectResource.py +5 -3
  40. mage_ai/api/resources/SessionResource.py +24 -9
  41. mage_ai/api/resources/SparkApplicationResource.py +5 -5
  42. mage_ai/api/resources/SparkEnvironmentResource.py +1 -2
  43. mage_ai/api/resources/SparkExecutorResource.py +1 -2
  44. mage_ai/api/resources/SparkJobResource.py +3 -6
  45. mage_ai/api/resources/SparkSqlResource.py +6 -11
  46. mage_ai/api/resources/SparkStageAttemptResource.py +2 -3
  47. mage_ai/api/resources/SparkStageAttemptTaskResource.py +1 -2
  48. mage_ai/api/resources/SparkStageAttemptTaskSummaryResource.py +1 -2
  49. mage_ai/api/resources/SparkStageResource.py +3 -6
  50. mage_ai/api/resources/SparkThreadResource.py +1 -2
  51. mage_ai/api/resources/UserResource.py +32 -31
  52. mage_ai/api/resources/mixins/spark.py +25 -4
  53. mage_ai/authentication/oauth/constants.py +4 -0
  54. mage_ai/authentication/oauth2.py +1 -3
  55. mage_ai/authentication/permissions/constants.py +4 -0
  56. mage_ai/authentication/providers/__init__.py +0 -0
  57. mage_ai/authentication/providers/active_directory.py +136 -0
  58. mage_ai/authentication/providers/constants.py +17 -0
  59. mage_ai/authentication/providers/ghe.py +81 -0
  60. mage_ai/authentication/providers/google.py +86 -0
  61. mage_ai/authentication/providers/oauth.py +60 -0
  62. mage_ai/authentication/providers/okta.py +101 -0
  63. mage_ai/authentication/providers/sso.py +20 -0
  64. mage_ai/authentication/providers/utils.py +12 -0
  65. mage_ai/cluster_manager/aws/emr_cluster_manager.py +2 -1
  66. mage_ai/cluster_manager/workspace/base.py +7 -3
  67. mage_ai/data_integrations/destinations/constants.py +2 -0
  68. mage_ai/data_preparation/executors/block_executor.py +3 -0
  69. mage_ai/data_preparation/executors/pipeline_executor.py +9 -0
  70. mage_ai/data_preparation/git/__init__.py +3 -3
  71. mage_ai/data_preparation/git/api.py +69 -35
  72. mage_ai/data_preparation/models/block/__init__.py +95 -60
  73. mage_ai/data_preparation/models/block/data_integration/data.py +1 -1
  74. mage_ai/data_preparation/models/block/dbt/block_sql.py +95 -1
  75. mage_ai/data_preparation/models/block/dbt/utils.py +6 -0
  76. mage_ai/data_preparation/models/block/spark/mixins.py +82 -34
  77. mage_ai/data_preparation/models/download/__init__.py +8 -0
  78. mage_ai/data_preparation/models/global_hooks/__init__.py +0 -0
  79. mage_ai/data_preparation/models/global_hooks/constants.py +44 -0
  80. mage_ai/data_preparation/models/global_hooks/models.py +928 -0
  81. mage_ai/data_preparation/models/global_hooks/utils.py +21 -0
  82. mage_ai/data_preparation/models/pipeline.py +82 -6
  83. mage_ai/data_preparation/models/pipelines/models.py +16 -0
  84. mage_ai/data_preparation/models/project/__init__.py +6 -0
  85. mage_ai/data_preparation/models/project/constants.py +1 -0
  86. mage_ai/data_preparation/models/project/models.py +12 -0
  87. mage_ai/data_preparation/repo_manager.py +23 -1
  88. mage_ai/data_preparation/templates/callbacks/base.jinja +4 -0
  89. mage_ai/data_preparation/templates/data_exporters/streaming/kafka.yaml +1 -0
  90. mage_ai/data_preparation/templates/data_loaders/streaming/activemq.yaml +6 -0
  91. mage_ai/data_preparation/templates/data_loaders/streaming/kafka.yaml +1 -0
  92. mage_ai/data_preparation/templates/data_loaders/streaming/nats.yaml +20 -0
  93. mage_ai/data_preparation/templates/repo/io_config.yaml +2 -2
  94. mage_ai/io/duckdb.py +0 -1
  95. mage_ai/orchestration/concurrency.py +8 -1
  96. mage_ai/orchestration/db/models/schedules.py +23 -2
  97. mage_ai/orchestration/pipeline_scheduler.py +168 -105
  98. mage_ai/orchestration/queue/process_queue.py +9 -1
  99. mage_ai/orchestration/triggers/api.py +11 -3
  100. mage_ai/orchestration/triggers/constants.py +1 -0
  101. mage_ai/orchestration/triggers/utils.py +23 -0
  102. mage_ai/server/active_kernel.py +37 -4
  103. mage_ai/server/api/downloads.py +76 -1
  104. mage_ai/server/api/triggers.py +1 -0
  105. mage_ai/server/constants.py +1 -1
  106. mage_ai/server/frontend_dist/404.html +2 -2
  107. mage_ai/server/frontend_dist/_next/static/9jB4XPuz6BzxBcG9VNao5/_buildManifest.js +1 -0
  108. mage_ai/server/frontend_dist/_next/static/chunks/1749-9a6276b2918fdae1.js +1 -0
  109. mage_ai/server/{frontend_dist_base_path_template/_next/static/chunks/7519-8c29bbb92e03cc77.js → frontend_dist/_next/static/chunks/1845-5ce774d5ab81ed57.js} +1 -1
  110. mage_ai/server/frontend_dist/_next/static/chunks/1952-ac7722e8b1ab88fe.js +1 -0
  111. mage_ai/server/frontend_dist/_next/static/chunks/3419-f8d518d024e7b5c8.js +1 -0
  112. mage_ai/server/frontend_dist/_next/static/chunks/4267-fd4d8049e83178de.js +1 -0
  113. mage_ai/server/frontend_dist/_next/static/chunks/4366-93e09e5a4a7e182c.js +1 -0
  114. mage_ai/server/frontend_dist/_next/static/chunks/5457-949640f4037bf12f.js +1 -0
  115. mage_ai/server/frontend_dist/_next/static/chunks/5499-76cf8f023c6b0985.js +1 -0
  116. mage_ai/server/frontend_dist/_next/static/chunks/553-7f7919e14392ca67.js +1 -0
  117. mage_ai/server/frontend_dist/_next/static/chunks/5638-a65610405a70961c.js +1 -0
  118. mage_ai/server/frontend_dist/_next/static/chunks/5810-12eadc488265d55b.js +1 -0
  119. mage_ai/server/frontend_dist/_next/static/chunks/5820-28adeabb5cda2b96.js +1 -0
  120. mage_ai/server/frontend_dist/_next/static/chunks/595-0d174b1f9fbfce4f.js +1 -0
  121. mage_ai/server/frontend_dist/_next/static/chunks/600-705fe234320ec5de.js +1 -0
  122. mage_ai/server/{frontend_dist_base_path_template/_next/static/chunks/3122-f27de34d0b5426af.js → frontend_dist/_next/static/chunks/6285-e9b45335bfb9ccaf.js} +1 -1
  123. mage_ai/server/frontend_dist/_next/static/chunks/6333-bc1b433b428a9095.js +1 -0
  124. mage_ai/server/frontend_dist/_next/static/chunks/{5397-b5f2e477acc6bd6b.js → 6965-c613d1834c8ed92d.js} +1 -1
  125. mage_ai/server/frontend_dist/_next/static/chunks/{7022-18fde36eb46e1d65.js → 7022-070ec0144a4d029c.js} +1 -1
  126. mage_ai/server/frontend_dist/_next/static/chunks/722-a1584445357a276c.js +1 -0
  127. mage_ai/server/frontend_dist/_next/static/chunks/{7858-c83d25349d0e980f.js → 7858-d9df72e95e438284.js} +1 -1
  128. mage_ai/server/frontend_dist/_next/static/chunks/8264-0d582a6ca33c3dfa.js +1 -0
  129. mage_ai/server/{frontend_dist_base_path_template/_next/static/chunks/3684-cbda680fd8927d07.js → frontend_dist/_next/static/chunks/8432-f191e39f9b5893f2.js} +1 -1
  130. mage_ai/server/frontend_dist/_next/static/chunks/90-a7308bae028d7001.js +1 -0
  131. mage_ai/server/frontend_dist/_next/static/chunks/9264-1d4f0327d42fed91.js +1 -0
  132. mage_ai/server/frontend_dist/_next/static/chunks/9618-2c5045255ac5a6e7.js +1 -0
  133. mage_ai/server/frontend_dist/_next/static/chunks/{976-27c4eed1c9b20c44.js → 976-18c98af60b76f1a7.js} +1 -1
  134. mage_ai/server/frontend_dist/_next/static/chunks/framework-22b71764bf44ede4.js +1 -0
  135. mage_ai/server/frontend_dist/_next/static/chunks/pages/_app-ebef928183f9a3bb.js +1 -0
  136. mage_ai/server/frontend_dist/_next/static/chunks/pages/block-layout-a24cb24b6f08bbc9.js +1 -0
  137. mage_ai/server/frontend_dist/_next/static/chunks/pages/compute-419775ca1293b354.js +1 -0
  138. mage_ai/server/frontend_dist/_next/static/chunks/pages/files-0f2d4be6fdca86ca.js +1 -0
  139. mage_ai/server/frontend_dist/_next/static/chunks/pages/global-data-products/{[...slug]-3f6fc312f67ff72e.js → [...slug]-cfd68e760ae00958.js} +1 -1
  140. mage_ai/server/frontend_dist/_next/static/chunks/pages/{global-data-products-f4cd03036c3e8723.js → global-data-products-c3b79ef31007f95b.js} +1 -1
  141. mage_ai/server/frontend_dist/_next/static/chunks/pages/global-hooks/[...slug]-77edfa32d000e88b.js +1 -0
  142. mage_ai/server/frontend_dist/_next/static/chunks/pages/global-hooks-e561ae38cf5592e8.js +1 -0
  143. mage_ai/server/frontend_dist/_next/static/chunks/pages/manage/files-449a022f2f0f2d94.js +1 -0
  144. mage_ai/server/frontend_dist/_next/static/chunks/pages/manage/settings-60845f0b59142f32.js +1 -0
  145. mage_ai/server/{frontend_dist_base_path_template/_next/static/chunks/pages/manage/users/[user]-1d9b298fdceabbf1.js → frontend_dist/_next/static/chunks/pages/manage/users/[user]-9384c5f1efa2ac18.js} +1 -1
  146. mage_ai/server/frontend_dist/_next/static/chunks/pages/manage/users/new-abd8571907664fdf.js +1 -0
  147. mage_ai/server/frontend_dist/_next/static/chunks/pages/manage/{users-a7c970122a10afdc.js → users-28a930b148d99766.js} +1 -1
  148. mage_ai/server/frontend_dist/_next/static/chunks/pages/manage-f83deb790548693b.js +1 -0
  149. mage_ai/server/frontend_dist/_next/static/chunks/pages/oauth-8bb62c4f6a511c43.js +1 -0
  150. mage_ai/server/frontend_dist/_next/static/chunks/pages/overview-f0c40645f385f23f.js +1 -0
  151. mage_ai/server/frontend_dist/_next/static/chunks/pages/{pipeline-runs-c79819d6826e5416.js → pipeline-runs-b35d37bfba8fbccc.js} +1 -1
  152. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/backfills/[...slug]-10e9a2d19541caa2.js +1 -0
  153. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/backfills-c8d3a5289ab93f88.js +1 -0
  154. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/dashboard-571c0962333b92f0.js +1 -0
  155. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/edit-ff7e9108502f5716.js +1 -0
  156. mage_ai/server/{frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/logs-a52d2d3e0c2978f4.js → frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/logs-ef680455ae54ccbe.js} +1 -1
  157. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/monitors/block-runs-ddddcddd2f74b4f6.js +1 -0
  158. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/monitors/block-runtime-4a238307feddb522.js +1 -0
  159. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/monitors-e051057d9fe94f23.js +1 -0
  160. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/runs/{[run]-4977276c8f84b5f4.js → [run]-0691711636fa95c7.js} +1 -1
  161. mage_ai/server/{frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/runs-ce717786f31e8f04.js → frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/runs-2d20b2cd08907afd.js} +1 -1
  162. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/settings-2914e326a5f1ffe0.js +1 -0
  163. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/syncs-b75bf17498e87354.js +1 -0
  164. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/triggers/[...slug]-3a7500e6e53084d3.js +1 -0
  165. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/triggers-c0e551d265a8d467.js +1 -0
  166. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/{[pipeline]-35fe7762cb83a733.js → [pipeline]-02c843b9c8418bb5.js} +1 -1
  167. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines-e47db5c3eaf683af.js +1 -0
  168. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/account/profile-55ac955dfa9a5a8d.js +1 -0
  169. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/permissions/{[...slug]-d6a62284c7c99cb3.js → [...slug]-b78b1be5b9ed84b9.js} +1 -1
  170. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/{permissions-b1389695f758c32b.js → permissions-37b78a436eeab258.js} +1 -1
  171. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/preferences-29c92a9bc54ae5cd.js +1 -0
  172. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/roles/{[...slug]-0bdb66265286ab22.js → [...slug]-db05a80d18c168e5.js} +1 -1
  173. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/{roles-e04e18fc295ca76a.js → roles-f55c77e4f46c8d33.js} +1 -1
  174. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/sync-data-2a1f8737561fdd94.js +1 -0
  175. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/users/{[...slug]-0267358c91122109.js → [...slug]-e3bf6e5d8bb250c4.js} +1 -1
  176. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/{users-50fed18bb9b8d142.js → users-20f0a050a42a015d.js} +1 -1
  177. mage_ai/server/frontend_dist/_next/static/chunks/pages/{settings-56f83205752b1323.js → settings-0f0121db7f5ff93d.js} +1 -1
  178. mage_ai/server/frontend_dist/_next/static/chunks/pages/sign-in-99e2748e3c1d57a3.js +1 -0
  179. mage_ai/server/{frontend_dist_base_path_template/_next/static/chunks/pages/templates/[...slug]-9370551ffa462144.js → frontend_dist/_next/static/chunks/pages/templates/[...slug]-f44ccd1499ffd23a.js} +1 -1
  180. mage_ai/server/{frontend_dist_base_path_template/_next/static/chunks/pages/templates-3cff90df13a1a755.js → frontend_dist/_next/static/chunks/pages/templates-1bfaa1c50e844813.js} +1 -1
  181. mage_ai/server/frontend_dist/_next/static/chunks/pages/terminal-ed121e305169cf1c.js +1 -0
  182. mage_ai/server/frontend_dist/_next/static/chunks/pages/test-9ae68758102cc843.js +1 -0
  183. mage_ai/server/frontend_dist/_next/static/chunks/pages/{triggers-ffaab4c013e62ba1.js → triggers-572d82d6eb7a5d43.js} +1 -1
  184. mage_ai/server/frontend_dist/_next/static/chunks/pages/version-control-2d26d80370a2e481.js +1 -0
  185. mage_ai/server/frontend_dist/block-layout.html +2 -2
  186. mage_ai/server/frontend_dist/compute.html +5 -5
  187. mage_ai/server/frontend_dist/files.html +5 -5
  188. mage_ai/server/frontend_dist/global-data-products/[...slug].html +5 -5
  189. mage_ai/server/frontend_dist/global-data-products.html +5 -5
  190. mage_ai/server/frontend_dist/global-hooks/[...slug].html +24 -0
  191. mage_ai/server/frontend_dist/global-hooks.html +24 -0
  192. mage_ai/server/frontend_dist/index.html +2 -2
  193. mage_ai/server/frontend_dist/manage/files.html +5 -5
  194. mage_ai/server/frontend_dist/manage/settings.html +5 -5
  195. mage_ai/server/frontend_dist/manage/users/[user].html +5 -5
  196. mage_ai/server/frontend_dist/manage/users/new.html +5 -5
  197. mage_ai/server/frontend_dist/manage/users.html +5 -5
  198. mage_ai/server/frontend_dist/manage.html +5 -5
  199. mage_ai/server/frontend_dist/oauth.html +4 -4
  200. mage_ai/server/frontend_dist/overview.html +5 -5
  201. mage_ai/server/frontend_dist/pipeline-runs.html +5 -5
  202. mage_ai/server/frontend_dist/pipelines/[pipeline]/backfills/[...slug].html +5 -5
  203. mage_ai/server/frontend_dist/pipelines/[pipeline]/backfills.html +5 -5
  204. mage_ai/server/frontend_dist/pipelines/[pipeline]/dashboard.html +5 -5
  205. mage_ai/server/frontend_dist/pipelines/[pipeline]/edit.html +2 -2
  206. mage_ai/server/frontend_dist/pipelines/[pipeline]/logs.html +5 -5
  207. mage_ai/server/frontend_dist/pipelines/[pipeline]/monitors/block-runs.html +5 -5
  208. mage_ai/server/frontend_dist/pipelines/[pipeline]/monitors/block-runtime.html +5 -5
  209. mage_ai/server/frontend_dist/pipelines/[pipeline]/monitors.html +5 -5
  210. mage_ai/server/frontend_dist/pipelines/[pipeline]/runs/[run].html +5 -5
  211. mage_ai/server/frontend_dist/pipelines/[pipeline]/runs.html +5 -5
  212. mage_ai/server/frontend_dist/pipelines/[pipeline]/settings.html +5 -5
  213. mage_ai/server/frontend_dist/pipelines/[pipeline]/syncs.html +5 -5
  214. mage_ai/server/frontend_dist/pipelines/[pipeline]/triggers/[...slug].html +5 -5
  215. mage_ai/server/frontend_dist/pipelines/[pipeline]/triggers.html +5 -5
  216. mage_ai/server/frontend_dist/pipelines/[pipeline].html +2 -2
  217. mage_ai/server/frontend_dist/pipelines.html +5 -5
  218. mage_ai/server/frontend_dist/settings/account/profile.html +5 -5
  219. mage_ai/server/frontend_dist/settings/workspace/permissions/[...slug].html +5 -5
  220. mage_ai/server/frontend_dist/settings/workspace/permissions.html +5 -5
  221. mage_ai/server/frontend_dist/settings/workspace/preferences.html +5 -5
  222. mage_ai/server/frontend_dist/settings/workspace/roles/[...slug].html +5 -5
  223. mage_ai/server/frontend_dist/settings/workspace/roles.html +5 -5
  224. mage_ai/server/frontend_dist/settings/workspace/sync-data.html +5 -5
  225. mage_ai/server/frontend_dist/settings/workspace/users/[...slug].html +5 -5
  226. mage_ai/server/frontend_dist/settings/workspace/users.html +5 -5
  227. mage_ai/server/frontend_dist/settings.html +2 -2
  228. mage_ai/server/frontend_dist/sign-in.html +17 -17
  229. mage_ai/server/frontend_dist/templates/[...slug].html +5 -5
  230. mage_ai/server/frontend_dist/templates.html +5 -5
  231. mage_ai/server/frontend_dist/terminal.html +5 -5
  232. mage_ai/server/frontend_dist/test.html +15 -15
  233. mage_ai/server/frontend_dist/triggers.html +5 -5
  234. mage_ai/server/frontend_dist/version-control.html +5 -5
  235. mage_ai/server/frontend_dist_base_path_template/404.html +2 -2
  236. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/1749-9a6276b2918fdae1.js +1 -0
  237. mage_ai/server/{frontend_dist/_next/static/chunks/7519-8c29bbb92e03cc77.js → frontend_dist_base_path_template/_next/static/chunks/1845-5ce774d5ab81ed57.js} +1 -1
  238. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/1952-ac7722e8b1ab88fe.js +1 -0
  239. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/3419-f8d518d024e7b5c8.js +1 -0
  240. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/4267-fd4d8049e83178de.js +1 -0
  241. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/4366-93e09e5a4a7e182c.js +1 -0
  242. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/5457-949640f4037bf12f.js +1 -0
  243. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/5499-76cf8f023c6b0985.js +1 -0
  244. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/553-7f7919e14392ca67.js +1 -0
  245. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/5638-a65610405a70961c.js +1 -0
  246. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/5810-12eadc488265d55b.js +1 -0
  247. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/5820-28adeabb5cda2b96.js +1 -0
  248. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/595-0d174b1f9fbfce4f.js +1 -0
  249. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/600-705fe234320ec5de.js +1 -0
  250. mage_ai/server/{frontend_dist/_next/static/chunks/3122-f27de34d0b5426af.js → frontend_dist_base_path_template/_next/static/chunks/6285-e9b45335bfb9ccaf.js} +1 -1
  251. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/6333-bc1b433b428a9095.js +1 -0
  252. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/{5397-b5f2e477acc6bd6b.js → 6965-c613d1834c8ed92d.js} +1 -1
  253. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/{7022-18fde36eb46e1d65.js → 7022-070ec0144a4d029c.js} +1 -1
  254. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/722-a1584445357a276c.js +1 -0
  255. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/{7858-c83d25349d0e980f.js → 7858-d9df72e95e438284.js} +1 -1
  256. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/8264-0d582a6ca33c3dfa.js +1 -0
  257. mage_ai/server/{frontend_dist/_next/static/chunks/3684-cbda680fd8927d07.js → frontend_dist_base_path_template/_next/static/chunks/8432-f191e39f9b5893f2.js} +1 -1
  258. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/90-a7308bae028d7001.js +1 -0
  259. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/9264-1d4f0327d42fed91.js +1 -0
  260. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/9618-2c5045255ac5a6e7.js +1 -0
  261. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/{976-27c4eed1c9b20c44.js → 976-18c98af60b76f1a7.js} +1 -1
  262. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/framework-22b71764bf44ede4.js +1 -0
  263. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/_app-ebef928183f9a3bb.js +1 -0
  264. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/block-layout-a24cb24b6f08bbc9.js +1 -0
  265. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/compute-419775ca1293b354.js +1 -0
  266. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/files-0f2d4be6fdca86ca.js +1 -0
  267. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/global-data-products/{[...slug]-3f6fc312f67ff72e.js → [...slug]-cfd68e760ae00958.js} +1 -1
  268. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/{global-data-products-f4cd03036c3e8723.js → global-data-products-c3b79ef31007f95b.js} +1 -1
  269. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/global-hooks/[...slug]-77edfa32d000e88b.js +1 -0
  270. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/global-hooks-e561ae38cf5592e8.js +1 -0
  271. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/manage/files-449a022f2f0f2d94.js +1 -0
  272. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/manage/settings-60845f0b59142f32.js +1 -0
  273. mage_ai/server/{frontend_dist/_next/static/chunks/pages/manage/users/[user]-1d9b298fdceabbf1.js → frontend_dist_base_path_template/_next/static/chunks/pages/manage/users/[user]-9384c5f1efa2ac18.js} +1 -1
  274. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/manage/users/new-abd8571907664fdf.js +1 -0
  275. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/manage/{users-a7c970122a10afdc.js → users-28a930b148d99766.js} +1 -1
  276. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/manage-f83deb790548693b.js +1 -0
  277. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/oauth-8bb62c4f6a511c43.js +1 -0
  278. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/overview-f0c40645f385f23f.js +1 -0
  279. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/{pipeline-runs-c79819d6826e5416.js → pipeline-runs-b35d37bfba8fbccc.js} +1 -1
  280. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/backfills/[...slug]-10e9a2d19541caa2.js +1 -0
  281. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/backfills-c8d3a5289ab93f88.js +1 -0
  282. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/dashboard-571c0962333b92f0.js +1 -0
  283. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/edit-ff7e9108502f5716.js +1 -0
  284. mage_ai/server/{frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/logs-a52d2d3e0c2978f4.js → frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/logs-ef680455ae54ccbe.js} +1 -1
  285. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/monitors/block-runs-ddddcddd2f74b4f6.js +1 -0
  286. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/monitors/block-runtime-4a238307feddb522.js +1 -0
  287. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/monitors-e051057d9fe94f23.js +1 -0
  288. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/runs/{[run]-4977276c8f84b5f4.js → [run]-0691711636fa95c7.js} +1 -1
  289. mage_ai/server/{frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/runs-ce717786f31e8f04.js → frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/runs-2d20b2cd08907afd.js} +1 -1
  290. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/settings-2914e326a5f1ffe0.js +1 -0
  291. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/syncs-b75bf17498e87354.js +1 -0
  292. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/triggers/[...slug]-3a7500e6e53084d3.js +1 -0
  293. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/triggers-c0e551d265a8d467.js +1 -0
  294. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/{[pipeline]-35fe7762cb83a733.js → [pipeline]-02c843b9c8418bb5.js} +1 -1
  295. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines-e47db5c3eaf683af.js +1 -0
  296. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/account/profile-55ac955dfa9a5a8d.js +1 -0
  297. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/workspace/permissions/{[...slug]-d6a62284c7c99cb3.js → [...slug]-b78b1be5b9ed84b9.js} +1 -1
  298. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/workspace/{permissions-b1389695f758c32b.js → permissions-37b78a436eeab258.js} +1 -1
  299. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/workspace/preferences-29c92a9bc54ae5cd.js +1 -0
  300. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/workspace/roles/{[...slug]-0bdb66265286ab22.js → [...slug]-db05a80d18c168e5.js} +1 -1
  301. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/workspace/{roles-e04e18fc295ca76a.js → roles-f55c77e4f46c8d33.js} +1 -1
  302. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/workspace/sync-data-2a1f8737561fdd94.js +1 -0
  303. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/workspace/users/{[...slug]-0267358c91122109.js → [...slug]-e3bf6e5d8bb250c4.js} +1 -1
  304. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/workspace/{users-50fed18bb9b8d142.js → users-20f0a050a42a015d.js} +1 -1
  305. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/{settings-56f83205752b1323.js → settings-0f0121db7f5ff93d.js} +1 -1
  306. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/sign-in-99e2748e3c1d57a3.js +1 -0
  307. mage_ai/server/{frontend_dist/_next/static/chunks/pages/templates/[...slug]-9370551ffa462144.js → frontend_dist_base_path_template/_next/static/chunks/pages/templates/[...slug]-f44ccd1499ffd23a.js} +1 -1
  308. mage_ai/server/{frontend_dist/_next/static/chunks/pages/templates-3cff90df13a1a755.js → frontend_dist_base_path_template/_next/static/chunks/pages/templates-1bfaa1c50e844813.js} +1 -1
  309. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/terminal-ed121e305169cf1c.js +1 -0
  310. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/test-9ae68758102cc843.js +1 -0
  311. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/{triggers-ffaab4c013e62ba1.js → triggers-572d82d6eb7a5d43.js} +1 -1
  312. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/version-control-2d26d80370a2e481.js +1 -0
  313. mage_ai/server/frontend_dist_base_path_template/_next/static/uPDjJYpJMst1q6psbRyte/_buildManifest.js +1 -0
  314. mage_ai/server/frontend_dist_base_path_template/block-layout.html +2 -2
  315. mage_ai/server/frontend_dist_base_path_template/compute.html +2 -2
  316. mage_ai/server/frontend_dist_base_path_template/files.html +2 -2
  317. mage_ai/server/frontend_dist_base_path_template/global-data-products/[...slug].html +2 -2
  318. mage_ai/server/frontend_dist_base_path_template/global-data-products.html +2 -2
  319. mage_ai/server/frontend_dist_base_path_template/global-hooks/[...slug].html +24 -0
  320. mage_ai/server/frontend_dist_base_path_template/global-hooks.html +24 -0
  321. mage_ai/server/frontend_dist_base_path_template/index.html +2 -2
  322. mage_ai/server/frontend_dist_base_path_template/manage/files.html +2 -2
  323. mage_ai/server/frontend_dist_base_path_template/manage/settings.html +2 -2
  324. mage_ai/server/frontend_dist_base_path_template/manage/users/[user].html +2 -2
  325. mage_ai/server/frontend_dist_base_path_template/manage/users/new.html +2 -2
  326. mage_ai/server/frontend_dist_base_path_template/manage/users.html +2 -2
  327. mage_ai/server/frontend_dist_base_path_template/manage.html +2 -2
  328. mage_ai/server/frontend_dist_base_path_template/oauth.html +3 -3
  329. mage_ai/server/frontend_dist_base_path_template/overview.html +2 -2
  330. mage_ai/server/frontend_dist_base_path_template/pipeline-runs.html +2 -2
  331. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/backfills/[...slug].html +2 -2
  332. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/backfills.html +2 -2
  333. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/dashboard.html +2 -2
  334. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/edit.html +2 -2
  335. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/logs.html +2 -2
  336. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/monitors/block-runs.html +2 -2
  337. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/monitors/block-runtime.html +2 -2
  338. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/monitors.html +2 -2
  339. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/runs/[run].html +2 -2
  340. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/runs.html +2 -2
  341. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/settings.html +2 -2
  342. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/syncs.html +2 -2
  343. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/triggers/[...slug].html +2 -2
  344. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/triggers.html +2 -2
  345. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline].html +2 -2
  346. mage_ai/server/frontend_dist_base_path_template/pipelines.html +2 -2
  347. mage_ai/server/frontend_dist_base_path_template/settings/account/profile.html +2 -2
  348. mage_ai/server/frontend_dist_base_path_template/settings/workspace/permissions/[...slug].html +2 -2
  349. mage_ai/server/frontend_dist_base_path_template/settings/workspace/permissions.html +2 -2
  350. mage_ai/server/frontend_dist_base_path_template/settings/workspace/preferences.html +2 -2
  351. mage_ai/server/frontend_dist_base_path_template/settings/workspace/roles/[...slug].html +2 -2
  352. mage_ai/server/frontend_dist_base_path_template/settings/workspace/roles.html +2 -2
  353. mage_ai/server/frontend_dist_base_path_template/settings/workspace/sync-data.html +2 -2
  354. mage_ai/server/frontend_dist_base_path_template/settings/workspace/users/[...slug].html +2 -2
  355. mage_ai/server/frontend_dist_base_path_template/settings/workspace/users.html +2 -2
  356. mage_ai/server/frontend_dist_base_path_template/settings.html +2 -2
  357. mage_ai/server/frontend_dist_base_path_template/sign-in.html +9 -9
  358. mage_ai/server/frontend_dist_base_path_template/templates/[...slug].html +2 -2
  359. mage_ai/server/frontend_dist_base_path_template/templates.html +2 -2
  360. mage_ai/server/frontend_dist_base_path_template/terminal.html +2 -2
  361. mage_ai/server/frontend_dist_base_path_template/test.html +14 -14
  362. mage_ai/server/frontend_dist_base_path_template/triggers.html +2 -2
  363. mage_ai/server/frontend_dist_base_path_template/version-control.html +2 -2
  364. mage_ai/server/server.py +43 -15
  365. mage_ai/server/utils/output_display.py +6 -0
  366. mage_ai/server/websocket_server.py +14 -0
  367. mage_ai/services/aws/ecs/config.py +11 -8
  368. mage_ai/services/aws/emr/config.py +1 -0
  369. mage_ai/services/aws/emr/constants.py +1 -0
  370. mage_ai/services/aws/emr/emr.py +20 -7
  371. mage_ai/services/compute/__init__.py +0 -0
  372. mage_ai/services/compute/aws/__init__.py +0 -0
  373. mage_ai/services/compute/aws/constants.py +21 -0
  374. mage_ai/services/compute/aws/models.py +459 -0
  375. mage_ai/services/compute/aws/steps.py +482 -0
  376. mage_ai/services/compute/constants.py +27 -0
  377. mage_ai/services/compute/models.py +212 -0
  378. mage_ai/services/k8s/job_manager.py +3 -0
  379. mage_ai/services/spark/api/aws_emr.py +38 -0
  380. mage_ai/services/spark/api/base.py +7 -4
  381. mage_ai/services/spark/api/constants.py +4 -0
  382. mage_ai/services/spark/api/local.py +25 -24
  383. mage_ai/services/spark/api/service.py +15 -5
  384. mage_ai/services/spark/constants.py +1 -1
  385. mage_ai/services/spark/models/applications.py +45 -3
  386. mage_ai/services/spark/models/base.py +3 -19
  387. mage_ai/services/spark/models/environments.py +16 -11
  388. mage_ai/services/spark/models/executors.py +2 -2
  389. mage_ai/services/spark/models/sqls.py +46 -15
  390. mage_ai/services/spark/models/stages.py +55 -32
  391. mage_ai/services/spark/models/threads.py +2 -2
  392. mage_ai/services/spark/utils.py +22 -6
  393. mage_ai/services/ssh/__init__.py +0 -0
  394. mage_ai/services/ssh/aws/__init__.py +0 -0
  395. mage_ai/services/ssh/aws/emr/__init__.py +0 -0
  396. mage_ai/services/ssh/aws/emr/constants.py +10 -0
  397. mage_ai/services/ssh/aws/emr/models.py +326 -0
  398. mage_ai/services/ssh/aws/emr/utils.py +151 -0
  399. mage_ai/settings/__init__.py +16 -1
  400. mage_ai/settings/secret_generation.py +7 -0
  401. mage_ai/settings/sso.py +20 -0
  402. mage_ai/shared/hash.py +17 -1
  403. mage_ai/shared/models.py +253 -0
  404. mage_ai/streaming/constants.py +2 -0
  405. mage_ai/streaming/sources/activemq.py +89 -0
  406. mage_ai/streaming/sources/nats_js.py +182 -0
  407. mage_ai/streaming/sources/source_factory.py +8 -0
  408. mage_ai/tests/ai/test_ai_functions.py +53 -8
  409. mage_ai/tests/api/endpoints/test_oauths.py +33 -0
  410. mage_ai/tests/api/endpoints/test_projects.py +1 -0
  411. mage_ai/tests/api/endpoints/test_workspaces.py +55 -0
  412. mage_ai/tests/api/operations/test_base.py +7 -5
  413. mage_ai/tests/api/operations/test_operations.py +0 -1
  414. mage_ai/tests/api/operations/test_operations_with_hooks.py +577 -0
  415. mage_ai/tests/api/operations/test_syncs.py +0 -1
  416. mage_ai/tests/api/operations/test_users.py +13 -2
  417. mage_ai/tests/data_preparation/executors/test_block_executor.py +1 -0
  418. mage_ai/tests/data_preparation/models/global_hooks/__init__.py +0 -0
  419. mage_ai/tests/data_preparation/models/global_hooks/test_global_hooks.py +575 -0
  420. mage_ai/tests/data_preparation/models/global_hooks/test_hook.py +760 -0
  421. mage_ai/tests/data_preparation/models/global_hooks/test_utils.py +33 -0
  422. mage_ai/tests/data_preparation/models/test_pipeline.py +5 -0
  423. mage_ai/tests/data_preparation/test_repo_manager.py +11 -0
  424. mage_ai/tests/data_preparation/test_templates.py +1 -0
  425. mage_ai/tests/factory.py +132 -10
  426. mage_ai/tests/orchestration/queue/test_process_queue.py +15 -2
  427. mage_ai/tests/orchestration/test_pipeline_scheduler.py +447 -79
  428. mage_ai/tests/services/aws/ecs/__init__.py +0 -0
  429. mage_ai/tests/services/aws/ecs/test_config.py +144 -0
  430. mage_ai/tests/services/k8s/test_job_manager.py +22 -1
  431. mage_ai/tests/shared/mixins.py +291 -0
  432. mage_ai/tests/shared/test_hash.py +17 -1
  433. mage_ai/tests/streaming/sources/test_activemq.py +32 -0
  434. mage_ai/tests/streaming/sources/test_nats_js.py +32 -0
  435. mage_ai/tests/streaming/sources/test_source_factory.py +26 -1
  436. {mage_ai-0.9.44.dist-info → mage_ai-0.9.46.dist-info}/METADATA +28 -66
  437. {mage_ai-0.9.44.dist-info → mage_ai-0.9.46.dist-info}/RECORD +443 -364
  438. mage_ai/authentication/oauth/active_directory.py +0 -17
  439. mage_ai/server/frontend_dist/_next/static/RPXiX8RpZ7oO-yeaEtV2c/_buildManifest.js +0 -1
  440. mage_ai/server/frontend_dist/_next/static/chunks/1125-91d3ce33140ef041.js +0 -1
  441. mage_ai/server/frontend_dist/_next/static/chunks/1749-607014ecf28268bf.js +0 -1
  442. mage_ai/server/frontend_dist/_next/static/chunks/1952-573c7fc7ad84da6e.js +0 -1
  443. mage_ai/server/frontend_dist/_next/static/chunks/3004-231cad9039ae5dcb.js +0 -1
  444. mage_ai/server/frontend_dist/_next/static/chunks/3419-0873e170ef7d6303.js +0 -1
  445. mage_ai/server/frontend_dist/_next/static/chunks/3932-0ceca9599d6e6d00.js +0 -1
  446. mage_ai/server/frontend_dist/_next/static/chunks/4267-335766a915ee2fa9.js +0 -1
  447. mage_ai/server/frontend_dist/_next/static/chunks/5457-8be2e0a3fe0ba64b.js +0 -1
  448. mage_ai/server/frontend_dist/_next/static/chunks/5499-bca977f466e259e1.js +0 -1
  449. mage_ai/server/frontend_dist/_next/static/chunks/553-edf533e634e85192.js +0 -1
  450. mage_ai/server/frontend_dist/_next/static/chunks/5810-37c6091b29a1fe53.js +0 -1
  451. mage_ai/server/frontend_dist/_next/static/chunks/600-0733eb84f0a0a9e0.js +0 -1
  452. mage_ai/server/frontend_dist/_next/static/chunks/6333-53b6ebbef95a3691.js +0 -1
  453. mage_ai/server/frontend_dist/_next/static/chunks/722-3fff38a9019369fe.js +0 -1
  454. mage_ai/server/frontend_dist/_next/static/chunks/8224-39a93ee1058b6069.js +0 -1
  455. mage_ai/server/frontend_dist/_next/static/chunks/8264-6ef8fdb195694807.js +0 -1
  456. mage_ai/server/frontend_dist/_next/static/chunks/9264-1b5c4b071ed544c3.js +0 -1
  457. mage_ai/server/frontend_dist/_next/static/chunks/framework-7c365855dab1bf41.js +0 -1
  458. mage_ai/server/frontend_dist/_next/static/chunks/pages/_app-a4a660fa14cf05a9.js +0 -1
  459. mage_ai/server/frontend_dist/_next/static/chunks/pages/block-layout-c465c14d48392b11.js +0 -1
  460. mage_ai/server/frontend_dist/_next/static/chunks/pages/compute-b1f8d5a7a9a30f2d.js +0 -1
  461. mage_ai/server/frontend_dist/_next/static/chunks/pages/files-93c094bad0f299fb.js +0 -1
  462. mage_ai/server/frontend_dist/_next/static/chunks/pages/manage/files-891e5bd5935f7473.js +0 -1
  463. mage_ai/server/frontend_dist/_next/static/chunks/pages/manage/settings-d2e4ee4e68d36807.js +0 -1
  464. mage_ai/server/frontend_dist/_next/static/chunks/pages/manage/users/new-4a49126fcfe8ced0.js +0 -1
  465. mage_ai/server/frontend_dist/_next/static/chunks/pages/manage-5f8c5d0bc6ad1113.js +0 -1
  466. mage_ai/server/frontend_dist/_next/static/chunks/pages/oauth-09467512a85c96ed.js +0 -1
  467. mage_ai/server/frontend_dist/_next/static/chunks/pages/overview-31bde04718d0d3a8.js +0 -1
  468. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/backfills/[...slug]-96718f95103d7844.js +0 -1
  469. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/backfills-a9266d353f288e8c.js +0 -1
  470. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/dashboard-b5c29c852262312e.js +0 -1
  471. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/edit-5d525454ff7aeb3f.js +0 -1
  472. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/monitors/block-runs-883f4ae9a4a264c0.js +0 -1
  473. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/monitors/block-runtime-c65be964e6398cb7.js +0 -1
  474. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/monitors-1f5b4a974bd39740.js +0 -1
  475. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/settings-074c32397d341de9.js +0 -1
  476. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/syncs-50f5d8706ed0bc73.js +0 -1
  477. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/triggers/[...slug]-e151c1552fcb67bd.js +0 -1
  478. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/triggers-cc36f0f8c73fee4b.js +0 -1
  479. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines-8336c4326f1e7d96.js +0 -1
  480. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/account/profile-01dd679e4a21e0d9.js +0 -1
  481. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/preferences-4d9051c073a9b2ff.js +0 -1
  482. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/sync-data-88d41c33b8fcb300.js +0 -1
  483. mage_ai/server/frontend_dist/_next/static/chunks/pages/sign-in-d859e07561eb9010.js +0 -1
  484. mage_ai/server/frontend_dist/_next/static/chunks/pages/terminal-578d862f3e56e6e6.js +0 -1
  485. mage_ai/server/frontend_dist/_next/static/chunks/pages/test-1c0588d685b909b9.js +0 -1
  486. mage_ai/server/frontend_dist/_next/static/chunks/pages/version-control-e284cf1535d93798.js +0 -1
  487. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/1125-91d3ce33140ef041.js +0 -1
  488. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/1749-607014ecf28268bf.js +0 -1
  489. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/1952-573c7fc7ad84da6e.js +0 -1
  490. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/3004-231cad9039ae5dcb.js +0 -1
  491. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/3419-0873e170ef7d6303.js +0 -1
  492. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/3932-0ceca9599d6e6d00.js +0 -1
  493. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/4267-335766a915ee2fa9.js +0 -1
  494. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/5457-8be2e0a3fe0ba64b.js +0 -1
  495. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/5499-bca977f466e259e1.js +0 -1
  496. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/553-edf533e634e85192.js +0 -1
  497. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/5810-37c6091b29a1fe53.js +0 -1
  498. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/600-0733eb84f0a0a9e0.js +0 -1
  499. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/6333-53b6ebbef95a3691.js +0 -1
  500. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/722-3fff38a9019369fe.js +0 -1
  501. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/8224-39a93ee1058b6069.js +0 -1
  502. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/8264-6ef8fdb195694807.js +0 -1
  503. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/9264-1b5c4b071ed544c3.js +0 -1
  504. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/framework-7c365855dab1bf41.js +0 -1
  505. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/_app-a4a660fa14cf05a9.js +0 -1
  506. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/block-layout-c465c14d48392b11.js +0 -1
  507. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/compute-b1f8d5a7a9a30f2d.js +0 -1
  508. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/files-93c094bad0f299fb.js +0 -1
  509. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/manage/files-891e5bd5935f7473.js +0 -1
  510. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/manage/settings-d2e4ee4e68d36807.js +0 -1
  511. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/manage/users/new-4a49126fcfe8ced0.js +0 -1
  512. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/manage-5f8c5d0bc6ad1113.js +0 -1
  513. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/oauth-09467512a85c96ed.js +0 -1
  514. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/overview-31bde04718d0d3a8.js +0 -1
  515. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/backfills/[...slug]-96718f95103d7844.js +0 -1
  516. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/backfills-a9266d353f288e8c.js +0 -1
  517. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/dashboard-b5c29c852262312e.js +0 -1
  518. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/edit-5d525454ff7aeb3f.js +0 -1
  519. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/monitors/block-runs-883f4ae9a4a264c0.js +0 -1
  520. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/monitors/block-runtime-c65be964e6398cb7.js +0 -1
  521. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/monitors-1f5b4a974bd39740.js +0 -1
  522. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/settings-074c32397d341de9.js +0 -1
  523. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/syncs-50f5d8706ed0bc73.js +0 -1
  524. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/triggers/[...slug]-e151c1552fcb67bd.js +0 -1
  525. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/triggers-cc36f0f8c73fee4b.js +0 -1
  526. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines-8336c4326f1e7d96.js +0 -1
  527. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/account/profile-01dd679e4a21e0d9.js +0 -1
  528. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/workspace/preferences-4d9051c073a9b2ff.js +0 -1
  529. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/workspace/sync-data-88d41c33b8fcb300.js +0 -1
  530. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/sign-in-d859e07561eb9010.js +0 -1
  531. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/terminal-578d862f3e56e6e6.js +0 -1
  532. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/test-1c0588d685b909b9.js +0 -1
  533. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/version-control-e284cf1535d93798.js +0 -1
  534. mage_ai/server/frontend_dist_base_path_template/_next/static/rNR5JgSxO3eA2BWGa_i7U/_buildManifest.js +0 -1
  535. /mage_ai/server/frontend_dist/_next/static/{RPXiX8RpZ7oO-yeaEtV2c → 9jB4XPuz6BzxBcG9VNao5}/_ssgManifest.js +0 -0
  536. /mage_ai/server/frontend_dist_base_path_template/_next/static/{rNR5JgSxO3eA2BWGa_i7U → uPDjJYpJMst1q6psbRyte}/_ssgManifest.js +0 -0
  537. {mage_ai-0.9.44.dist-info → mage_ai-0.9.46.dist-info}/LICENSE +0 -0
  538. {mage_ai-0.9.44.dist-info → mage_ai-0.9.46.dist-info}/WHEEL +0 -0
  539. {mage_ai-0.9.44.dist-info → mage_ai-0.9.46.dist-info}/entry_points.txt +0 -0
  540. {mage_ai-0.9.44.dist-info → mage_ai-0.9.46.dist-info}/top_level.txt +0 -0
@@ -1,22 +1,13 @@
1
- import json
2
- import os
3
1
  import urllib.parse
4
- import uuid
5
2
  from datetime import datetime, timedelta
6
3
  from urllib.parse import parse_qs, urlparse
7
4
 
8
- import aiohttp
9
-
10
5
  from mage_ai.api.errors import ApiError
11
6
  from mage_ai.api.resources.GenericResource import GenericResource
12
7
  from mage_ai.authentication.oauth2 import generate_access_token
13
8
  from mage_ai.authentication.oauth.constants import (
14
- ACTIVE_DIRECTORY_CLIENT_ID,
15
- GHE_CLIENT_ID_ENV_VAR,
16
- GHE_CLIENT_SECRET_ENV_VAR,
17
9
  GITHUB_CLIENT_ID,
18
10
  GITHUB_STATE,
19
- OAUTH_PROVIDER_ACTIVE_DIRECTORY,
20
11
  OAUTH_PROVIDER_GHE,
21
12
  OAUTH_PROVIDER_GITHUB,
22
13
  VALID_OAUTH_PROVIDERS,
@@ -26,13 +17,35 @@ from mage_ai.authentication.oauth.utils import (
26
17
  access_tokens_for_client,
27
18
  add_access_token_to_query,
28
19
  )
20
+ from mage_ai.authentication.providers.constants import NAME_TO_PROVIDER
29
21
  from mage_ai.data_preparation.git.api import get_oauth_client_id
30
22
  from mage_ai.orchestration.db import safe_db_query
31
23
  from mage_ai.orchestration.db.models.oauth import Oauth2AccessToken, Oauth2Application
32
- from mage_ai.settings import ACTIVE_DIRECTORY_DIRECTORY_ID, ROUTES_BASE_PATH
33
24
 
34
25
 
35
26
  class OauthResource(GenericResource):
27
+ @classmethod
28
+ @safe_db_query
29
+ async def collection(self, query, meta, user, **kwargs):
30
+ redirect_uri = query.get('redirect_uri', [None])
31
+ if redirect_uri:
32
+ redirect_uri = redirect_uri[0]
33
+
34
+ oauths = []
35
+ for provider, provider_class in NAME_TO_PROVIDER.items():
36
+ try:
37
+ provider_instance = provider_class()
38
+ auth_url_response = provider_instance.get_auth_url_response(
39
+ redirect_uri=redirect_uri
40
+ )
41
+ if auth_url_response:
42
+ auth_url_response['provider'] = provider
43
+ oauths.append(auth_url_response)
44
+ except Exception:
45
+ continue
46
+
47
+ return self.build_result_set(oauths, user, **kwargs)
48
+
36
49
  @classmethod
37
50
  @safe_db_query
38
51
  def create(self, payload, user, **kwargs):
@@ -107,6 +120,12 @@ class OauthResource(GenericResource):
107
120
  provider = OAUTH_PROVIDER_GHE
108
121
  else:
109
122
  provider = pk
123
+
124
+ provider_class = NAME_TO_PROVIDER.get(provider)
125
+ provider_instance = None
126
+ if provider_class is not None:
127
+ provider_instance = provider_class()
128
+
110
129
  access_tokens = access_tokens_for_client(
111
130
  get_oauth_client_id(provider),
112
131
  user=user,
@@ -121,38 +140,22 @@ class OauthResource(GenericResource):
121
140
  # If an oauth code is provided, we need to exchange it for an access token for
122
141
  # the provider and return the redirect uri.
123
142
  elif code:
124
- if OAUTH_PROVIDER_GHE == pk:
125
- # Fetch access token for GitHub Enterprise and add it to the redirect URI.
126
-
127
- # 1. Get GHE client credentials from environment variables.
128
- # 2. Obtain an access token from the GitHub Enterprise OAuth service.
129
- # 3. Update uri query parameters with provider and access token from GHE API.
130
- # 4. Recreate and return the uri to include the access token and provider.
143
+ if provider_instance is not None:
144
+ # 1. Obtain an access token from the Oauth provider.
145
+ # 2. Update uri query parameters with provider and access token from response.
146
+ # 3. Recreate and return the uri to include the access token and provider.
131
147
  parsed_url = urlparse(urllib.parse.unquote(redirect_uri))
132
148
  parsed_url_query = parse_qs(parsed_url.query)
133
149
 
134
- query = {'provider': pk}
150
+ query = {'provider': provider}
135
151
  for k, v in parsed_url_query.items():
136
- if type(v) is list:
152
+ if isinstance(v, list):
137
153
  v = ','.join(v)
138
154
  query[k] = v
139
155
 
140
- data = dict()
141
- async with aiohttp.ClientSession() as session:
142
- async with session.post(
143
- f'{ghe_hostname}/login/oauth/access_token',
144
- headers={
145
- 'Accept': 'application/json',
146
- },
147
- data=dict(
148
- client_id=os.getenv(GHE_CLIENT_ID_ENV_VAR),
149
- client_secret=os.getenv(GHE_CLIENT_SECRET_ENV_VAR),
150
- code=code,
151
- ),
152
- timeout=20,
153
- ) as response:
154
- data = await response.json()
155
-
156
+ data = await provider_instance.get_access_token_response(
157
+ code, redirect_uri=redirect_uri
158
+ )
156
159
  query = add_access_token_to_query(data, query)
157
160
 
158
161
  parts = redirect_uri.split('?')
@@ -168,74 +171,33 @@ class OauthResource(GenericResource):
168
171
  model['url'] = redirect_uri_final
169
172
  # Otherwise, return the authorization url to start the oauth flow.
170
173
  else:
171
- if OAUTH_PROVIDER_GITHUB == pk:
172
- if ghe_hostname:
173
- parsed_url = urlparse(urllib.parse.unquote(redirect_uri))
174
- base_url = parsed_url.scheme + '://' + parsed_url.netloc
175
- if ROUTES_BASE_PATH:
176
- base_url += f'/{ROUTES_BASE_PATH}'
177
- redirect_uri_query = urllib.parse.urlencode(
178
- dict(
179
- provider=OAUTH_PROVIDER_GHE,
180
- redirect_uri=redirect_uri,
174
+ if OAUTH_PROVIDER_GITHUB == provider:
175
+ query = dict(
176
+ client_id=GITHUB_CLIENT_ID,
177
+ redirect_uri=urllib.parse.quote_plus(
178
+ '?'.join(
179
+ [
180
+ f'https://api.mage.ai/v1/oauth/{pk}',
181
+ f'redirect_uri={urllib.parse.unquote(redirect_uri)}',
182
+ ]
181
183
  )
182
- )
183
- query = dict(
184
- client_id=os.getenv(GHE_CLIENT_ID_ENV_VAR),
185
- redirect_uri=urllib.parse.quote_plus(
186
- f'{base_url}/oauth?{redirect_uri_query}',
187
- ),
188
- scope='repo',
189
- state=uuid.uuid4().hex,
190
- )
191
- host = ghe_hostname
192
- else:
193
- query = dict(
194
- client_id=GITHUB_CLIENT_ID,
195
- redirect_uri=urllib.parse.quote_plus(
196
- '?'.join(
197
- [
198
- f'https://api.mage.ai/v1/oauth/{pk}',
199
- f'redirect_uri={urllib.parse.unquote(redirect_uri)}',
200
- ]
201
- )
202
- ),
203
- scope='repo',
204
- state=GITHUB_STATE,
205
- )
206
- host = 'https://github.com'
184
+ ),
185
+ scope='repo',
186
+ state=GITHUB_STATE,
187
+ )
207
188
  query_strings = []
208
189
  for k, v in query.items():
209
190
  query_strings.append(f'{k}={v}')
210
191
 
211
- model['url'] = f"{host}/login/oauth/authorize?{'&'.join(query_strings)}"
212
- elif OAUTH_PROVIDER_ACTIVE_DIRECTORY == pk:
213
- ad_directory_id = ACTIVE_DIRECTORY_DIRECTORY_ID
214
- if ad_directory_id:
215
- from requests.models import PreparedRequest
216
-
217
- req = PreparedRequest()
218
- req.prepare_url(redirect_uri, dict(provider=pk))
219
- query = dict(
220
- client_id=ACTIVE_DIRECTORY_CLIENT_ID,
221
- redirect_uri=f'https://api.mage.ai/v1/oauth/{pk}',
222
- response_type='code',
223
- scope='User.Read',
224
- state=urllib.parse.quote_plus(
225
- json.dumps(
226
- dict(
227
- redirect_uri=req.url,
228
- tenant_id=ad_directory_id,
229
- )
230
- )
231
- ),
232
- )
233
- query_strings = []
234
- for k, v in query.items():
235
- query_strings.append(f'{k}={v}')
236
- model[
237
- 'url'
238
- ] = f"https://login.microsoftonline.com/{ad_directory_id}/oauth2/v2.0/authorize?{'&'.join(query_strings)}" # noqa: E501
192
+ model[
193
+ 'url'
194
+ ] = f"https://github.com/login/oauth/authorize?{'&'.join(query_strings)}"
195
+ elif provider_instance is not None:
196
+ resp = provider_instance.get_auth_url_response(
197
+ redirect_uri=redirect_uri
198
+ )
199
+ if resp:
200
+ model.update(resp)
239
201
 
240
202
  return self(model, user, **kwargs)
241
203
 
@@ -67,15 +67,15 @@ class PipelineResource(BaseResource):
67
67
  tags = new_tags
68
68
 
69
69
  pipeline_types = query.get('type[]', [])
70
- if pipeline_types:
70
+ if pipeline_types and len(pipeline_types) == 1:
71
71
  pipeline_types = pipeline_types[0]
72
- if pipeline_types:
72
+ if pipeline_types and isinstance(pipeline_types, str):
73
73
  pipeline_types = pipeline_types.split(',')
74
74
 
75
75
  pipeline_statuses = query.get('status[]', [])
76
- if pipeline_statuses:
76
+ if pipeline_statuses and len(pipeline_statuses) == 1:
77
77
  pipeline_statuses = pipeline_statuses[0]
78
- if pipeline_statuses:
78
+ if pipeline_statuses and isinstance(pipeline_statuses, str):
79
79
  pipeline_statuses = pipeline_statuses.split(',')
80
80
 
81
81
  from_history_days = query.get('from_history_days', [None])
@@ -3,6 +3,7 @@ import uuid
3
3
  from sqlalchemy.orm import selectinload
4
4
 
5
5
  from mage_ai.api.resources.DatabaseResource import DatabaseResource
6
+ from mage_ai.data_preparation.models.pipeline import Pipeline
6
7
  from mage_ai.data_preparation.models.triggers import (
7
8
  Trigger,
8
9
  add_or_update_trigger_for_pipeline_and_persist,
@@ -146,6 +147,20 @@ class PipelineScheduleResource(DatabaseResource):
146
147
  if 'token' not in payload:
147
148
  payload['token'] = uuid.uuid4().hex
148
149
 
150
+ if pipeline.should_save_trigger_in_code_automatically():
151
+ def _callback(resource, kwargs=kwargs, user=user):
152
+ from mage_ai.api.resources.PipelineTriggerResource import (
153
+ PipelineTriggerResource,
154
+ )
155
+
156
+ PipelineTriggerResource.create(
157
+ dict(pipeline_schedule_id=resource.id),
158
+ user,
159
+ **kwargs,
160
+ )
161
+
162
+ self.on_create_callback = _callback
163
+
149
164
  return super().create(payload, user, **kwargs)
150
165
 
151
166
  @safe_db_query
@@ -257,22 +272,28 @@ class PipelineScheduleResource(DatabaseResource):
257
272
 
258
273
  resource = super().update(payload)
259
274
  updated_model = resource.model
260
- trigger = Trigger(
261
- name=updated_model.name,
262
- pipeline_uuid=updated_model.pipeline_uuid,
263
- schedule_interval=updated_model.schedule_interval,
264
- schedule_type=updated_model.schedule_type,
265
- settings=updated_model.settings,
266
- sla=updated_model.sla,
267
- start_time=updated_model.start_time,
268
- status=updated_model.status,
269
- variables=updated_model.variables,
270
- )
271
- add_or_update_trigger_for_pipeline_and_persist(
272
- trigger,
273
- updated_model.pipeline_uuid,
274
- update_only_if_exists=True,
275
- )
275
+
276
+ pipeline = Pipeline.get(updated_model.pipeline_uuid)
277
+ if pipeline:
278
+ trigger = Trigger(
279
+ name=updated_model.name,
280
+ pipeline_uuid=updated_model.pipeline_uuid,
281
+ schedule_interval=updated_model.schedule_interval,
282
+ schedule_type=updated_model.schedule_type,
283
+ settings=updated_model.settings,
284
+ sla=updated_model.sla,
285
+ start_time=updated_model.start_time,
286
+ status=updated_model.status,
287
+ variables=updated_model.variables,
288
+ )
289
+
290
+ update_only_if_exists = not pipeline.should_save_trigger_in_code_automatically()
291
+
292
+ add_or_update_trigger_for_pipeline_and_persist(
293
+ trigger,
294
+ pipeline.uuid,
295
+ update_only_if_exists=update_only_if_exists,
296
+ )
276
297
 
277
298
  return self
278
299
 
@@ -86,6 +86,9 @@ class ProjectResource(GenericResource):
86
86
  if 'emr_config' in payload:
87
87
  data['emr_config'] = payload['emr_config']
88
88
 
89
+ if 'pipelines' in payload:
90
+ data['pipelines'] = payload['pipelines']
91
+
89
92
  if 'spark_config' in payload:
90
93
  data['spark_config'] = payload['spark_config']
91
94
 
@@ -100,9 +103,8 @@ class ProjectResource(GenericResource):
100
103
  if should_log_project:
101
104
  await UsageStatisticLogger().project_impression()
102
105
 
103
- if Project(repo_config=repo_config).is_feature_enabled(
104
- FeatureUUID.DATA_INTEGRATION_IN_BATCH_PIPELINE,
105
- ):
106
+ project = Project(repo_config=repo_config)
107
+ if project.is_feature_enabled(FeatureUUID.DATA_INTEGRATION_IN_BATCH_PIPELINE):
106
108
  await BlockActionObjectCache.initialize_cache(replace=True)
107
109
 
108
110
  return self
@@ -4,9 +4,8 @@ from mage_ai.api.errors import ApiError
4
4
  from mage_ai.api.resources.BaseResource import BaseResource
5
5
  from mage_ai.authentication.ldap import new_ldap_connection
6
6
  from mage_ai.authentication.oauth2 import encode_token, generate_access_token
7
- from mage_ai.authentication.oauth.active_directory import get_user_info
8
- from mage_ai.authentication.oauth.constants import OAUTH_PROVIDER_ACTIVE_DIRECTORY
9
7
  from mage_ai.authentication.passwords import verify_password
8
+ from mage_ai.authentication.providers.constants import NAME_TO_PROVIDER
10
9
  from mage_ai.orchestration.db import safe_db_query
11
10
  from mage_ai.orchestration.db.models.oauth import Role, User
12
11
  from mage_ai.settings import AUTHENTICATION_MODE, LDAP_DEFAULT_ACCESS
@@ -23,18 +22,34 @@ class SessionResource(BaseResource):
23
22
  token = payload.get('token')
24
23
  provider = payload.get('provider')
25
24
 
25
+ oauth_client = kwargs.get('oauth_client')
26
+
27
+ # Oauth sign in
26
28
  if token and provider:
27
- if provider == OAUTH_PROVIDER_ACTIVE_DIRECTORY:
28
- user_info = get_user_info(token)
29
- principal_name = user_info.get('userPrincipalName')
30
- user = User.query.filter(User.email == principal_name).first()
29
+ roles = []
30
+ provider_class = NAME_TO_PROVIDER.get(provider)
31
+ if provider_class is not None:
32
+ provider_instance = provider_class()
33
+ user_info = await provider_instance.get_user_info(access_token=token)
34
+ email = user_info.get('email')
35
+ username = user_info.get('username')
36
+ if 'user_roles' in user_info:
37
+ roles = user_info.get('user_roles')
38
+
39
+ if not email:
40
+ error = ApiError.RESOURCE_NOT_FOUND
41
+ error.update({'message': 'Could not get email from oauth provider.'})
42
+ raise ApiError(error)
43
+ else:
44
+ user = User.query.filter(User.email == email).first()
31
45
  if not user: # noqa: E712
32
46
  print('first user login, creating user.')
33
47
  user = User.create(
34
- username=principal_name,
35
- email=principal_name,
48
+ username=username,
49
+ email=email,
50
+ roles_new=roles,
36
51
  )
37
- oauth_token = generate_access_token(user, kwargs['oauth_client'])
52
+ oauth_token = generate_access_token(user, oauth_client)
38
53
  return self(oauth_token, user, **kwargs)
39
54
 
40
55
  error = ApiError.RESOURCE_NOT_FOUND
@@ -1,26 +1,26 @@
1
1
  from mage_ai.api.resources.GenericResource import GenericResource
2
- from mage_ai.services.spark.api.local import LocalAPI
2
+ from mage_ai.api.resources.mixins.spark import SparkApplicationChild
3
3
  from mage_ai.services.spark.models.applications import Application
4
4
  from mage_ai.shared.hash import index_by
5
5
 
6
6
 
7
- class SparkApplicationResource(GenericResource):
7
+ class SparkApplicationResource(GenericResource, SparkApplicationChild):
8
8
  @classmethod
9
9
  async def get_model(self, pk):
10
10
  return Application.load(id=pk)
11
11
 
12
12
  @classmethod
13
13
  async def collection(self, _query, _meta, user, **kwargs):
14
- applications = await LocalAPI().applications()
14
+ applications = await self.build_api().applications()
15
15
  mapping = index_by(lambda x: x.id, applications)
16
16
 
17
17
  applications_cache = Application.get_applications_from_cache()
18
18
  if applications_cache:
19
19
  for application in applications_cache.values():
20
- if application.id in mapping:
20
+ if application.calculated_id() in mapping:
21
21
  continue
22
22
  applications.append(application)
23
- mapping[application.id] = application
23
+ mapping[application.calculated_id()] = application
24
24
 
25
25
  return self.build_result_set(
26
26
  applications,
@@ -1,13 +1,12 @@
1
1
  from mage_ai.api.resources.GenericResource import GenericResource
2
2
  from mage_ai.api.resources.mixins.spark import SparkApplicationChild
3
- from mage_ai.services.spark.api.local import LocalAPI
4
3
 
5
4
 
6
5
  class SparkEnvironmentResource(GenericResource, SparkApplicationChild):
7
6
  @classmethod
8
7
  async def member(self, _pk, user, **kwargs):
9
8
  return self(
10
- await LocalAPI().environment(),
9
+ await self.build_api().environment(),
11
10
  user,
12
11
  **kwargs,
13
12
  )
@@ -1,6 +1,5 @@
1
1
  from mage_ai.api.resources.GenericResource import GenericResource
2
2
  from mage_ai.api.resources.mixins.spark import SparkApplicationChild
3
- from mage_ai.services.spark.api.local import LocalAPI
4
3
  from mage_ai.services.spark.models.executors import Executor
5
4
 
6
5
 
@@ -10,7 +9,7 @@ class SparkExecutorResource(GenericResource, SparkApplicationChild):
10
9
  application_id = await self.get_application_id(**kwargs)
11
10
 
12
11
  return self.build_result_set(
13
- await LocalAPI().executors(application_id=application_id),
12
+ await self.build_api().executors(application_id=application_id),
14
13
  user,
15
14
  **kwargs,
16
15
  )
@@ -1,13 +1,12 @@
1
1
  from mage_ai.api.resources.GenericResource import GenericResource
2
2
  from mage_ai.api.resources.mixins.spark import SparkApplicationChild
3
- from mage_ai.services.spark.api.local import LocalAPI
4
3
 
5
4
 
6
5
  class SparkJobResource(GenericResource, SparkApplicationChild):
7
6
  @classmethod
8
7
  async def collection(self, _query, _meta, user, **kwargs):
9
8
  return self.build_result_set(
10
- await LocalAPI().jobs(),
9
+ await self.build_api().jobs(),
11
10
  user,
12
11
  **kwargs,
13
12
  )
@@ -16,16 +15,14 @@ class SparkJobResource(GenericResource, SparkApplicationChild):
16
15
  async def member(self, pk, user, **kwargs):
17
16
  query_arg = kwargs.get('query')
18
17
 
19
- application_id = query_arg.get('application_id', [])
20
- if application_id:
21
- application_id = application_id[0]
18
+ application_id = self.application_calculated_id_from_query(query_arg)
22
19
 
23
20
  application_spark_ui_url = query_arg.get('application_spark_ui_url', [])
24
21
  if application_spark_ui_url:
25
22
  application_spark_ui_url = application_spark_ui_url[0]
26
23
 
27
24
  return self(
28
- await LocalAPI().job(
25
+ await self.build_api().job(
29
26
  job_id=pk,
30
27
  application_id=application_id,
31
28
  application_spark_ui_url=application_spark_ui_url,
@@ -2,7 +2,6 @@ from functools import reduce
2
2
 
3
3
  from mage_ai.api.resources.GenericResource import GenericResource
4
4
  from mage_ai.api.resources.mixins.spark import SparkApplicationChild
5
- from mage_ai.services.spark.api.local import LocalAPI
6
5
 
7
6
 
8
7
  class SparkSqlResource(GenericResource, SparkApplicationChild):
@@ -16,16 +15,14 @@ class SparkSqlResource(GenericResource, SparkApplicationChild):
16
15
  if length:
17
16
  query['length'] = length
18
17
 
19
- application_id = query_arg.get('application_id', [])
20
- if application_id:
21
- application_id = application_id[0]
18
+ application_id = self.application_calculated_id_from_query(query_arg)
22
19
 
23
20
  application_spark_ui_url = query_arg.get('application_spark_ui_url', [])
24
21
  if application_spark_ui_url:
25
22
  application_spark_ui_url = application_spark_ui_url[0]
26
23
 
27
24
  return self.build_result_set(
28
- await LocalAPI().sqls(
25
+ await self.build_api().sqls(
29
26
  application_id=application_id,
30
27
  application_spark_ui_url=application_spark_ui_url,
31
28
  query=query,
@@ -42,15 +39,13 @@ class SparkSqlResource(GenericResource, SparkApplicationChild):
42
39
  if include_jobs_and_stages:
43
40
  include_jobs_and_stages = include_jobs_and_stages[0]
44
41
 
45
- application_id = query_arg.get('application_id', [])
46
- if application_id:
47
- application_id = application_id[0]
42
+ application_id = self.application_calculated_id_from_query(query_arg)
48
43
 
49
44
  application_spark_ui_url = query_arg.get('application_spark_ui_url', [])
50
45
  if application_spark_ui_url:
51
46
  application_spark_ui_url = application_spark_ui_url[0]
52
47
 
53
- model = await LocalAPI().sql(
48
+ model = await self.build_api().sql(
54
49
  application_id=application_id,
55
50
  application_spark_ui_url=application_spark_ui_url,
56
51
  sql_id=pk,
@@ -59,14 +54,14 @@ class SparkSqlResource(GenericResource, SparkApplicationChild):
59
54
  if include_jobs_and_stages:
60
55
  job_ids = (model.failed_job_ids or []) + (
61
56
  model.running_job_ids or []) + (model.success_job_ids or [])
62
- model.jobs = [await LocalAPI().job(
57
+ model.jobs = [await self.build_api().job(
63
58
  application_id=application_id,
64
59
  application_spark_ui_url=application_spark_ui_url,
65
60
  job_id=job_id,
66
61
  ) for job_id in job_ids]
67
62
 
68
63
  stage_ids = reduce(lambda acc, job: acc + (job.stage_ids or []), model.jobs, [])
69
- model.stages = [await LocalAPI().stage(
64
+ model.stages = [await self.build_api().stage(
70
65
  application_id=application_id,
71
66
  application_spark_ui_url=application_spark_ui_url,
72
67
  stage_id=stage_id,
@@ -1,6 +1,5 @@
1
1
  from mage_ai.api.resources.GenericResource import GenericResource
2
2
  from mage_ai.api.resources.mixins.spark import SparkApplicationChild
3
- from mage_ai.services.spark.api.local import LocalAPI
4
3
 
5
4
 
6
5
  class SparkStageAttemptResource(GenericResource, SparkApplicationChild):
@@ -9,7 +8,7 @@ class SparkStageAttemptResource(GenericResource, SparkApplicationChild):
9
8
  parent_model = kwargs.get('parent_model')
10
9
 
11
10
  return self.build_result_set(
12
- await LocalAPI().stage_attempts(
11
+ await self.build_api().stage_attempts(
13
12
  stage_id=parent_model.id,
14
13
  ),
15
14
  user,
@@ -21,7 +20,7 @@ class SparkStageAttemptResource(GenericResource, SparkApplicationChild):
21
20
  parent_model = kwargs.get('parent_model')
22
21
 
23
22
  return self(
24
- await LocalAPI().stage_attempt(
23
+ await self.build_api().stage_attempt(
25
24
  attempt_id=pk,
26
25
  stage_id=parent_model.id,
27
26
  ),
@@ -1,7 +1,6 @@
1
1
  from mage_ai.api.errors import ApiError
2
2
  from mage_ai.api.resources.GenericResource import GenericResource
3
3
  from mage_ai.api.resources.mixins.spark import SparkApplicationChild
4
- from mage_ai.services.spark.api.local import LocalAPI
5
4
 
6
5
 
7
6
  class SparkStageAttemptTaskResource(GenericResource, SparkApplicationChild):
@@ -18,7 +17,7 @@ class SparkStageAttemptTaskResource(GenericResource, SparkApplicationChild):
18
17
  raise error
19
18
 
20
19
  return self.build_result_set(
21
- await LocalAPI().stage_attempt_tasks(
20
+ await self.build_api().stage_attempt_tasks(
22
21
  attempt_id=attempt_id,
23
22
  stage_id=parent_model.id,
24
23
  ),
@@ -1,7 +1,6 @@
1
1
  from mage_ai.api.errors import ApiError
2
2
  from mage_ai.api.resources.GenericResource import GenericResource
3
3
  from mage_ai.api.resources.mixins.spark import SparkApplicationChild
4
- from mage_ai.services.spark.api.local import LocalAPI
5
4
 
6
5
 
7
6
  class SparkStageAttemptTaskSummaryResource(GenericResource, SparkApplicationChild):
@@ -14,7 +13,7 @@ class SparkStageAttemptTaskSummaryResource(GenericResource, SparkApplicationChil
14
13
  raise error
15
14
 
16
15
  return self(
17
- await LocalAPI().stage_attempt_task_summary(
16
+ await self.build_api().stage_attempt_task_summary(
18
17
  attempt_id=pk,
19
18
  stage_id=parent_model.id,
20
19
  ),
@@ -1,6 +1,5 @@
1
1
  from mage_ai.api.resources.GenericResource import GenericResource
2
2
  from mage_ai.api.resources.mixins.spark import SparkApplicationChild
3
- from mage_ai.services.spark.api.local import LocalAPI
4
3
  from mage_ai.services.spark.models.stages import Stage
5
4
 
6
5
 
@@ -16,7 +15,7 @@ class SparkStageResource(GenericResource, SparkApplicationChild):
16
15
  query['details'] = details
17
16
 
18
17
  return self.build_result_set(
19
- await LocalAPI().stages(query=query),
18
+ await self.build_api().stages(query=query),
20
19
  user,
21
20
  **kwargs,
22
21
  )
@@ -42,15 +41,13 @@ class SparkStageResource(GenericResource, SparkApplicationChild):
42
41
  if quantiles:
43
42
  query['withSummaries'] = with_summaries
44
43
 
45
- application_id = query_arg.get('application_id', [])
46
- if application_id:
47
- application_id = application_id[0]
44
+ application_id = self.application_calculated_id_from_query(query_arg)
48
45
 
49
46
  application_spark_ui_url = query_arg.get('application_spark_ui_url', [])
50
47
  if application_spark_ui_url:
51
48
  application_spark_ui_url = application_spark_ui_url[0]
52
49
 
53
- stage = await LocalAPI().stage(
50
+ stage = await self.build_api().stage(
54
51
  application_id=application_id,
55
52
  application_spark_ui_url=application_spark_ui_url,
56
53
  stage_id=pk,
@@ -1,6 +1,5 @@
1
1
  from mage_ai.api.resources.GenericResource import GenericResource
2
2
  from mage_ai.api.resources.mixins.spark import SparkApplicationChild
3
- from mage_ai.services.spark.api.local import LocalAPI
4
3
 
5
4
 
6
5
  class SparkThreadResource(GenericResource, SparkApplicationChild):
@@ -9,7 +8,7 @@ class SparkThreadResource(GenericResource, SparkApplicationChild):
9
8
  parent_model = kwargs.get('parent_model')
10
9
 
11
10
  return self.build_result_set(
12
- await LocalAPI().threads(
11
+ await self.build_api().threads(
13
12
  executor_id=parent_model.id,
14
13
  ),
15
14
  user,