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
@@ -0,0 +1,126 @@
1
+ from mage_ai.api.oauth_scope import OauthScope
2
+ from mage_ai.api.operations.constants import OperationType
3
+ from mage_ai.api.policies.BasePolicy import BasePolicy
4
+ from mage_ai.api.presenters.GlobalHookPresenter import GlobalHookPresenter
5
+
6
+ WRITEABLE_ATTRIBUTES = [
7
+ 'conditions',
8
+ 'operation_type',
9
+ 'outputs',
10
+ 'pipeline',
11
+ 'predicates',
12
+ 'resource_type',
13
+ 'run_settings',
14
+ 'stages',
15
+ 'strategies',
16
+ ]
17
+
18
+
19
+ class GlobalHookPolicy(BasePolicy):
20
+ pass
21
+
22
+
23
+ GlobalHookPolicy.allow_actions(
24
+ [
25
+ OperationType.CREATE,
26
+ OperationType.DELETE,
27
+ OperationType.DETAIL,
28
+ OperationType.LIST,
29
+ OperationType.UPDATE,
30
+ ],
31
+ scopes=[
32
+ OauthScope.CLIENT_PRIVATE,
33
+ ],
34
+ condition=lambda policy: policy.has_at_least_admin_role(),
35
+ override_permission_condition=lambda _policy: True,
36
+ )
37
+
38
+
39
+ GlobalHookPolicy.allow_read(
40
+ GlobalHookPresenter.default_attributes + [
41
+ 'operation_types',
42
+ 'pipeline_details',
43
+ 'resource_types',
44
+ ],
45
+ scopes=[
46
+ OauthScope.CLIENT_PRIVATE,
47
+ ],
48
+ on_action=[
49
+ OperationType.CREATE,
50
+ OperationType.DELETE,
51
+ OperationType.DETAIL,
52
+ OperationType.LIST,
53
+ OperationType.UPDATE,
54
+ ],
55
+ condition=lambda policy: policy.has_at_least_admin_role(),
56
+ override_permission_condition=lambda _policy: True,
57
+ )
58
+
59
+
60
+ GlobalHookPolicy.allow_write(
61
+ WRITEABLE_ATTRIBUTES + [
62
+ 'uuid',
63
+ ],
64
+ scopes=[
65
+ OauthScope.CLIENT_PRIVATE,
66
+ ],
67
+ on_action=[
68
+ OperationType.CREATE,
69
+ ],
70
+ condition=lambda policy: policy.has_at_least_admin_role(),
71
+ override_permission_condition=lambda _policy: True,
72
+ )
73
+
74
+
75
+ GlobalHookPolicy.allow_write(
76
+ WRITEABLE_ATTRIBUTES + [
77
+ 'snapshot',
78
+ ],
79
+ scopes=[
80
+ OauthScope.CLIENT_PRIVATE,
81
+ ],
82
+ on_action=[
83
+ OperationType.UPDATE,
84
+ ],
85
+ condition=lambda policy: policy.has_at_least_admin_role(),
86
+ override_permission_condition=lambda _policy: True,
87
+ )
88
+
89
+
90
+ GlobalHookPolicy.allow_query(
91
+ [
92
+ 'include_snapshot_validation',
93
+ 'operation_type[]',
94
+ 'resource_type[]',
95
+ ],
96
+ scopes=[
97
+ OauthScope.CLIENT_PRIVATE,
98
+ ],
99
+ on_action=[
100
+ OperationType.LIST,
101
+ ],
102
+ condition=lambda policy: policy.has_at_least_admin_role(),
103
+ override_permission_condition=lambda _policy: True,
104
+ )
105
+
106
+
107
+ GlobalHookPolicy.allow_query(
108
+ [
109
+ 'include_operation_types',
110
+ 'include_resource_types',
111
+ 'include_snapshot_validation',
112
+ 'operation_type',
113
+ 'resource_type',
114
+ ],
115
+ scopes=[
116
+ OauthScope.CLIENT_PRIVATE,
117
+ ],
118
+ on_action=[
119
+ OperationType.CREATE,
120
+ OperationType.DELETE,
121
+ OperationType.DETAIL,
122
+ OperationType.UPDATE,
123
+ ],
124
+ condition=lambda policy: policy.has_at_least_admin_role(),
125
+ override_permission_condition=lambda _policy: True,
126
+ )
@@ -1,11 +1,60 @@
1
+ from typing import Dict
2
+
3
+ from mage_ai.api.constants import AttributeOperationType, AttributeType
1
4
  from mage_ai.api.oauth_scope import OauthScope
2
5
  from mage_ai.api.operations import constants
6
+ from mage_ai.api.operations.constants import OperationType
3
7
  from mage_ai.api.policies.BasePolicy import BasePolicy
8
+ from mage_ai.api.policies.mixins.user_permissions import UserPermissionMixIn
4
9
  from mage_ai.api.presenters.OauthPresenter import OauthPresenter
5
-
6
-
7
- class OauthPolicy(BasePolicy):
8
- pass
10
+ from mage_ai.shared.hash import merge_dict
11
+
12
+
13
+ class OauthPolicy(BasePolicy, UserPermissionMixIn):
14
+ @classmethod
15
+ def action_rule_with_permissions(self, operation: OperationType) -> Dict:
16
+ return merge_dict(
17
+ super().action_rule_with_permissions(operation),
18
+ {
19
+ OauthScope.CLIENT_PUBLIC: [
20
+ dict(
21
+ condition=lambda _policy: operation
22
+ in [OperationType.DETAIL, OperationType.LIST],
23
+ ),
24
+ ],
25
+ },
26
+ )
27
+
28
+ @classmethod
29
+ def attribute_rule_with_permissions(
30
+ self,
31
+ attribute_operation_type: AttributeOperationType,
32
+ resource_attribute: str,
33
+ ) -> Dict:
34
+ config = {}
35
+ if AttributeOperationType.READ == attribute_operation_type:
36
+ config = self.read_rules[self.__name__].get(resource_attribute)
37
+ elif AttributeOperationType.QUERY == attribute_operation_type:
38
+ config = self.query_rules[self.__name__].get(AttributeType.ALL)
39
+ else:
40
+ config = self.write_rules[self.__name__].get(resource_attribute)
41
+
42
+ return merge_dict(
43
+ super().attribute_rule_with_permissions(
44
+ attribute_operation_type,
45
+ resource_attribute,
46
+ ),
47
+ {
48
+ OauthScope.CLIENT_PUBLIC: {
49
+ OperationType.DETAIL: config[OauthScope.CLIENT_PUBLIC][
50
+ OperationType.DETAIL
51
+ ],
52
+ OperationType.LIST: config[OauthScope.CLIENT_PUBLIC][
53
+ OperationType.LIST
54
+ ],
55
+ },
56
+ },
57
+ )
9
58
 
10
59
 
11
60
  OauthPolicy.allow_actions(
@@ -23,6 +72,7 @@ OauthPolicy.allow_actions(
23
72
  OauthPolicy.allow_actions(
24
73
  [
25
74
  constants.DETAIL,
75
+ constants.LIST,
26
76
  ],
27
77
  scopes=[
28
78
  OauthScope.CLIENT_PRIVATE,
@@ -52,6 +102,7 @@ OauthPolicy.allow_read(
52
102
  OauthScope.CLIENT_PUBLIC,
53
103
  ],
54
104
  on_action=[
105
+ constants.LIST,
55
106
  constants.DETAIL,
56
107
  ],
57
108
  condition=lambda policy: policy.has_at_least_viewer_role(),
@@ -89,6 +140,7 @@ OauthPolicy.allow_write(
89
140
 
90
141
  OauthPolicy.allow_query(
91
142
  on_action=[
143
+ constants.LIST,
92
144
  constants.DETAIL,
93
145
  ],
94
146
  scopes=[
@@ -40,6 +40,7 @@ ProjectPolicy.allow_write([
40
40
  'emr_config',
41
41
  'features',
42
42
  'openai_api_key',
43
+ 'pipelines',
43
44
  'remote_variables_dir',
44
45
  'spark_config',
45
46
  ], scopes=[
@@ -0,0 +1,19 @@
1
+ from typing import Dict
2
+
3
+ from mage_ai.api.presenters.BasePresenter import BasePresenter
4
+ from mage_ai.shared.models import BaseDataClass
5
+
6
+
7
+ class ComputeClusterPresenter(BasePresenter):
8
+ default_attributes = [
9
+ 'cluster',
10
+ ]
11
+
12
+ async def prepare_present(self, **kwargs) -> Dict:
13
+ data = self.resource.model
14
+ if 'cluster' in data:
15
+ cluster = data.get('cluster')
16
+ if isinstance(cluster, BaseDataClass):
17
+ data['cluster'] = cluster.to_dict()
18
+
19
+ return data
@@ -0,0 +1,26 @@
1
+ from typing import Dict
2
+
3
+ from mage_ai.api.presenters.BasePresenter import BasePresenter
4
+
5
+
6
+ class ComputeConnectionPresenter(BasePresenter):
7
+ default_attributes = [
8
+ 'actions',
9
+ 'attributes',
10
+ 'connection',
11
+ 'description',
12
+ 'error',
13
+ 'group',
14
+ 'name',
15
+ 'required',
16
+ 'state',
17
+ 'status',
18
+ 'status_calculated',
19
+ 'steps',
20
+ 'tab',
21
+ 'target',
22
+ 'uuid',
23
+ ]
24
+
25
+ async def prepare_present(self, **kwargs) -> Dict:
26
+ return self.resource.model.to_dict()
@@ -0,0 +1,15 @@
1
+ from typing import Dict
2
+
3
+ from mage_ai.api.presenters.BasePresenter import BasePresenter
4
+
5
+
6
+ class ComputeServicePresenter(BasePresenter):
7
+ default_attributes = [
8
+ 'connection_credentials',
9
+ 'clusters',
10
+ 'setup_steps',
11
+ 'uuid',
12
+ ]
13
+
14
+ async def prepare_present(self, **kwargs) -> Dict:
15
+ return self.resource.model.to_dict()
@@ -0,0 +1,13 @@
1
+ from mage_ai.api.presenters.BasePresenter import BasePresenter
2
+
3
+
4
+ class DownloadPresenter(BasePresenter):
5
+ default_attributes = [
6
+ 'uri',
7
+ ]
8
+
9
+ def present(self, **kwargs):
10
+ if type(self.model) is dict:
11
+ return self.model
12
+
13
+ return self.model.to_dict()
@@ -0,0 +1,74 @@
1
+ from typing import Dict
2
+
3
+ from mage_ai.api.operations.constants import OperationType
4
+ from mage_ai.api.presenters.BasePresenter import BasePresenter
5
+ from mage_ai.data_preparation.models.global_hooks.constants import RESOURCE_TYPES
6
+ from mage_ai.data_preparation.models.global_hooks.models import HookOperation
7
+
8
+
9
+ class GlobalHookPresenter(BasePresenter):
10
+ default_attributes = [
11
+ 'conditions',
12
+ 'metadata',
13
+ 'operation_type',
14
+ 'outputs',
15
+ 'pipeline',
16
+ 'predicates',
17
+ 'resource_type',
18
+ 'run_settings',
19
+ 'stages',
20
+ 'strategies',
21
+ 'uuid',
22
+ ]
23
+
24
+ async def prepare_present(self, **kwargs) -> Dict:
25
+ query = kwargs.get('query') or {}
26
+
27
+ data = {}
28
+ if self.resource.model:
29
+ include_snapshot_validation = False
30
+ if 'include_snapshot_validation' in query:
31
+ include_snapshot_validation = True
32
+
33
+ data = self.resource.model.to_dict(
34
+ include_all=True,
35
+ include_snapshot_validation=include_snapshot_validation,
36
+ )
37
+
38
+ display_format = kwargs.get('format')
39
+ if 'with_pipeline_details' == display_format:
40
+ data['pipeline_details'] = await self.pipeline_details(**kwargs)
41
+
42
+ if 'include_operation_types' in query:
43
+ data['operation_types'] = [m.value for m in HookOperation]
44
+
45
+ if 'include_resource_types' in query:
46
+ data['resource_types'] = RESOURCE_TYPES
47
+
48
+ return data
49
+
50
+ async def pipeline_details(self, **kwargs) -> Dict:
51
+ if self.resource.model.pipeline_settings and \
52
+ self.resource.model.pipeline_settings.get('uuid'):
53
+
54
+ pipeline = await self.resource.pipeline
55
+ pipeline_dict = await pipeline.to_dict_async()
56
+ return pipeline_dict
57
+
58
+
59
+ GlobalHookPresenter.register_format(
60
+ 'with_pipeline_details',
61
+ GlobalHookPresenter.default_attributes + [
62
+ 'pipeline_details',
63
+ ],
64
+ )
65
+
66
+
67
+ GlobalHookPresenter.register_format(
68
+ OperationType.DETAIL,
69
+ GlobalHookPresenter.default_attributes + [
70
+ 'operation_types',
71
+ 'pipeline_details',
72
+ 'resource_types',
73
+ ],
74
+ )
@@ -22,6 +22,7 @@ class PipelinePresenter(BasePresenter):
22
22
  'notification_config',
23
23
  'retry_config',
24
24
  'run_pipeline_in_one_process',
25
+ 'settings',
25
26
  'spark_config',
26
27
  'tags',
27
28
  'type',
@@ -9,6 +9,7 @@ class ProjectPresenter(BasePresenter):
9
9
  'latest_version',
10
10
  'name',
11
11
  'openai_api_key',
12
+ 'pipelines',
12
13
  'project_uuid',
13
14
  'remote_variables_dir',
14
15
  'spark_config',
@@ -4,6 +4,8 @@ from mage_ai.api.presenters.BasePresenter import BasePresenter
4
4
  class SparkApplicationPresenter(BasePresenter):
5
5
  default_attributes = [
6
6
  'attempts',
7
+ 'attempts_count',
8
+ 'calculated_id',
7
9
  'id',
8
10
  'name',
9
11
  'spark_ui_url',
@@ -1,30 +1,30 @@
1
+ from dataclasses import fields
2
+
1
3
  from mage_ai.api.presenters.BasePresenter import BasePresenter
4
+ from mage_ai.cluster_manager.config import (
5
+ CloudRunWorkspaceConfig,
6
+ EcsWorkspaceConfig,
7
+ KubernetesWorkspaceConfig,
8
+ )
2
9
  from mage_ai.shared.hash import merge_dict
3
10
 
4
11
 
5
12
  class WorkspacePresenter(BasePresenter):
6
- default_attributes = [
7
- 'access',
8
- 'cluster_name',
9
- 'cluster_type',
10
- 'container_config',
11
- 'container_name',
12
- 'instance',
13
- 'lifecycle_config',
14
- 'name',
15
- 'namespace',
16
- 'path_to_credentials',
17
- 'project_uuid',
18
- 'project_id',
19
- 'region',
20
- 'repo_path',
21
- 'service_account_name',
22
- 'storage_class_name',
23
- 'storage_access_mode',
24
- 'storage_request_size',
25
- 'success',
26
- 'task_definition',
27
- ]
13
+ default_attributes = list(
14
+ set(
15
+ [
16
+ 'access',
17
+ 'cluster_type',
18
+ 'instance',
19
+ 'name',
20
+ 'repo_path',
21
+ 'success',
22
+ *[f.name for f in fields(KubernetesWorkspaceConfig)],
23
+ *[f.name for f in fields(CloudRunWorkspaceConfig)],
24
+ *[f.name for f in fields(EcsWorkspaceConfig)],
25
+ ]
26
+ )
27
+ )
28
28
 
29
29
  async def present(self, **kwargs):
30
30
  workspace = self.model.pop('workspace', None)
@@ -0,0 +1,39 @@
1
+ from mage_ai.api.resources.BaseResource import BaseResource
2
+ from mage_ai.api.result_set import ResultSet
3
+
4
+
5
+ class AsyncBaseResource(BaseResource):
6
+ async def collective_load_for_attribute(self, key):
7
+ k_name = self.__class__.__name__
8
+ if self.result_set().context and self.result_set().context.data:
9
+ loaded = self.result_set().context.data.get(k_name, {}).get(key, None)
10
+ else:
11
+ loaded = None
12
+ loader = self.__class__.collective_loader().get(key, None)
13
+ if not loaded and loader:
14
+ loaded = await loader['load'](self)
15
+ if loaded and not isinstance(
16
+ loaded,
17
+ ResultSet) and not isinstance(
18
+ loaded,
19
+ dict):
20
+ loaded = ResultSet(loaded)
21
+ if not self.result_set().context.data.get(k_name):
22
+ self.result_set().context.data[k_name] = {}
23
+ self.result_set().context.data[k_name][key] = loaded
24
+ return loaded
25
+
26
+ async def __getattr__(self, name):
27
+ async def _missing(*args, **kwargs):
28
+ loader = self.__class__.collective_loader().get(name, None)
29
+ if loader:
30
+ arr = await self.collective_load_for_attribute(name)
31
+ if loader['select']:
32
+ val = await loader['select'](self, arr)
33
+ else:
34
+ val = arr
35
+ else:
36
+ val = getattr(self.model, name)
37
+
38
+ return val
39
+ return await _missing()
@@ -41,7 +41,7 @@ class ClusterResource(GenericResource):
41
41
  error['message'] = 'Please include cluster_id in the request payload.'
42
42
  raise ApiError(error)
43
43
 
44
- emr_cluster_manager.set_active_cluster(cluster_id)
44
+ emr_cluster_manager.set_active_cluster(cluster_id=cluster_id)
45
45
  success = True
46
46
 
47
47
  self.model.update(
@@ -0,0 +1,109 @@
1
+ from mage_ai.api.resources.GenericResource import GenericResource
2
+ from mage_ai.services.compute.aws.models import Cluster
3
+ from mage_ai.services.compute.models import ComputeService
4
+ from mage_ai.services.spark.constants import ComputeServiceUUID
5
+ from mage_ai.services.ssh.aws.emr.models import close_tunnel
6
+ from mage_ai.services.ssh.aws.emr.utils import tunnel
7
+
8
+
9
+ class ComputeClusterResource(GenericResource):
10
+ @classmethod
11
+ async def collection(self, query_arg, _meta, user, **kwargs):
12
+ parent_model = kwargs.get('parent_model')
13
+
14
+ include_all_states = query_arg.get('include_all_states', [None])
15
+ if include_all_states:
16
+ include_all_states = include_all_states[0]
17
+
18
+ clusters = []
19
+
20
+ if isinstance(parent_model, ComputeService):
21
+ if ComputeServiceUUID.AWS_EMR == parent_model.uuid:
22
+ try:
23
+ result = parent_model.clusters_and_metadata(
24
+ include_all_states=include_all_states,
25
+ )
26
+ clusters = [dict(
27
+ cluster=cluster,
28
+ ) for cluster in result.get('clusters') or []]
29
+ except Exception as err:
30
+ print(f'[WARNING] ComputeClusterResource.collection: {err}')
31
+
32
+ return self.build_result_set(
33
+ clusters,
34
+ user,
35
+ **kwargs,
36
+ )
37
+
38
+ @classmethod
39
+ async def member(self, pk, user, **kwargs):
40
+ parent_model = kwargs.get('parent_model')
41
+
42
+ cluster = None
43
+
44
+ if isinstance(parent_model, ComputeService):
45
+ if ComputeServiceUUID.AWS_EMR == parent_model.uuid:
46
+ cluster = parent_model.get_cluster_details(pk)
47
+
48
+ return self(dict(
49
+ cluster=cluster,
50
+ ), user, **kwargs)
51
+
52
+ @classmethod
53
+ def create(self, payload, user, **kwargs):
54
+ parent_model = kwargs.get('parent_model')
55
+
56
+ cluster = None
57
+
58
+ if isinstance(parent_model, ComputeService):
59
+ if ComputeServiceUUID.AWS_EMR == parent_model.uuid:
60
+ cluster = parent_model.create_cluster()
61
+
62
+ return self(dict(
63
+ cluster=cluster,
64
+ ), user, **kwargs)
65
+
66
+ async def delete(self, **kwargs):
67
+ parent_model = kwargs.get('parent_model')
68
+
69
+ if isinstance(parent_model, ComputeService):
70
+ if ComputeServiceUUID.AWS_EMR == parent_model.uuid:
71
+ cluster = self.get_cluster()
72
+ parent_model.terminate_clusters([cluster.id])
73
+
74
+ if cluster.active:
75
+ close_tunnel()
76
+
77
+ async def update(self, payload, **kwargs):
78
+ parent_model = kwargs.get('parent_model')
79
+
80
+ if isinstance(parent_model, ComputeService):
81
+ if ComputeServiceUUID.AWS_EMR == parent_model.uuid:
82
+ cluster_id = self.get_cluster_id()
83
+ if cluster_id:
84
+ cluster = parent_model.update_cluster(cluster_id, payload)
85
+ if cluster:
86
+ self.model = dict(cluster=cluster)
87
+
88
+ if cluster.active:
89
+ def _callback(*args, **kwargs):
90
+ tunnel(reconnect=True)
91
+
92
+ self.on_update_callback = _callback
93
+
94
+ def get_cluster(self) -> Cluster:
95
+ return self.model.get('cluster')
96
+
97
+ def get_cluster_id(self) -> str:
98
+ cluster_id = None
99
+
100
+ if 'cluster' in self.model:
101
+ cluster = self.get_cluster()
102
+ if cluster:
103
+ cluster_id = None
104
+ if isinstance(cluster, Cluster):
105
+ cluster_id = cluster.id
106
+ elif isinstance(cluster, dict):
107
+ cluster_id = cluster.get('id')
108
+
109
+ return cluster_id