From 79f54d6992263b05eb2f026a1bb84431bceefb32 Mon Sep 17 00:00:00 2001 From: Ngoc Khuat <qn.khuat@gmail.com> Date: Sun, 19 Nov 2023 12:13:14 +0700 Subject: [PATCH] Remove POST ee/serialization/serialize/data-model (#35849) --- .../src/metabase_enterprise/api/routes.clj | 6 +- .../serialization/api/routes.clj | 15 --- .../serialization/api/serialize.clj | 46 -------- .../serialization/api/serialize_test.clj | 108 ------------------ 4 files changed, 1 insertion(+), 174 deletions(-) delete mode 100644 enterprise/backend/src/metabase_enterprise/serialization/api/routes.clj delete mode 100644 enterprise/backend/src/metabase_enterprise/serialization/api/serialize.clj delete mode 100644 enterprise/backend/test/metabase_enterprise/serialization/api/serialize_test.clj diff --git a/enterprise/backend/src/metabase_enterprise/api/routes.clj b/enterprise/backend/src/metabase_enterprise/api/routes.clj index 78a9f176be7..b726d143a27 100644 --- a/enterprise/backend/src/metabase_enterprise/api/routes.clj +++ b/enterprise/backend/src/metabase_enterprise/api/routes.clj @@ -14,7 +14,6 @@ [metabase-enterprise.content-verification.api.routes :as content-verification] [metabase-enterprise.sandbox.api.routes :as sandbox] - [metabase-enterprise.serialization.api.routes :as serialization] [metabase.util.i18n :refer [deferred-tru]])) (compojure/defroutes ^{:doc "API routes only available when running Metabase® Enterprise Edition™."} routes @@ -36,7 +35,4 @@ (ee.api.common/+require-premium-feature :advanced-permissions (deferred-tru "Advanced Permissions") advanced-permissions/routes)) (compojure/context "/logs" [] - (ee.api.common/+require-premium-feature :audit-app (deferred-tru "Audit app") logs/routes)) - (compojure/context - "/serialization" [] - (ee.api.common/+require-premium-feature :serialization (deferred-tru "Serialization") serialization/routes)))) + (ee.api.common/+require-premium-feature :audit-app (deferred-tru "Audit app") logs/routes)))) diff --git a/enterprise/backend/src/metabase_enterprise/serialization/api/routes.clj b/enterprise/backend/src/metabase_enterprise/serialization/api/routes.clj deleted file mode 100644 index 5bb4f30c4ef..00000000000 --- a/enterprise/backend/src/metabase_enterprise/serialization/api/routes.clj +++ /dev/null @@ -1,15 +0,0 @@ -(ns metabase-enterprise.serialization.api.routes - "/api/ee/serialization/ routes" - (:require - [compojure.core :as compojure] - [metabase-enterprise.serialization.api.serialize - :as - ee.api.serialization.serialize])) - -;;; all these routes require the `:serialization` premium feature; this is done -;;; in [[metabase-enterprise.api.routes/routes]] -(compojure/defroutes ^{:doc "Routes for serialization endpoints."} routes - (compojure/context - "/serialize" - [] - ee.api.serialization.serialize/routes)) diff --git a/enterprise/backend/src/metabase_enterprise/serialization/api/serialize.clj b/enterprise/backend/src/metabase_enterprise/serialization/api/serialize.clj deleted file mode 100644 index b7ca5477acc..00000000000 --- a/enterprise/backend/src/metabase_enterprise/serialization/api/serialize.clj +++ /dev/null @@ -1,46 +0,0 @@ -(ns metabase-enterprise.serialization.api.serialize - "/api/ee/serialization/serialize endpoints" - (:require - [clojure.set :as set] - [compojure.core :as compojure :refer [POST]] - [metabase-enterprise.serialization.cmd :as serialization.cmd] - [metabase.api.common :as api] - [metabase.models.collection :refer [Collection]] - [metabase.util.i18n :refer [deferred-tru tru]] - [metabase.util.malli :as mu] - [metabase.util.malli.schema :as ms] - [toucan2.core :as t2])) - -(api/defendpoint POST "/data-model" - "This endpoint should serialize: the data model, settings.yaml, and all the selected Collections - - The data model should only change if the user triggers a manual sync or scan (since the scheduler is turned off) - - The user will need to add somewhere (probably in the admin panel): - - - A path (maybe we can assume it will always dump to the same path as the Metabase jar, but we probably want to let - them define the path) - - - The collections that they want to serialize (using selective serialization)" - [:as {{:keys [collection_ids path]} :body}] - {collection_ids (mu/with-api-error-message - [:fn (fn [x] (and (seq x) - (= (count x) (count (set x))) - (every? pos? x)))] - (deferred-tru "Non-empty, distinct array of Collection IDs")) - path (mu/with-api-error-message - ms/NonBlankString - (deferred-tru "Valid directory to serialize results to"))} - ;; Make sure all the specified collection IDs exist. - (let [existing-collection-ids (t2/select-pks-set Collection :id [:in (set collection_ids)])] - (when-not (= (set collection_ids) (set existing-collection-ids)) - (throw (ex-info (tru "Invalid Collection ID(s). These Collections do not exist: {0}" - (pr-str (set/difference (set collection_ids) (set existing-collection-ids)))) - {:status-code 404})))) - (serialization.cmd/v2-dump! path {:collections collection_ids}) - ;; TODO -- not 100% sure this response makes sense. We can change it later with something more meaningful maybe - {:status :ok}) - -(api/define-routes - ;; for now let's say you have to be an admin to hit any of the serialization endpoints - api/+check-superuser) diff --git a/enterprise/backend/test/metabase_enterprise/serialization/api/serialize_test.clj b/enterprise/backend/test/metabase_enterprise/serialization/api/serialize_test.clj deleted file mode 100644 index bf6f95ff531..00000000000 --- a/enterprise/backend/test/metabase_enterprise/serialization/api/serialize_test.clj +++ /dev/null @@ -1,108 +0,0 @@ -(ns metabase-enterprise.serialization.api.serialize-test - (:require - [clojure.string :as str] - [clojure.test :refer :all] - [metabase.models :refer [Card Collection Dashboard DashboardCard]] - [metabase.public-settings.premium-features-test - :as premium-features-test] - [metabase.test :as mt] - [metabase.util.files :as u.files] - [toucan2.core :as t2])) - -(set! *warn-on-reflection* true) - -(defn- do-serialize-data-model [f] - (premium-features-test/with-premium-features #{:serialization} - (mt/with-temp [Collection {collection-id :id - collection-eid :entity_id - collection-slug :slug} {} - Dashboard {dashboard-id :id} {:collection_id collection-id} - Card {card-id :id} {:collection_id collection-id} - DashboardCard _ {:card_id card-id :dashboard_id dashboard-id}] - (testing "Sanity Check" - (is (integer? collection-id)) - (is (= collection-id - (t2/select-one-fn :collection_id Card :id card-id)))) - (mt/with-temp-dir [dir "serdes-dir"] - (f {:collection-id collection-id - :collection-filename (if collection-slug - (str collection-eid "_" collection-slug) - collection-eid) - :dir dir}))))) - -(deftest serialize-data-model-happy-path-test - (do-serialize-data-model - (fn [{:keys [collection-id collection-filename dir]}] - (is (= {:status "ok"} - (mt/user-http-request :crowberto :post 200 "ee/serialization/serialize/data-model" - {:collection_ids [collection-id] - :path dir}))) - (testing "Created files" - (letfn [(path-files [path] - (sort (map str (u.files/files-seq path)))) - (files [& path-components] - (path-files (apply u.files/get-path dir path-components)))] - (is (= (map - #(.toString (u.files/get-path (System/getProperty "java.io.tmpdir") "serdes-dir" %)) - ["collections" "databases" "settings.yaml"]) - (files))) - (testing "subdirs" - (testing "cards" - (is (= 1 - (count (files "collections" collection-filename "cards"))))) - (testing "collections" - (is (= 1 - (->> (files "collections") - (remove #(str/ends-with? % "metabase_analytics")) - count)))) - (testing "dashboards" - (is (= 1 - (count (files "collections" collection-filename "dashboards"))))))))))) - -(deftest serialize-data-model-validation-test - (do-serialize-data-model - (fn [{:keys [collection-id dir]}] - (let [good-request {:collection_ids [collection-id] - :path dir} - serialize! (fn [& {:keys [expected-status-code - request - user] - :or {expected-status-code 400 - request good-request - user :crowberto}}] - (mt/user-http-request user :post expected-status-code "ee/serialization/serialize/data-model" - request))] - (testing "Require a EE token with the `:serialization` feature" - (premium-features-test/with-premium-features #{} - (is (= "Serialization is a paid feature not currently available to your instance. Please upgrade to use it. Learn more at metabase.com/upgrade/" - (serialize! :expected-status-code 402))))) - (testing "Require current user to be a superuser" - (is (= "You don't have permissions to do that." - (serialize! :user :rasta, :expected-status-code 403)))) - (testing "Require valid collection_ids" - (testing "Non-empty" - (is (=? {:errors {:collection_ids "Non-empty, distinct array of Collection IDs"}} - (serialize! :request (dissoc good-request :collection_ids)))) - (is (=? {:errors {:collection_ids "Non-empty, distinct array of Collection IDs"}} - (serialize! :request (assoc good-request :collection_ids nil)))) - (is (=? {:errors {:collection_ids "Non-empty, distinct array of Collection IDs"}} - (serialize! :request (assoc good-request :collection_ids []))))) - (testing "No duplicates" - (is (=? {:errors {:collection_ids "Non-empty, distinct array of Collection IDs"}} - (serialize! :request (assoc good-request :collection_ids [collection-id collection-id]))))) - (testing "All Collections must exist" - (is (= (format "Invalid Collection ID(s). These Collections do not exist: #{%d}" Integer/MAX_VALUE) - (serialize! :request (assoc good-request :collection_ids [collection-id Integer/MAX_VALUE]) - :expected-status-code 404)))) - (testing "Invalid value" - (is (=? {:errors {:collection_ids "Non-empty, distinct array of Collection IDs"}} - (serialize! :request (assoc good-request :collection_ids collection-id)))) - (is (=? {:errors {:collection_ids "Non-empty, distinct array of Collection IDs"}} - (serialize! :request (assoc good-request :collection_ids "My Collection")))))) - (testing "Validate 'path' parameter" - (is (=? {:errors {:path "Valid directory to serialize results to"}} - (serialize! :request (dissoc good-request :path)))) - (is (=? {:errors {:path "Valid directory to serialize results to"}} - (serialize! :request (assoc good-request :path "")))) - (is (=? {:errors {:path "Valid directory to serialize results to"}} - (serialize! :request (assoc good-request :path 1000))))))))) -- GitLab