mage-ai 0.9.45__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 (497) 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/GlobalHookPolicy.py +126 -0
  9. mage_ai/api/policies/OauthPolicy.py +56 -4
  10. mage_ai/api/policies/ProjectPolicy.py +1 -0
  11. mage_ai/api/presenters/ComputeClusterPresenter.py +19 -0
  12. mage_ai/api/presenters/ComputeConnectionPresenter.py +26 -0
  13. mage_ai/api/presenters/ComputeServicePresenter.py +15 -0
  14. mage_ai/api/presenters/DownloadPresenter.py +13 -0
  15. mage_ai/api/presenters/GlobalHookPresenter.py +74 -0
  16. mage_ai/api/presenters/PipelinePresenter.py +1 -0
  17. mage_ai/api/presenters/ProjectPresenter.py +1 -0
  18. mage_ai/api/presenters/SparkApplicationPresenter.py +2 -0
  19. mage_ai/api/presenters/WorkspacePresenter.py +22 -22
  20. mage_ai/api/resources/AsyncBaseResource.py +39 -0
  21. mage_ai/api/resources/ClusterResource.py +1 -1
  22. mage_ai/api/resources/ComputeClusterResource.py +109 -0
  23. mage_ai/api/resources/ComputeConnectionResource.py +103 -0
  24. mage_ai/api/resources/ComputeServiceResource.py +35 -0
  25. mage_ai/api/resources/DownloadResource.py +56 -0
  26. mage_ai/api/resources/ExecutionStateResource.py +1 -1
  27. mage_ai/api/resources/GlobalHookResource.py +192 -0
  28. mage_ai/api/resources/KernelResource.py +10 -0
  29. mage_ai/api/resources/OauthResource.py +28 -33
  30. mage_ai/api/resources/PipelineResource.py +4 -4
  31. mage_ai/api/resources/PipelineScheduleResource.py +37 -16
  32. mage_ai/api/resources/ProjectResource.py +5 -3
  33. mage_ai/api/resources/SessionResource.py +0 -9
  34. mage_ai/api/resources/SparkApplicationResource.py +5 -5
  35. mage_ai/api/resources/SparkEnvironmentResource.py +1 -2
  36. mage_ai/api/resources/SparkExecutorResource.py +1 -2
  37. mage_ai/api/resources/SparkJobResource.py +3 -6
  38. mage_ai/api/resources/SparkSqlResource.py +6 -11
  39. mage_ai/api/resources/SparkStageAttemptResource.py +2 -3
  40. mage_ai/api/resources/SparkStageAttemptTaskResource.py +1 -2
  41. mage_ai/api/resources/SparkStageAttemptTaskSummaryResource.py +1 -2
  42. mage_ai/api/resources/SparkStageResource.py +3 -6
  43. mage_ai/api/resources/SparkThreadResource.py +1 -2
  44. mage_ai/api/resources/mixins/spark.py +25 -4
  45. mage_ai/authentication/oauth2.py +1 -3
  46. mage_ai/authentication/permissions/constants.py +4 -0
  47. mage_ai/authentication/providers/active_directory.py +136 -0
  48. mage_ai/authentication/providers/constants.py +3 -0
  49. mage_ai/authentication/providers/ghe.py +24 -25
  50. mage_ai/authentication/providers/google.py +25 -26
  51. mage_ai/authentication/providers/oauth.py +2 -2
  52. mage_ai/authentication/providers/okta.py +28 -29
  53. mage_ai/authentication/providers/sso.py +2 -2
  54. mage_ai/cluster_manager/aws/emr_cluster_manager.py +2 -1
  55. mage_ai/cluster_manager/workspace/base.py +7 -3
  56. mage_ai/data_integrations/destinations/constants.py +1 -0
  57. mage_ai/data_preparation/executors/pipeline_executor.py +9 -0
  58. mage_ai/data_preparation/models/block/__init__.py +57 -5
  59. mage_ai/data_preparation/models/block/data_integration/data.py +1 -1
  60. mage_ai/data_preparation/models/block/spark/mixins.py +82 -34
  61. mage_ai/data_preparation/models/download/__init__.py +8 -0
  62. mage_ai/data_preparation/models/global_hooks/__init__.py +0 -0
  63. mage_ai/data_preparation/models/global_hooks/constants.py +44 -0
  64. mage_ai/data_preparation/models/global_hooks/models.py +928 -0
  65. mage_ai/data_preparation/models/global_hooks/utils.py +21 -0
  66. mage_ai/data_preparation/models/pipeline.py +82 -6
  67. mage_ai/data_preparation/models/pipelines/models.py +16 -0
  68. mage_ai/data_preparation/models/project/__init__.py +6 -0
  69. mage_ai/data_preparation/models/project/constants.py +1 -0
  70. mage_ai/data_preparation/models/project/models.py +12 -0
  71. mage_ai/data_preparation/repo_manager.py +23 -1
  72. mage_ai/data_preparation/templates/data_loaders/streaming/activemq.yaml +6 -0
  73. mage_ai/data_preparation/templates/data_loaders/streaming/nats.yaml +20 -0
  74. mage_ai/orchestration/db/models/schedules.py +2 -2
  75. mage_ai/orchestration/queue/process_queue.py +9 -1
  76. mage_ai/orchestration/triggers/api.py +11 -3
  77. mage_ai/orchestration/triggers/constants.py +1 -0
  78. mage_ai/server/active_kernel.py +37 -4
  79. mage_ai/server/api/downloads.py +76 -1
  80. mage_ai/server/constants.py +1 -1
  81. mage_ai/server/frontend_dist/404.html +2 -2
  82. mage_ai/server/frontend_dist/_next/static/9jB4XPuz6BzxBcG9VNao5/_buildManifest.js +1 -0
  83. mage_ai/server/frontend_dist/_next/static/chunks/1749-9a6276b2918fdae1.js +1 -0
  84. mage_ai/server/{frontend_dist_base_path_template/_next/static/chunks/7519-8c29bbb92e03cc77.js → frontend_dist/_next/static/chunks/1845-5ce774d5ab81ed57.js} +1 -1
  85. mage_ai/server/frontend_dist/_next/static/chunks/1952-ac7722e8b1ab88fe.js +1 -0
  86. mage_ai/server/frontend_dist/_next/static/chunks/3419-f8d518d024e7b5c8.js +1 -0
  87. mage_ai/server/frontend_dist/_next/static/chunks/4267-fd4d8049e83178de.js +1 -0
  88. mage_ai/server/frontend_dist/_next/static/chunks/4366-93e09e5a4a7e182c.js +1 -0
  89. mage_ai/server/frontend_dist/_next/static/chunks/5457-949640f4037bf12f.js +1 -0
  90. mage_ai/server/frontend_dist/_next/static/chunks/5499-76cf8f023c6b0985.js +1 -0
  91. mage_ai/server/frontend_dist/_next/static/chunks/553-7f7919e14392ca67.js +1 -0
  92. mage_ai/server/frontend_dist/_next/static/chunks/5638-a65610405a70961c.js +1 -0
  93. mage_ai/server/frontend_dist/_next/static/chunks/5810-12eadc488265d55b.js +1 -0
  94. mage_ai/server/frontend_dist/_next/static/chunks/5820-28adeabb5cda2b96.js +1 -0
  95. mage_ai/server/frontend_dist/_next/static/chunks/595-0d174b1f9fbfce4f.js +1 -0
  96. mage_ai/server/frontend_dist/_next/static/chunks/600-705fe234320ec5de.js +1 -0
  97. mage_ai/server/{frontend_dist_base_path_template/_next/static/chunks/3122-f27de34d0b5426af.js → frontend_dist/_next/static/chunks/6285-e9b45335bfb9ccaf.js} +1 -1
  98. mage_ai/server/frontend_dist/_next/static/chunks/6333-bc1b433b428a9095.js +1 -0
  99. mage_ai/server/{frontend_dist_base_path_template/_next/static/chunks/5397-b5f2e477acc6bd6b.js → frontend_dist/_next/static/chunks/6965-c613d1834c8ed92d.js} +1 -1
  100. mage_ai/server/frontend_dist/_next/static/chunks/{7022-18fde36eb46e1d65.js → 7022-070ec0144a4d029c.js} +1 -1
  101. mage_ai/server/{frontend_dist_base_path_template/_next/static/chunks/722-2a171fe616310f60.js → frontend_dist/_next/static/chunks/722-a1584445357a276c.js} +1 -1
  102. mage_ai/server/frontend_dist/_next/static/chunks/{7858-c83d25349d0e980f.js → 7858-d9df72e95e438284.js} +1 -1
  103. mage_ai/server/frontend_dist/_next/static/chunks/8264-0d582a6ca33c3dfa.js +1 -0
  104. mage_ai/server/{frontend_dist_base_path_template/_next/static/chunks/3684-cbda680fd8927d07.js → frontend_dist/_next/static/chunks/8432-f191e39f9b5893f2.js} +1 -1
  105. mage_ai/server/frontend_dist/_next/static/chunks/90-a7308bae028d7001.js +1 -0
  106. mage_ai/server/frontend_dist/_next/static/chunks/9264-1d4f0327d42fed91.js +1 -0
  107. mage_ai/server/frontend_dist/_next/static/chunks/9618-2c5045255ac5a6e7.js +1 -0
  108. mage_ai/server/frontend_dist/_next/static/chunks/framework-22b71764bf44ede4.js +1 -0
  109. mage_ai/server/frontend_dist/_next/static/chunks/pages/_app-ebef928183f9a3bb.js +1 -0
  110. mage_ai/server/frontend_dist/_next/static/chunks/pages/block-layout-a24cb24b6f08bbc9.js +1 -0
  111. mage_ai/server/frontend_dist/_next/static/chunks/pages/compute-419775ca1293b354.js +1 -0
  112. mage_ai/server/frontend_dist/_next/static/chunks/pages/files-0f2d4be6fdca86ca.js +1 -0
  113. mage_ai/server/frontend_dist/_next/static/chunks/pages/global-data-products/{[...slug]-3f6fc312f67ff72e.js → [...slug]-cfd68e760ae00958.js} +1 -1
  114. mage_ai/server/frontend_dist/_next/static/chunks/pages/{global-data-products-f4cd03036c3e8723.js → global-data-products-c3b79ef31007f95b.js} +1 -1
  115. mage_ai/server/frontend_dist/_next/static/chunks/pages/global-hooks/[...slug]-77edfa32d000e88b.js +1 -0
  116. mage_ai/server/frontend_dist/_next/static/chunks/pages/global-hooks-e561ae38cf5592e8.js +1 -0
  117. mage_ai/server/frontend_dist/_next/static/chunks/pages/manage/files-449a022f2f0f2d94.js +1 -0
  118. mage_ai/server/frontend_dist/_next/static/chunks/pages/manage/settings-60845f0b59142f32.js +1 -0
  119. 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
  120. mage_ai/server/frontend_dist/_next/static/chunks/pages/manage/users/new-abd8571907664fdf.js +1 -0
  121. mage_ai/server/frontend_dist/_next/static/chunks/pages/manage/{users-a7c970122a10afdc.js → users-28a930b148d99766.js} +1 -1
  122. mage_ai/server/frontend_dist/_next/static/chunks/pages/manage-f83deb790548693b.js +1 -0
  123. mage_ai/server/{frontend_dist_base_path_template/_next/static/chunks/pages/overview-a4647a274cf4dffa.js → frontend_dist/_next/static/chunks/pages/overview-f0c40645f385f23f.js} +1 -1
  124. mage_ai/server/{frontend_dist_base_path_template/_next/static/chunks/pages/pipeline-runs-c79819d6826e5416.js → frontend_dist/_next/static/chunks/pages/pipeline-runs-b35d37bfba8fbccc.js} +1 -1
  125. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/backfills/{[...slug]-b4c0a36c69c346a4.js → [...slug]-10e9a2d19541caa2.js} +1 -1
  126. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/backfills-c8d3a5289ab93f88.js +1 -0
  127. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/dashboard-571c0962333b92f0.js +1 -0
  128. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/edit-ff7e9108502f5716.js +1 -0
  129. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/{logs-a52d2d3e0c2978f4.js → logs-ef680455ae54ccbe.js} +1 -1
  130. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/monitors/block-runs-ddddcddd2f74b4f6.js +1 -0
  131. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/monitors/block-runtime-4a238307feddb522.js +1 -0
  132. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/monitors-e051057d9fe94f23.js +1 -0
  133. mage_ai/server/{frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/runs/[run]-b0a508aa52914dad.js → frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/runs/[run]-0691711636fa95c7.js} +1 -1
  134. 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
  135. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/settings-2914e326a5f1ffe0.js +1 -0
  136. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/syncs-b75bf17498e87354.js +1 -0
  137. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/triggers/[...slug]-3a7500e6e53084d3.js +1 -0
  138. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/{triggers-95394769a783c6c7.js → triggers-c0e551d265a8d467.js} +1 -1
  139. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/{[pipeline]-35fe7762cb83a733.js → [pipeline]-02c843b9c8418bb5.js} +1 -1
  140. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines-e47db5c3eaf683af.js +1 -0
  141. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/account/profile-55ac955dfa9a5a8d.js +1 -0
  142. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/permissions/{[...slug]-d6a62284c7c99cb3.js → [...slug]-b78b1be5b9ed84b9.js} +1 -1
  143. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/{permissions-b1389695f758c32b.js → permissions-37b78a436eeab258.js} +1 -1
  144. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/preferences-29c92a9bc54ae5cd.js +1 -0
  145. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/roles/{[...slug]-0bdb66265286ab22.js → [...slug]-db05a80d18c168e5.js} +1 -1
  146. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/{roles-e04e18fc295ca76a.js → roles-f55c77e4f46c8d33.js} +1 -1
  147. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/sync-data-2a1f8737561fdd94.js +1 -0
  148. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/users/{[...slug]-0267358c91122109.js → [...slug]-e3bf6e5d8bb250c4.js} +1 -1
  149. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/{users-50fed18bb9b8d142.js → users-20f0a050a42a015d.js} +1 -1
  150. mage_ai/server/frontend_dist/_next/static/chunks/pages/{settings-56f83205752b1323.js → settings-0f0121db7f5ff93d.js} +1 -1
  151. mage_ai/server/frontend_dist/_next/static/chunks/pages/sign-in-99e2748e3c1d57a3.js +1 -0
  152. 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
  153. 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
  154. mage_ai/server/frontend_dist/_next/static/chunks/pages/terminal-ed121e305169cf1c.js +1 -0
  155. mage_ai/server/frontend_dist/_next/static/chunks/pages/test-9ae68758102cc843.js +1 -0
  156. mage_ai/server/frontend_dist/_next/static/chunks/pages/{triggers-ffaab4c013e62ba1.js → triggers-572d82d6eb7a5d43.js} +1 -1
  157. mage_ai/server/frontend_dist/_next/static/chunks/pages/version-control-2d26d80370a2e481.js +1 -0
  158. mage_ai/server/frontend_dist/_next/static/chunks/{webpack-8af2b89c5a3779fc.js → webpack-fea697dd168c6d0c.js} +1 -1
  159. mage_ai/server/frontend_dist/block-layout.html +2 -2
  160. mage_ai/server/frontend_dist/compute.html +2 -2
  161. mage_ai/server/frontend_dist/files.html +2 -2
  162. mage_ai/server/frontend_dist/global-data-products/[...slug].html +2 -2
  163. mage_ai/server/frontend_dist/global-data-products.html +2 -2
  164. mage_ai/server/frontend_dist/global-hooks/[...slug].html +24 -0
  165. mage_ai/server/frontend_dist/global-hooks.html +24 -0
  166. mage_ai/server/frontend_dist/index.html +2 -2
  167. mage_ai/server/frontend_dist/manage/files.html +2 -2
  168. mage_ai/server/frontend_dist/manage/settings.html +2 -2
  169. mage_ai/server/frontend_dist/manage/users/[user].html +2 -2
  170. mage_ai/server/frontend_dist/manage/users/new.html +2 -2
  171. mage_ai/server/frontend_dist/manage/users.html +2 -2
  172. mage_ai/server/frontend_dist/manage.html +2 -2
  173. mage_ai/server/frontend_dist/oauth.html +3 -3
  174. mage_ai/server/frontend_dist/overview.html +2 -2
  175. mage_ai/server/frontend_dist/pipeline-runs.html +2 -2
  176. mage_ai/server/frontend_dist/pipelines/[pipeline]/backfills/[...slug].html +2 -2
  177. mage_ai/server/frontend_dist/pipelines/[pipeline]/backfills.html +2 -2
  178. mage_ai/server/frontend_dist/pipelines/[pipeline]/dashboard.html +2 -2
  179. mage_ai/server/frontend_dist/pipelines/[pipeline]/edit.html +2 -2
  180. mage_ai/server/frontend_dist/pipelines/[pipeline]/logs.html +2 -2
  181. mage_ai/server/frontend_dist/pipelines/[pipeline]/monitors/block-runs.html +2 -2
  182. mage_ai/server/frontend_dist/pipelines/[pipeline]/monitors/block-runtime.html +2 -2
  183. mage_ai/server/frontend_dist/pipelines/[pipeline]/monitors.html +2 -2
  184. mage_ai/server/frontend_dist/pipelines/[pipeline]/runs/[run].html +2 -2
  185. mage_ai/server/frontend_dist/pipelines/[pipeline]/runs.html +2 -2
  186. mage_ai/server/frontend_dist/pipelines/[pipeline]/settings.html +2 -2
  187. mage_ai/server/frontend_dist/pipelines/[pipeline]/syncs.html +2 -2
  188. mage_ai/server/frontend_dist/pipelines/[pipeline]/triggers/[...slug].html +2 -2
  189. mage_ai/server/frontend_dist/pipelines/[pipeline]/triggers.html +2 -2
  190. mage_ai/server/frontend_dist/pipelines/[pipeline].html +2 -2
  191. mage_ai/server/frontend_dist/pipelines.html +2 -2
  192. mage_ai/server/frontend_dist/settings/account/profile.html +2 -2
  193. mage_ai/server/frontend_dist/settings/workspace/permissions/[...slug].html +2 -2
  194. mage_ai/server/frontend_dist/settings/workspace/permissions.html +2 -2
  195. mage_ai/server/frontend_dist/settings/workspace/preferences.html +2 -2
  196. mage_ai/server/frontend_dist/settings/workspace/roles/[...slug].html +2 -2
  197. mage_ai/server/frontend_dist/settings/workspace/roles.html +2 -2
  198. mage_ai/server/frontend_dist/settings/workspace/sync-data.html +2 -2
  199. mage_ai/server/frontend_dist/settings/workspace/users/[...slug].html +2 -2
  200. mage_ai/server/frontend_dist/settings/workspace/users.html +2 -2
  201. mage_ai/server/frontend_dist/settings.html +2 -2
  202. mage_ai/server/frontend_dist/sign-in.html +10 -11
  203. mage_ai/server/frontend_dist/templates/[...slug].html +2 -2
  204. mage_ai/server/frontend_dist/templates.html +2 -2
  205. mage_ai/server/frontend_dist/terminal.html +2 -2
  206. mage_ai/server/frontend_dist/test.html +14 -14
  207. mage_ai/server/frontend_dist/triggers.html +2 -2
  208. mage_ai/server/frontend_dist/version-control.html +2 -2
  209. mage_ai/server/frontend_dist_base_path_template/404.html +2 -2
  210. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/1749-9a6276b2918fdae1.js +1 -0
  211. mage_ai/server/{frontend_dist/_next/static/chunks/7519-8c29bbb92e03cc77.js → frontend_dist_base_path_template/_next/static/chunks/1845-5ce774d5ab81ed57.js} +1 -1
  212. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/1952-ac7722e8b1ab88fe.js +1 -0
  213. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/3419-f8d518d024e7b5c8.js +1 -0
  214. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/4267-fd4d8049e83178de.js +1 -0
  215. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/4366-93e09e5a4a7e182c.js +1 -0
  216. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/5457-949640f4037bf12f.js +1 -0
  217. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/5499-76cf8f023c6b0985.js +1 -0
  218. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/553-7f7919e14392ca67.js +1 -0
  219. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/5638-a65610405a70961c.js +1 -0
  220. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/5810-12eadc488265d55b.js +1 -0
  221. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/5820-28adeabb5cda2b96.js +1 -0
  222. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/595-0d174b1f9fbfce4f.js +1 -0
  223. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/600-705fe234320ec5de.js +1 -0
  224. mage_ai/server/{frontend_dist/_next/static/chunks/3122-f27de34d0b5426af.js → frontend_dist_base_path_template/_next/static/chunks/6285-e9b45335bfb9ccaf.js} +1 -1
  225. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/6333-bc1b433b428a9095.js +1 -0
  226. mage_ai/server/{frontend_dist/_next/static/chunks/5397-b5f2e477acc6bd6b.js → frontend_dist_base_path_template/_next/static/chunks/6965-c613d1834c8ed92d.js} +1 -1
  227. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/{7022-18fde36eb46e1d65.js → 7022-070ec0144a4d029c.js} +1 -1
  228. mage_ai/server/{frontend_dist/_next/static/chunks/722-2a171fe616310f60.js → frontend_dist_base_path_template/_next/static/chunks/722-a1584445357a276c.js} +1 -1
  229. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/{7858-c83d25349d0e980f.js → 7858-d9df72e95e438284.js} +1 -1
  230. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/8264-0d582a6ca33c3dfa.js +1 -0
  231. mage_ai/server/{frontend_dist/_next/static/chunks/3684-cbda680fd8927d07.js → frontend_dist_base_path_template/_next/static/chunks/8432-f191e39f9b5893f2.js} +1 -1
  232. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/90-a7308bae028d7001.js +1 -0
  233. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/9264-1d4f0327d42fed91.js +1 -0
  234. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/9618-2c5045255ac5a6e7.js +1 -0
  235. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/framework-22b71764bf44ede4.js +1 -0
  236. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/_app-ebef928183f9a3bb.js +1 -0
  237. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/block-layout-a24cb24b6f08bbc9.js +1 -0
  238. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/compute-419775ca1293b354.js +1 -0
  239. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/files-0f2d4be6fdca86ca.js +1 -0
  240. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/global-data-products/{[...slug]-3f6fc312f67ff72e.js → [...slug]-cfd68e760ae00958.js} +1 -1
  241. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/{global-data-products-f4cd03036c3e8723.js → global-data-products-c3b79ef31007f95b.js} +1 -1
  242. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/global-hooks/[...slug]-77edfa32d000e88b.js +1 -0
  243. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/global-hooks-e561ae38cf5592e8.js +1 -0
  244. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/manage/files-449a022f2f0f2d94.js +1 -0
  245. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/manage/settings-60845f0b59142f32.js +1 -0
  246. 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
  247. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/manage/users/new-abd8571907664fdf.js +1 -0
  248. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/manage/{users-a7c970122a10afdc.js → users-28a930b148d99766.js} +1 -1
  249. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/manage-f83deb790548693b.js +1 -0
  250. mage_ai/server/{frontend_dist/_next/static/chunks/pages/overview-a4647a274cf4dffa.js → frontend_dist_base_path_template/_next/static/chunks/pages/overview-f0c40645f385f23f.js} +1 -1
  251. mage_ai/server/{frontend_dist/_next/static/chunks/pages/pipeline-runs-c79819d6826e5416.js → frontend_dist_base_path_template/_next/static/chunks/pages/pipeline-runs-b35d37bfba8fbccc.js} +1 -1
  252. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/backfills/{[...slug]-b4c0a36c69c346a4.js → [...slug]-10e9a2d19541caa2.js} +1 -1
  253. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/backfills-c8d3a5289ab93f88.js +1 -0
  254. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/dashboard-571c0962333b92f0.js +1 -0
  255. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/edit-ff7e9108502f5716.js +1 -0
  256. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/{logs-a52d2d3e0c2978f4.js → logs-ef680455ae54ccbe.js} +1 -1
  257. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/monitors/block-runs-ddddcddd2f74b4f6.js +1 -0
  258. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/monitors/block-runtime-4a238307feddb522.js +1 -0
  259. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/monitors-e051057d9fe94f23.js +1 -0
  260. mage_ai/server/{frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/runs/[run]-b0a508aa52914dad.js → frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/runs/[run]-0691711636fa95c7.js} +1 -1
  261. 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
  262. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/settings-2914e326a5f1ffe0.js +1 -0
  263. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/syncs-b75bf17498e87354.js +1 -0
  264. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/triggers/[...slug]-3a7500e6e53084d3.js +1 -0
  265. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/{triggers-95394769a783c6c7.js → triggers-c0e551d265a8d467.js} +1 -1
  266. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/{[pipeline]-35fe7762cb83a733.js → [pipeline]-02c843b9c8418bb5.js} +1 -1
  267. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines-e47db5c3eaf683af.js +1 -0
  268. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/account/profile-55ac955dfa9a5a8d.js +1 -0
  269. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/workspace/permissions/{[...slug]-d6a62284c7c99cb3.js → [...slug]-b78b1be5b9ed84b9.js} +1 -1
  270. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/workspace/{permissions-b1389695f758c32b.js → permissions-37b78a436eeab258.js} +1 -1
  271. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/workspace/preferences-29c92a9bc54ae5cd.js +1 -0
  272. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/workspace/roles/{[...slug]-0bdb66265286ab22.js → [...slug]-db05a80d18c168e5.js} +1 -1
  273. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/workspace/{roles-e04e18fc295ca76a.js → roles-f55c77e4f46c8d33.js} +1 -1
  274. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/workspace/sync-data-2a1f8737561fdd94.js +1 -0
  275. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/workspace/users/{[...slug]-0267358c91122109.js → [...slug]-e3bf6e5d8bb250c4.js} +1 -1
  276. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/workspace/{users-50fed18bb9b8d142.js → users-20f0a050a42a015d.js} +1 -1
  277. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/{settings-56f83205752b1323.js → settings-0f0121db7f5ff93d.js} +1 -1
  278. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/sign-in-99e2748e3c1d57a3.js +1 -0
  279. 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
  280. 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
  281. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/terminal-ed121e305169cf1c.js +1 -0
  282. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/test-9ae68758102cc843.js +1 -0
  283. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/{triggers-ffaab4c013e62ba1.js → triggers-572d82d6eb7a5d43.js} +1 -1
  284. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/version-control-2d26d80370a2e481.js +1 -0
  285. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/{webpack-074f3eb2281fba79.js → webpack-d30cb09c85b4c4f0.js} +1 -1
  286. mage_ai/server/frontend_dist_base_path_template/_next/static/uPDjJYpJMst1q6psbRyte/_buildManifest.js +1 -0
  287. mage_ai/server/frontend_dist_base_path_template/block-layout.html +2 -2
  288. mage_ai/server/frontend_dist_base_path_template/compute.html +5 -5
  289. mage_ai/server/frontend_dist_base_path_template/files.html +5 -5
  290. mage_ai/server/frontend_dist_base_path_template/global-data-products/[...slug].html +5 -5
  291. mage_ai/server/frontend_dist_base_path_template/global-data-products.html +5 -5
  292. mage_ai/server/frontend_dist_base_path_template/global-hooks/[...slug].html +24 -0
  293. mage_ai/server/frontend_dist_base_path_template/global-hooks.html +24 -0
  294. mage_ai/server/frontend_dist_base_path_template/index.html +2 -2
  295. mage_ai/server/frontend_dist_base_path_template/manage/files.html +5 -5
  296. mage_ai/server/frontend_dist_base_path_template/manage/settings.html +5 -5
  297. mage_ai/server/frontend_dist_base_path_template/manage/users/[user].html +5 -5
  298. mage_ai/server/frontend_dist_base_path_template/manage/users/new.html +5 -5
  299. mage_ai/server/frontend_dist_base_path_template/manage/users.html +5 -5
  300. mage_ai/server/frontend_dist_base_path_template/manage.html +5 -5
  301. mage_ai/server/frontend_dist_base_path_template/oauth.html +4 -4
  302. mage_ai/server/frontend_dist_base_path_template/overview.html +5 -5
  303. mage_ai/server/frontend_dist_base_path_template/pipeline-runs.html +5 -5
  304. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/backfills/[...slug].html +5 -5
  305. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/backfills.html +5 -5
  306. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/dashboard.html +5 -5
  307. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/edit.html +2 -2
  308. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/logs.html +5 -5
  309. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/monitors/block-runs.html +5 -5
  310. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/monitors/block-runtime.html +5 -5
  311. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/monitors.html +5 -5
  312. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/runs/[run].html +5 -5
  313. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/runs.html +5 -5
  314. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/settings.html +5 -5
  315. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/syncs.html +5 -5
  316. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/triggers/[...slug].html +5 -5
  317. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/triggers.html +5 -5
  318. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline].html +2 -2
  319. mage_ai/server/frontend_dist_base_path_template/pipelines.html +5 -5
  320. mage_ai/server/frontend_dist_base_path_template/settings/account/profile.html +5 -5
  321. mage_ai/server/frontend_dist_base_path_template/settings/workspace/permissions/[...slug].html +5 -5
  322. mage_ai/server/frontend_dist_base_path_template/settings/workspace/permissions.html +5 -5
  323. mage_ai/server/frontend_dist_base_path_template/settings/workspace/preferences.html +5 -5
  324. mage_ai/server/frontend_dist_base_path_template/settings/workspace/roles/[...slug].html +5 -5
  325. mage_ai/server/frontend_dist_base_path_template/settings/workspace/roles.html +5 -5
  326. mage_ai/server/frontend_dist_base_path_template/settings/workspace/sync-data.html +5 -5
  327. mage_ai/server/frontend_dist_base_path_template/settings/workspace/users/[...slug].html +5 -5
  328. mage_ai/server/frontend_dist_base_path_template/settings/workspace/users.html +5 -5
  329. mage_ai/server/frontend_dist_base_path_template/settings.html +2 -2
  330. mage_ai/server/frontend_dist_base_path_template/sign-in.html +18 -19
  331. mage_ai/server/frontend_dist_base_path_template/templates/[...slug].html +5 -5
  332. mage_ai/server/frontend_dist_base_path_template/templates.html +5 -5
  333. mage_ai/server/frontend_dist_base_path_template/terminal.html +5 -5
  334. mage_ai/server/frontend_dist_base_path_template/test.html +15 -15
  335. mage_ai/server/frontend_dist_base_path_template/triggers.html +5 -5
  336. mage_ai/server/frontend_dist_base_path_template/version-control.html +5 -5
  337. mage_ai/server/server.py +35 -9
  338. mage_ai/server/utils/output_display.py +6 -0
  339. mage_ai/server/websocket_server.py +14 -0
  340. mage_ai/services/aws/emr/config.py +1 -0
  341. mage_ai/services/aws/emr/constants.py +1 -0
  342. mage_ai/services/aws/emr/emr.py +20 -7
  343. mage_ai/services/compute/__init__.py +0 -0
  344. mage_ai/services/compute/aws/__init__.py +0 -0
  345. mage_ai/services/compute/aws/constants.py +21 -0
  346. mage_ai/services/compute/aws/models.py +459 -0
  347. mage_ai/services/compute/aws/steps.py +482 -0
  348. mage_ai/services/compute/constants.py +27 -0
  349. mage_ai/services/compute/models.py +212 -0
  350. mage_ai/services/k8s/job_manager.py +3 -0
  351. mage_ai/services/spark/api/aws_emr.py +38 -0
  352. mage_ai/services/spark/api/base.py +7 -4
  353. mage_ai/services/spark/api/constants.py +4 -0
  354. mage_ai/services/spark/api/local.py +25 -24
  355. mage_ai/services/spark/api/service.py +15 -5
  356. mage_ai/services/spark/constants.py +1 -1
  357. mage_ai/services/spark/models/applications.py +45 -3
  358. mage_ai/services/spark/models/base.py +3 -19
  359. mage_ai/services/spark/models/environments.py +16 -11
  360. mage_ai/services/spark/models/executors.py +2 -2
  361. mage_ai/services/spark/models/sqls.py +46 -15
  362. mage_ai/services/spark/models/stages.py +55 -32
  363. mage_ai/services/spark/models/threads.py +2 -2
  364. mage_ai/services/spark/utils.py +22 -6
  365. mage_ai/services/ssh/__init__.py +0 -0
  366. mage_ai/services/ssh/aws/__init__.py +0 -0
  367. mage_ai/services/ssh/aws/emr/__init__.py +0 -0
  368. mage_ai/services/ssh/aws/emr/constants.py +10 -0
  369. mage_ai/services/ssh/aws/emr/models.py +326 -0
  370. mage_ai/services/ssh/aws/emr/utils.py +151 -0
  371. mage_ai/settings/__init__.py +8 -1
  372. mage_ai/settings/secret_generation.py +7 -0
  373. mage_ai/settings/sso.py +8 -0
  374. mage_ai/shared/hash.py +16 -0
  375. mage_ai/shared/models.py +253 -0
  376. mage_ai/streaming/constants.py +2 -0
  377. mage_ai/streaming/sources/activemq.py +89 -0
  378. mage_ai/streaming/sources/nats_js.py +182 -0
  379. mage_ai/streaming/sources/source_factory.py +8 -0
  380. mage_ai/tests/ai/test_ai_functions.py +53 -8
  381. mage_ai/tests/api/endpoints/test_oauths.py +33 -0
  382. mage_ai/tests/api/endpoints/test_projects.py +1 -0
  383. mage_ai/tests/api/endpoints/test_workspaces.py +55 -0
  384. mage_ai/tests/api/operations/test_base.py +7 -5
  385. mage_ai/tests/api/operations/test_operations.py +0 -1
  386. mage_ai/tests/api/operations/test_operations_with_hooks.py +577 -0
  387. mage_ai/tests/api/operations/test_syncs.py +0 -1
  388. mage_ai/tests/api/operations/test_users.py +13 -2
  389. mage_ai/tests/data_preparation/models/global_hooks/__init__.py +0 -0
  390. mage_ai/tests/data_preparation/models/global_hooks/test_global_hooks.py +575 -0
  391. mage_ai/tests/data_preparation/models/global_hooks/test_hook.py +760 -0
  392. mage_ai/tests/data_preparation/models/global_hooks/test_utils.py +33 -0
  393. mage_ai/tests/data_preparation/models/test_pipeline.py +5 -0
  394. mage_ai/tests/data_preparation/test_repo_manager.py +11 -0
  395. mage_ai/tests/factory.py +65 -3
  396. mage_ai/tests/orchestration/queue/test_process_queue.py +15 -2
  397. mage_ai/tests/services/k8s/test_job_manager.py +22 -1
  398. mage_ai/tests/shared/mixins.py +291 -0
  399. mage_ai/tests/shared/test_hash.py +17 -1
  400. mage_ai/tests/streaming/sources/test_activemq.py +32 -0
  401. mage_ai/tests/streaming/sources/test_nats_js.py +32 -0
  402. mage_ai/tests/streaming/sources/test_source_factory.py +26 -1
  403. {mage_ai-0.9.45.dist-info → mage_ai-0.9.46.dist-info}/METADATA +8 -1
  404. {mage_ai-0.9.45.dist-info → mage_ai-0.9.46.dist-info}/RECORD +410 -343
  405. mage_ai/authentication/oauth/active_directory.py +0 -17
  406. mage_ai/server/frontend_dist/_next/static/chunks/1125-91d3ce33140ef041.js +0 -1
  407. mage_ai/server/frontend_dist/_next/static/chunks/1749-607014ecf28268bf.js +0 -1
  408. mage_ai/server/frontend_dist/_next/static/chunks/1952-573c7fc7ad84da6e.js +0 -1
  409. mage_ai/server/frontend_dist/_next/static/chunks/3004-231cad9039ae5dcb.js +0 -1
  410. mage_ai/server/frontend_dist/_next/static/chunks/3419-0873e170ef7d6303.js +0 -1
  411. mage_ai/server/frontend_dist/_next/static/chunks/3932-0ceca9599d6e6d00.js +0 -1
  412. mage_ai/server/frontend_dist/_next/static/chunks/4267-335766a915ee2fa9.js +0 -1
  413. mage_ai/server/frontend_dist/_next/static/chunks/5457-8be2e0a3fe0ba64b.js +0 -1
  414. mage_ai/server/frontend_dist/_next/static/chunks/5499-bca977f466e259e1.js +0 -1
  415. mage_ai/server/frontend_dist/_next/static/chunks/553-edf533e634e85192.js +0 -1
  416. mage_ai/server/frontend_dist/_next/static/chunks/5810-37c6091b29a1fe53.js +0 -1
  417. mage_ai/server/frontend_dist/_next/static/chunks/600-0733eb84f0a0a9e0.js +0 -1
  418. mage_ai/server/frontend_dist/_next/static/chunks/6333-95ad799d13326dce.js +0 -1
  419. mage_ai/server/frontend_dist/_next/static/chunks/8224-39a93ee1058b6069.js +0 -1
  420. mage_ai/server/frontend_dist/_next/static/chunks/8264-6ef8fdb195694807.js +0 -1
  421. mage_ai/server/frontend_dist/_next/static/chunks/9264-1b5c4b071ed544c3.js +0 -1
  422. mage_ai/server/frontend_dist/_next/static/chunks/framework-7c365855dab1bf41.js +0 -1
  423. mage_ai/server/frontend_dist/_next/static/chunks/pages/_app-1203afde83fa2d6e.js +0 -1
  424. mage_ai/server/frontend_dist/_next/static/chunks/pages/block-layout-c465c14d48392b11.js +0 -1
  425. mage_ai/server/frontend_dist/_next/static/chunks/pages/compute-b1f8d5a7a9a30f2d.js +0 -1
  426. mage_ai/server/frontend_dist/_next/static/chunks/pages/files-93c094bad0f299fb.js +0 -1
  427. mage_ai/server/frontend_dist/_next/static/chunks/pages/manage/files-891e5bd5935f7473.js +0 -1
  428. mage_ai/server/frontend_dist/_next/static/chunks/pages/manage/settings-d2e4ee4e68d36807.js +0 -1
  429. mage_ai/server/frontend_dist/_next/static/chunks/pages/manage/users/new-4a49126fcfe8ced0.js +0 -1
  430. mage_ai/server/frontend_dist/_next/static/chunks/pages/manage-5f8c5d0bc6ad1113.js +0 -1
  431. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/backfills-a9266d353f288e8c.js +0 -1
  432. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/dashboard-b5c29c852262312e.js +0 -1
  433. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/edit-9f233917aa72ad82.js +0 -1
  434. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/monitors/block-runs-5af599da035252a7.js +0 -1
  435. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/monitors/block-runtime-8597f8e13d80ee48.js +0 -1
  436. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/monitors-5e0d047a6c9cb1fc.js +0 -1
  437. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/settings-074c32397d341de9.js +0 -1
  438. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/syncs-50f5d8706ed0bc73.js +0 -1
  439. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/triggers/[...slug]-e151c1552fcb67bd.js +0 -1
  440. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines-8336c4326f1e7d96.js +0 -1
  441. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/account/profile-01dd679e4a21e0d9.js +0 -1
  442. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/preferences-4d9051c073a9b2ff.js +0 -1
  443. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/sync-data-5a306deca6717862.js +0 -1
  444. mage_ai/server/frontend_dist/_next/static/chunks/pages/sign-in-0dbc5b11019e78a0.js +0 -1
  445. mage_ai/server/frontend_dist/_next/static/chunks/pages/terminal-578d862f3e56e6e6.js +0 -1
  446. mage_ai/server/frontend_dist/_next/static/chunks/pages/test-1c0588d685b909b9.js +0 -1
  447. mage_ai/server/frontend_dist/_next/static/chunks/pages/version-control-114000e84313994f.js +0 -1
  448. mage_ai/server/frontend_dist/_next/static/icIDjCezcfhiKL87kgeSY/_buildManifest.js +0 -1
  449. mage_ai/server/frontend_dist_base_path_template/_next/static/_O1kJQLGtZmoBMyWpQrea/_buildManifest.js +0 -1
  450. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/1125-91d3ce33140ef041.js +0 -1
  451. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/1749-607014ecf28268bf.js +0 -1
  452. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/1952-573c7fc7ad84da6e.js +0 -1
  453. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/3004-231cad9039ae5dcb.js +0 -1
  454. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/3419-0873e170ef7d6303.js +0 -1
  455. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/3932-0ceca9599d6e6d00.js +0 -1
  456. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/4267-335766a915ee2fa9.js +0 -1
  457. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/5457-8be2e0a3fe0ba64b.js +0 -1
  458. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/5499-bca977f466e259e1.js +0 -1
  459. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/553-edf533e634e85192.js +0 -1
  460. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/5810-37c6091b29a1fe53.js +0 -1
  461. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/600-0733eb84f0a0a9e0.js +0 -1
  462. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/6333-95ad799d13326dce.js +0 -1
  463. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/8224-39a93ee1058b6069.js +0 -1
  464. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/8264-6ef8fdb195694807.js +0 -1
  465. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/9264-1b5c4b071ed544c3.js +0 -1
  466. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/framework-7c365855dab1bf41.js +0 -1
  467. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/_app-1203afde83fa2d6e.js +0 -1
  468. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/block-layout-c465c14d48392b11.js +0 -1
  469. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/compute-b1f8d5a7a9a30f2d.js +0 -1
  470. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/files-93c094bad0f299fb.js +0 -1
  471. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/manage/files-891e5bd5935f7473.js +0 -1
  472. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/manage/settings-d2e4ee4e68d36807.js +0 -1
  473. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/manage/users/new-4a49126fcfe8ced0.js +0 -1
  474. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/manage-5f8c5d0bc6ad1113.js +0 -1
  475. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/backfills-a9266d353f288e8c.js +0 -1
  476. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/dashboard-b5c29c852262312e.js +0 -1
  477. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/edit-9f233917aa72ad82.js +0 -1
  478. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/monitors/block-runs-5af599da035252a7.js +0 -1
  479. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/monitors/block-runtime-8597f8e13d80ee48.js +0 -1
  480. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/monitors-5e0d047a6c9cb1fc.js +0 -1
  481. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/settings-074c32397d341de9.js +0 -1
  482. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/syncs-50f5d8706ed0bc73.js +0 -1
  483. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/triggers/[...slug]-e151c1552fcb67bd.js +0 -1
  484. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines-8336c4326f1e7d96.js +0 -1
  485. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/account/profile-01dd679e4a21e0d9.js +0 -1
  486. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/workspace/preferences-4d9051c073a9b2ff.js +0 -1
  487. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/workspace/sync-data-5a306deca6717862.js +0 -1
  488. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/sign-in-0dbc5b11019e78a0.js +0 -1
  489. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/terminal-578d862f3e56e6e6.js +0 -1
  490. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/test-1c0588d685b909b9.js +0 -1
  491. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/version-control-114000e84313994f.js +0 -1
  492. /mage_ai/server/frontend_dist/_next/static/{icIDjCezcfhiKL87kgeSY → 9jB4XPuz6BzxBcG9VNao5}/_ssgManifest.js +0 -0
  493. /mage_ai/server/frontend_dist_base_path_template/_next/static/{_O1kJQLGtZmoBMyWpQrea → uPDjJYpJMst1q6psbRyte}/_ssgManifest.js +0 -0
  494. {mage_ai-0.9.45.dist-info → mage_ai-0.9.46.dist-info}/LICENSE +0 -0
  495. {mage_ai-0.9.45.dist-info → mage_ai-0.9.46.dist-info}/WHEEL +0 -0
  496. {mage_ai-0.9.45.dist-info → mage_ai-0.9.46.dist-info}/entry_points.txt +0 -0
  497. {mage_ai-0.9.45.dist-info → mage_ai-0.9.46.dist-info}/top_level.txt +0 -0
@@ -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,
@@ -1,19 +1,26 @@
1
+ from typing import Dict
2
+
1
3
  from mage_ai.api.errors import ApiError
2
- from mage_ai.services.spark.api.local import LocalAPI
4
+ from mage_ai.services.spark.api.base import BaseAPI
5
+ from mage_ai.services.spark.api.service import API
3
6
  from mage_ai.services.spark.models.applications import Application
4
7
 
5
8
 
6
9
  class SparkApplicationChild:
10
+ @classmethod
11
+ def build_api(self) -> BaseAPI:
12
+ return API.build()
13
+
7
14
  @classmethod
8
15
  async def get_application_id(self, **kwargs) -> str:
9
16
  application_id = None
10
17
  parent_model = kwargs.get('parent_model')
11
18
  if parent_model and isinstance(parent_model, Application):
12
- application_id = parent_model.id
19
+ application_id = parent_model.calculated_id()
13
20
  else:
14
- models = await LocalAPI().applications()
21
+ models = await self.build_api().applications()
15
22
  if models and len(models) >= 1:
16
- application_id = models[0].id
23
+ application_id = models[0].calculated_id()
17
24
 
18
25
  if not application_id:
19
26
  error = ApiError(ApiError.RESOURCE_NOT_FOUND)
@@ -22,3 +29,17 @@ class SparkApplicationChild:
22
29
  raise error
23
30
 
24
31
  return application_id
32
+
33
+ @classmethod
34
+ def application_calculated_id_from_query(self, query: Dict = None) -> str:
35
+ if not query:
36
+ return None
37
+
38
+ application_id = query.get('application_id', [])
39
+ if application_id:
40
+ application_id = application_id[0]
41
+
42
+ if application_id:
43
+ application_id = Application.load(id=application_id).calculated_id()
44
+
45
+ return application_id
@@ -1,4 +1,3 @@
1
- import os
2
1
  import secrets
3
2
  from datetime import datetime, timedelta
4
3
  from typing import Dict
@@ -10,10 +9,9 @@ from mage_ai.orchestration.db.models.oauth import (
10
9
  Oauth2Application,
11
10
  User,
12
11
  )
13
- from mage_ai.settings import MAGE_ACCESS_TOKEN_EXPIRY_TIME
12
+ from mage_ai.settings import JWT_SECRET, MAGE_ACCESS_TOKEN_EXPIRY_TIME
14
13
 
15
14
  JWT_ALGORITHM = 'HS256'
16
- JWT_SECRET = os.getenv('JWT_SECRET', 'materia')
17
15
 
18
16
 
19
17
  def generate_access_token(
@@ -17,6 +17,9 @@ class EntityName(str, Enum):
17
17
  Chart = 'Chart'
18
18
  ClientPage = 'ClientPage'
19
19
  Cluster = 'Cluster'
20
+ ComputeCluster = 'ComputeCluster'
21
+ ComputeConnection = 'ComputeConnection'
22
+ ComputeService = 'ComputeService'
20
23
  CustomTemplate = 'CustomTemplate'
21
24
  DataProvider = 'DataProvider'
22
25
  Database = 'Database'
@@ -33,6 +36,7 @@ class EntityName(str, Enum):
33
36
  GitCustomBranch = 'GitCustomBranch'
34
37
  GitFile = 'GitFile'
35
38
  GlobalDataProduct = 'GlobalDataProduct'
39
+ GlobalHook = 'GlobalHook'
36
40
  IntegrationDestination = 'IntegrationDestination'
37
41
  IntegrationSource = 'IntegrationSource'
38
42
  IntegrationSourceStream = 'IntegrationSourceStream'
@@ -0,0 +1,136 @@
1
+ import json
2
+ import uuid
3
+ from typing import Awaitable, Dict
4
+ from urllib.parse import quote_plus
5
+
6
+ import aiohttp
7
+
8
+ from mage_ai.authentication.oauth.constants import (
9
+ ACTIVE_DIRECTORY_CLIENT_ID as ACTIVE_DIRECTORY_MAGE_CLIENT_ID,
10
+ )
11
+ from mage_ai.authentication.oauth.constants import OAUTH_PROVIDER_ACTIVE_DIRECTORY
12
+ from mage_ai.authentication.providers.oauth import OauthProvider
13
+ from mage_ai.authentication.providers.sso import SsoProvider
14
+ from mage_ai.authentication.providers.utils import get_base_url
15
+ from mage_ai.settings import ACTIVE_DIRECTORY_DIRECTORY_ID
16
+ from mage_ai.settings.sso import (
17
+ ACTIVE_DIRECTORY_CLIENT_ID,
18
+ ACTIVE_DIRECTORY_CLIENT_SECRET,
19
+ )
20
+
21
+
22
+ class ADProvider(SsoProvider, OauthProvider):
23
+ provider = OAUTH_PROVIDER_ACTIVE_DIRECTORY
24
+
25
+ def __init__(self):
26
+ self.__validate()
27
+
28
+ def __validate(self):
29
+ if not ACTIVE_DIRECTORY_DIRECTORY_ID:
30
+ raise Exception(
31
+ 'AD directory id is empty. '
32
+ 'Make sure the ACTIVE_DIRECTORY_DIRECTORY_ID environment variable is set.')
33
+ if ACTIVE_DIRECTORY_CLIENT_ID and not ACTIVE_DIRECTORY_CLIENT_SECRET:
34
+ raise Exception(
35
+ 'AD client secret is empty. '
36
+ 'Make sure the ACTIVE_DIRECTORY_CLIENT_SECRET environment variable is set.')
37
+
38
+ def get_auth_url_response(self, redirect_uri: str = None, **kwargs) -> Dict:
39
+ """
40
+ For active directory, the user can set up the Oauth provider in two different ways. They
41
+ can either just set the ACTIVE_DIRECTORY_DIRECTORY_ID which will use the Mage application we
42
+ set up in Azure. They can additionally set the ACTIVE_DIRECTORY_CLIENT_ID and
43
+ ACTIVE_DIRECTORY_CLIENT_SECRET which will use their own Mage application in Azure.
44
+ """
45
+ ad_directory_id = ACTIVE_DIRECTORY_DIRECTORY_ID
46
+ if ACTIVE_DIRECTORY_CLIENT_ID:
47
+ base_url = get_base_url(redirect_uri)
48
+ redirect_uri_query = dict(
49
+ provider=self.provider,
50
+ redirect_uri=redirect_uri,
51
+ )
52
+ query = dict(
53
+ client_id=ACTIVE_DIRECTORY_CLIENT_ID,
54
+ redirect_uri=quote_plus(
55
+ f'{base_url}/oauth',
56
+ ),
57
+ response_type='code',
58
+ scope='User.Read',
59
+ state=uuid.uuid4().hex,
60
+ )
61
+ query_strings = []
62
+ for k, v in query.items():
63
+ query_strings.append(f'{k}={v}')
64
+
65
+ return dict(
66
+ url=f"https://login.microsoftonline.com/{ad_directory_id}/oauth2/v2.0/authorize?{'&'.join(query_strings)}", # noqa: E501
67
+ redirect_query_params=redirect_uri_query,
68
+ )
69
+ else:
70
+ from requests.models import PreparedRequest
71
+
72
+ req = PreparedRequest()
73
+ req.prepare_url(redirect_uri, dict(provider=self.provider))
74
+ query = dict(
75
+ client_id=ACTIVE_DIRECTORY_MAGE_CLIENT_ID,
76
+ redirect_uri=f'https://api.mage.ai/v1/oauth/{self.provider}',
77
+ response_type='code',
78
+ scope='User.Read',
79
+ state=quote_plus(
80
+ json.dumps(
81
+ dict(
82
+ redirect_uri=req.url,
83
+ tenant_id=ad_directory_id,
84
+ )
85
+ )
86
+ ),
87
+ )
88
+ query_strings = []
89
+ for k, v in query.items():
90
+ query_strings.append(f'{k}={v}')
91
+
92
+ return dict(
93
+ url=f"https://login.microsoftonline.com/{ad_directory_id}/oauth2/v2.0/authorize?{'&'.join(query_strings)}", # noqa: E501
94
+ )
95
+
96
+ async def get_access_token_response(self, code: str, **kwargs) -> Awaitable[Dict]:
97
+ base_url = get_base_url(kwargs.get('redirect_uri'))
98
+
99
+ async with aiohttp.ClientSession() as session:
100
+ async with session.post(
101
+ 'https://login.microsoftonline.com/organizations/oauth2/v2.0/token',
102
+ headers={
103
+ 'Accept': 'application/json',
104
+ },
105
+ data=dict(
106
+ client_id=ACTIVE_DIRECTORY_CLIENT_ID,
107
+ client_secret=ACTIVE_DIRECTORY_CLIENT_SECRET,
108
+ code=code,
109
+ grant_type='authorization_code',
110
+ redirect_uri=f'{base_url}/oauth',
111
+ tenant=ACTIVE_DIRECTORY_DIRECTORY_ID,
112
+ ),
113
+ timeout=20,
114
+ ) as response:
115
+ data = await response.json()
116
+
117
+ return data
118
+
119
+ async def get_user_info(self, access_token: str = None, **kwargs) -> Awaitable[Dict]:
120
+ if access_token is None:
121
+ raise Exception('Access token is required to fetch user info.')
122
+ async with aiohttp.ClientSession() as session:
123
+ async with session.get(
124
+ 'https://graph.microsoft.com/v1.0/me',
125
+ headers={
126
+ 'Content-Type': 'application\\json',
127
+ 'Authorization': f'Bearer {access_token}',
128
+ },
129
+ timeout=10,
130
+ ) as response:
131
+ userinfo_resp = await response.json()
132
+
133
+ return dict(
134
+ email=userinfo_resp.get('userPrincipalName'),
135
+ username=userinfo_resp.get('userPrincipalName'),
136
+ )
@@ -1,13 +1,16 @@
1
1
  from mage_ai.authentication.oauth.constants import (
2
+ OAUTH_PROVIDER_ACTIVE_DIRECTORY,
2
3
  OAUTH_PROVIDER_GHE,
3
4
  OAUTH_PROVIDER_GOOGLE,
4
5
  OAUTH_PROVIDER_OKTA,
5
6
  )
7
+ from mage_ai.authentication.providers.active_directory import ADProvider
6
8
  from mage_ai.authentication.providers.ghe import GHEProvider
7
9
  from mage_ai.authentication.providers.google import GoogleProvider
8
10
  from mage_ai.authentication.providers.okta import OktaProvider
9
11
 
10
12
  NAME_TO_PROVIDER = {
13
+ OAUTH_PROVIDER_ACTIVE_DIRECTORY: ADProvider,
11
14
  OAUTH_PROVIDER_GHE: GHEProvider,
12
15
  OAUTH_PROVIDER_GOOGLE: GoogleProvider,
13
16
  OAUTH_PROVIDER_OKTA: OktaProvider,
@@ -1,7 +1,7 @@
1
1
  import os
2
2
  import urllib.parse
3
3
  import uuid
4
- from typing import Dict
4
+ from typing import Awaitable, Dict
5
5
 
6
6
  import aiohttp
7
7
 
@@ -39,30 +39,29 @@ class GHEProvider(OauthProvider):
39
39
  'Make sure the GHE_CLIENT_SECRET environment variable is set.')
40
40
 
41
41
  def get_auth_url_response(self, redirect_uri: str = None, **kwargs) -> Dict:
42
- if self.hostname:
43
- base_url = get_base_url(redirect_uri)
44
- redirect_uri_query = dict(
45
- provider=self.provider,
46
- redirect_uri=redirect_uri,
47
- )
48
- query = dict(
49
- client_id=os.getenv(GHE_CLIENT_ID_ENV_VAR),
50
- redirect_uri=urllib.parse.quote_plus(
51
- f'{base_url}/oauth',
52
- ),
53
- scope='repo',
54
- state=uuid.uuid4().hex,
55
- )
56
- query_strings = []
57
- for k, v in query.items():
58
- query_strings.append(f'{k}={v}')
42
+ base_url = get_base_url(redirect_uri)
43
+ redirect_uri_query = dict(
44
+ provider=self.provider,
45
+ redirect_uri=redirect_uri,
46
+ )
47
+ query = dict(
48
+ client_id=self.client_id,
49
+ redirect_uri=urllib.parse.quote_plus(
50
+ f'{base_url}/oauth',
51
+ ),
52
+ scope='repo',
53
+ state=uuid.uuid4().hex,
54
+ )
55
+ query_strings = []
56
+ for k, v in query.items():
57
+ query_strings.append(f'{k}={v}')
59
58
 
60
- return dict(
61
- url=f"{self.hostname}/login/oauth/authorize?{'&'.join(query_strings)}",
62
- redirect_query_params=redirect_uri_query,
63
- )
59
+ return dict(
60
+ url=f"{self.hostname}/login/oauth/authorize?{'&'.join(query_strings)}",
61
+ redirect_query_params=redirect_uri_query,
62
+ )
64
63
 
65
- async def get_access_token_response(self, code: str, **kwargs) -> Dict:
64
+ async def get_access_token_response(self, code: str, **kwargs) -> Awaitable[Dict]:
66
65
  data = dict()
67
66
  async with aiohttp.ClientSession() as session:
68
67
  async with session.post(
@@ -71,8 +70,8 @@ class GHEProvider(OauthProvider):
71
70
  'Accept': 'application/json',
72
71
  },
73
72
  data=dict(
74
- client_id=os.getenv(GHE_CLIENT_ID_ENV_VAR),
75
- client_secret=os.getenv(GHE_CLIENT_SECRET_ENV_VAR),
73
+ client_id=self.client_id,
74
+ client_secret=self.client_secret,
76
75
  code=code,
77
76
  ),
78
77
  timeout=20,
@@ -1,6 +1,6 @@
1
1
  import urllib.parse
2
2
  import uuid
3
- from typing import Dict
3
+ from typing import Awaitable, Dict
4
4
 
5
5
  import aiohttp
6
6
 
@@ -25,32 +25,31 @@ class GoogleProvider(SsoProvider, OauthProvider):
25
25
  'Make sure the GOOGLE_CLIENT_SECRET environment variable is set.')
26
26
 
27
27
  def get_auth_url_response(self, redirect_uri: str = None, **kwargs) -> Dict:
28
- if GOOGLE_CLIENT_ID:
29
- base_url = get_base_url(redirect_uri)
30
- redirect_uri_query = dict(
31
- provider=self.provider,
32
- redirect_uri=redirect_uri,
33
- )
34
- query = dict(
35
- client_id=GOOGLE_CLIENT_ID,
36
- prompt='select_account',
37
- redirect_uri=urllib.parse.quote_plus(
38
- f'{base_url}/oauth',
39
- ),
40
- response_type='code',
41
- scope='https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/userinfo.profile', # noqa: E501
42
- state=uuid.uuid4().hex,
43
- )
44
- query_strings = []
45
- for k, v in query.items():
46
- query_strings.append(f'{k}={v}')
28
+ base_url = get_base_url(redirect_uri)
29
+ redirect_uri_query = dict(
30
+ provider=self.provider,
31
+ redirect_uri=redirect_uri,
32
+ )
33
+ query = dict(
34
+ client_id=GOOGLE_CLIENT_ID,
35
+ prompt='select_account',
36
+ redirect_uri=urllib.parse.quote_plus(
37
+ f'{base_url}/oauth',
38
+ ),
39
+ response_type='code',
40
+ scope='https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/userinfo.profile', # noqa: E501
41
+ state=uuid.uuid4().hex,
42
+ )
43
+ query_strings = []
44
+ for k, v in query.items():
45
+ query_strings.append(f'{k}={v}')
47
46
 
48
- return dict(
49
- url=f"https://accounts.google.com/o/oauth2/v2/auth?{'&'.join(query_strings)}",
50
- redirect_query_params=redirect_uri_query,
51
- )
47
+ return dict(
48
+ url=f"https://accounts.google.com/o/oauth2/v2/auth?{'&'.join(query_strings)}",
49
+ redirect_query_params=redirect_uri_query,
50
+ )
52
51
 
53
- async def get_access_token_response(self, code: str, **kwargs) -> Dict:
52
+ async def get_access_token_response(self, code: str, **kwargs) -> Awaitable[Dict]:
54
53
  base_url = get_base_url(kwargs.get('redirect_uri'))
55
54
 
56
55
  data = dict()
@@ -70,7 +69,7 @@ class GoogleProvider(SsoProvider, OauthProvider):
70
69
 
71
70
  return data
72
71
 
73
- async def get_user_info(self, access_token: str = None, **kwargs) -> Dict:
72
+ async def get_user_info(self, access_token: str = None, **kwargs) -> Awaitable[Dict]:
74
73
  if access_token is None:
75
74
  raise Exception('Access token is required to fetch user info.')
76
75
  async with aiohttp.ClientSession() as session: