/api/cloud-migration endpoints. Only one migration should be happening at any given time. But if something weird happens with concurrency, /cancel will cancel all of them. | (ns metabase.cloud-migration.api (:require [metabase.api.common :as api] [metabase.api.macros :as api.macros] [metabase.cloud-migration.models.cloud-migration :as cloud-migration] [metabase.cloud-migration.settings :as cloud-migration.settings] [metabase.premium-features.core :as premium-features] [toucan2.core :as t2])) |
(api.macros/defendpoint :post "/" "Initiate a new cloud migration." [] (api/check-superuser) (cond (premium-features/is-hosted?) {:status 400 :body "Cannot migrate a hosted instance."} (t2/select-one :model/CloudMigration :state [:not-in cloud-migration/terminal-states]) {:status 409 :body "There's an ongoing migration already."} :else (try (let [cloud-migration (t2/insert-returning-instance! :model/CloudMigration (cloud-migration/get-store-migration))] (future (cloud-migration/migrate! cloud-migration)) cloud-migration) (catch Exception e (condp = (-> e ex-data :status) 404 {:status 404 :body "Could not establish a connection to Metabase Cloud."} 400 {:status 400 :body "Cannot migrate this Metabase version."} {:status 500}))))) | |
(api.macros/defendpoint :get "/" "Get the latest cloud migration, if any." [] (api/check-superuser) (t2/select-one :model/CloudMigration {:order-by [[:created_at :desc]]})) | |
(api.macros/defendpoint :put "/cancel" "Cancel any ongoing cloud migrations, if any." [] (api/check-superuser) (cloud-migration.settings/read-only-mode! false) (t2/update! :model/CloudMigration {:state [:not-in cloud-migration/terminal-states]} {:state :cancelled})) | |