diff --git a/project.clj b/project.clj index 348c2247..257e6fdf 100644 --- a/project.clj +++ b/project.clj @@ -48,7 +48,7 @@ [org.cyverse/cyverse-groups-client "0.1.10"] [org.cyverse/common-cfg "2.8.4"] [org.cyverse/common-cli "2.8.3"] - [org.cyverse/common-swagger-api "3.4.23"] + [org.cyverse/common-swagger-api "3.4.25"] [metosin/ring-swagger-ui "5.32.11"] [org.cyverse/kameleon "3.0.11" :exclusions [com.impossibl.pgjdbc-ng/pgjdbc-ng]] diff --git a/src/terrain/clients/apps/raw.clj b/src/terrain/clients/apps/raw.clj index fcd26052..ae85a8a1 100644 --- a/src/terrain/clients/apps/raw.clj +++ b/src/terrain/clients/apps/raw.clj @@ -1172,6 +1172,14 @@ {:query-params (secured-params) :as :json})))) +(defn list-resource-presets + [] + (:body + (client/get (apps-url "resource-presets") + (disable-redirects + {:query-params (secured-params) + :as :json})))) + (defn create-private-tool [body] (:body @@ -1482,3 +1490,55 @@ {:form-params body :content-type :json :as :json})))) + +(defn admin-list-resource-presets + [] + (:body + (client/get (apps-url "admin" "resource-presets") + (disable-redirects + {:query-params (secured-params) + :as :json})))) + +(defn admin-create-resource-preset + [body] + (:body + (client/post (apps-url "admin" "resource-presets") + (disable-redirects + {:query-params (secured-params) + :form-params body + :content-type :json + :as :json})))) + +(defn admin-get-resource-preset + [preset-id] + (:body + (client/get (apps-url "admin" "resource-presets" preset-id) + (disable-redirects + {:query-params (secured-params) + :as :json})))) + +(defn admin-update-resource-preset + [preset-id body] + (:body + (client/patch (apps-url "admin" "resource-presets" preset-id) + (disable-redirects + {:query-params (secured-params) + :form-params body + :content-type :json + :as :json})))) + +(defn admin-delete-resource-preset + [preset-id] + (:body + (client/delete (apps-url "admin" "resource-presets" preset-id) + (disable-redirects + {:query-params (secured-params) + :as :json})))) + +(defn admin-set-default-resource-preset + [preset-id] + (:body + (client/put (apps-url "admin" "resource-presets" preset-id "default") + (disable-redirects + {:query-params (secured-params) + :as :json})))) diff --git a/src/terrain/routes.clj b/src/terrain/routes.clj index e57e26a2..cb839142 100644 --- a/src/terrain/routes.clj +++ b/src/terrain/routes.clj @@ -20,6 +20,8 @@ [terrain.routes.analyses :refer [analysis-routes quicklaunch-routes]] [terrain.routes.apps.admin.apps :refer [admin-apps-routes]] [terrain.routes.apps.admin.reference-genomes :refer [admin-reference-genomes-routes]] + [terrain.routes.apps.admin.resource-presets :refer [admin-resource-preset-routes + resource-preset-routes]] [terrain.routes.apps.admin.tools :refer [admin-tool-request-routes admin-tool-routes]] [terrain.routes.apps.categories :refer [app-category-routes @@ -148,6 +150,7 @@ (subject-routes) (reference-genomes-routes) (gpu-models-routes) + (resource-preset-routes) (tool-routes) (tool-request-routes) (permanent-id-request-routes) @@ -204,6 +207,7 @@ (admin-instant-launch-routes) (admin-ontology-routes) (admin-reference-genomes-routes) + (admin-resource-preset-routes) (admin-tool-routes) (admin-tool-request-routes) (admin-permanent-id-request-routes) @@ -317,6 +321,7 @@ {:name "admin-permanent-id-requests", :description "Admin Permanent ID Request Endpoints"} {:name "admin-qms", :description "Admin Quota Management Service Endpoints"} {:name "admin-reference-genomes", :description "Admin Reference Genome Endpoints"} + {:name "admin-resource-presets", :description "Admin Resource Preset Endpoints"} {:name "admin-request-types", :description "Admin Request Type Endpoints"} {:name "admin-requests", :description "Admin Request Endpoints"} {:name "admin-resource-usage", :description "Resource Usage Administration Endpoints"} @@ -362,6 +367,7 @@ {:name "teams", :description "Team Endpoints"} {:name "tools", :description "Tool Endpoints"} {:name "gpu-models", :description "GPU Model Configuration Endpoints"} + {:name "resource-presets", :description "Resource Preset Endpoints"} {:name "tool-requests", :description "Tool Request Endpoints"} {:name "token", :description "OAuth Tokens"} {:name "user-info", :description "User Information Endpoints"} diff --git a/src/terrain/routes/apps/admin/resource_presets.clj b/src/terrain/routes/apps/admin/resource_presets.clj new file mode 100644 index 00000000..7897607c --- /dev/null +++ b/src/terrain/routes/apps/admin/resource_presets.clj @@ -0,0 +1,76 @@ +(ns terrain.routes.apps.admin.resource-presets + (:require [common-swagger-api.schema :refer [context describe DELETE GET PATCH POST PUT]] + [common-swagger-api.schema.apps :refer [ResourcePreset ResourcePresetList + ResourcePresetRequest ResourcePresetUpdateRequest]] + [ring.util.http-response :refer [ok]] + [terrain.clients.apps.raw :as apps] + [terrain.util :refer [optional-routes]] + [terrain.util.config :as config]) + (:import [java.util UUID])) + +;; Declarations to avoid lint warnings for query and path parameter bindings. +(declare body preset-id) + +(defn admin-resource-preset-routes + [] + (optional-routes + [#(and (config/admin-routes-enabled) + (config/app-routes-enabled))] + + (context "/resource-presets" [] + :tags ["admin-resource-presets"] + + (GET "/" [] + :return ResourcePresetList + :summary "List Resource Presets" + :description "Lists all resource presets, including disabled ones." + (ok (apps/admin-list-resource-presets))) + + (POST "/" [] + :body [body ResourcePresetRequest] + :return ResourcePreset + :summary "Create a Resource Preset" + :description "Creates a new resource preset." + (ok (apps/admin-create-resource-preset body))) + + (context "/:preset-id" [] + :path-params [preset-id :- (describe UUID "The Resource Preset's UUID")] + + (GET "/" [] + :return ResourcePreset + :summary "Get a Resource Preset" + :description "Gets a resource preset by its identifier." + (ok (apps/admin-get-resource-preset preset-id))) + + (PATCH "/" [] + :body [body ResourcePresetUpdateRequest] + :return ResourcePreset + :summary "Update a Resource Preset" + :description "Updates an existing resource preset." + (ok (apps/admin-update-resource-preset preset-id body))) + + (DELETE "/" [] + :summary "Delete a Resource Preset" + :description "Permanently deletes a resource preset." + (ok (apps/admin-delete-resource-preset preset-id))) + + (PUT "/default" [] + :return ResourcePreset + :summary "Set Default Resource Preset" + :description "Sets this preset as the global default." + (ok (apps/admin-set-default-resource-preset preset-id))))))) + +(defn resource-preset-routes + "Non-admin route for listing enabled resource presets." + [] + (optional-routes + [config/app-routes-enabled] + + (context "/resource-presets" [] + :tags ["resource-presets"] + + (GET "/" [] + :return ResourcePresetList + :summary "List Resource Presets" + :description "Lists enabled resource presets available for analysis launch." + (ok (apps/list-resource-presets))))))