From a9c21ef92954d42881f4db939a34bda54fc9f57c Mon Sep 17 00:00:00 2001 From: Yeuoly Date: Tue, 8 Oct 2024 22:38:33 +0800 Subject: [PATCH] feat: uninstall plugins --- api/controllers/console/workspace/plugin.py | 19 +++++++++++++++++++ api/core/plugin/entities/plugin.py | 6 +++--- api/core/plugin/manager/plugin.py | 6 +++--- api/services/plugin/plugin_service.py | 5 +++++ 4 files changed, 30 insertions(+), 6 deletions(-) diff --git a/api/controllers/console/workspace/plugin.py b/api/controllers/console/workspace/plugin.py index fcc42c9894..8d7523e46f 100644 --- a/api/controllers/console/workspace/plugin.py +++ b/api/controllers/console/workspace/plugin.py @@ -115,9 +115,28 @@ class PluginInstallFromPkgApi(Resource): return Response(generator(), mimetype="text/event-stream") +class PluginUninstallApi(Resource): + @setup_required + @login_required + @account_initialization_required + def post(self): + req = reqparse.RequestParser() + req.add_argument("plugin_installation_id", type=str, required=True, location="json") + args = req.parse_args() + + user = current_user + if not user.is_admin_or_owner: + raise Forbidden() + + tenant_id = user.current_tenant_id + + return {"success": PluginService.uninstall_plugin(tenant_id, args["plugin_installation_id"])} + + api.add_resource(PluginDebuggingKeyApi, "/workspaces/current/plugin/debugging-key") api.add_resource(PluginListApi, "/workspaces/current/plugin/list") api.add_resource(PluginIconApi, "/workspaces/current/plugin/icon") api.add_resource(PluginInstallCheckUniqueIdentifierApi, "/workspaces/current/plugin/install/check_unique_identifier") api.add_resource(PluginInstallFromUniqueIdentifierApi, "/workspaces/current/plugin/install/from_unique_identifier") api.add_resource(PluginInstallFromPkgApi, "/workspaces/current/plugin/install/from_pkg") +api.add_resource(PluginUninstallApi, "/workspaces/current/plugin/uninstall") diff --git a/api/core/plugin/entities/plugin.py b/api/core/plugin/entities/plugin.py index 7ad7750036..6d8468732f 100644 --- a/api/core/plugin/entities/plugin.py +++ b/api/core/plugin/entities/plugin.py @@ -47,9 +47,9 @@ class PluginResourceRequirements(BaseModel): class PluginDeclaration(BaseModel): class Plugins(BaseModel): - tools: list[str] = Field(default_factory=list) - models: list[str] = Field(default_factory=list) - endpoints: list[str] = Field(default_factory=list) + tools: Optional[list[str]] = Field(default_factory=list) + models: Optional[list[str]] = Field(default_factory=list) + endpoints: Optional[list[str]] = Field(default_factory=list) version: str = Field(..., pattern=r"^\d{1,4}(\.\d{1,4}){1,3}(-\w{1,16})?$") author: Optional[str] = Field(..., pattern=r"^[a-zA-Z0-9_-]{1,64}$") diff --git a/api/core/plugin/manager/plugin.py b/api/core/plugin/manager/plugin.py index fa8e5a464b..1fc4bc0a2c 100644 --- a/api/core/plugin/manager/plugin.py +++ b/api/core/plugin/manager/plugin.py @@ -53,16 +53,16 @@ class PluginInstallationManager(BasePluginManager): headers={"Content-Type": "application/json"}, ) - def uninstall(self, tenant_id: str, identifier: str) -> bool: + def uninstall(self, tenant_id: str, plugin_installation_id: str) -> bool: """ Uninstall a plugin. """ return self._request_with_plugin_daemon_response( - "DELETE", + "POST", f"plugin/{tenant_id}/management/uninstall", bool, data={ - "plugin_unique_identifier": identifier, + "plugin_installation_id": plugin_installation_id, }, headers={"Content-Type": "application/json"}, ) diff --git a/api/services/plugin/plugin_service.py b/api/services/plugin/plugin_service.py index b8d70be106..25c62d18e4 100644 --- a/api/services/plugin/plugin_service.py +++ b/api/services/plugin/plugin_service.py @@ -43,3 +43,8 @@ class PluginService: yield from manager.install_from_pkg(tenant_id, pkg) except PluginDaemonInnerError as e: yield InstallPluginMessage(event=InstallPluginMessage.Event.Error, data=str(e.message)) + + @staticmethod + def uninstall_plugin(tenant_id: str, plugin_installation_id: str) -> bool: + manager = PluginInstallationManager() + return manager.uninstall(tenant_id, plugin_installation_id)