From 6a85f7f0a80df50b3c91a3c8fe799f9ef6b0593b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8F=B2=E9=B8=BF=E5=AE=87?= Date: Mon, 24 Feb 2025 23:10:11 +0800 Subject: [PATCH 1/2] =?UTF-8?q?fix:=20ServiceLoader=20=E4=BF=9D=E5=AD=98?= =?UTF-8?q?=E5=89=8D=E5=88=9B=E5=BB=BA=E6=96=87=E4=BB=B6=E5=A4=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 史鸿宇 --- apps/scheduler/pool/loader/metadata.py | 2 +- apps/scheduler/pool/loader/openapi.py | 30 ++++++++++++++++++++------ apps/scheduler/pool/loader/service.py | 8 ++++--- 3 files changed, 29 insertions(+), 11 deletions(-) diff --git a/apps/scheduler/pool/loader/metadata.py b/apps/scheduler/pool/loader/metadata.py index 3942059da..fa60c416e 100644 --- a/apps/scheduler/pool/loader/metadata.py +++ b/apps/scheduler/pool/loader/metadata.py @@ -2,7 +2,7 @@ Copyright (c) Huawei Technologies Co., Ltd. 2023-2024. All rights reserved. """ -import json + from typing import Any, Optional, Union import yaml diff --git a/apps/scheduler/pool/loader/openapi.py b/apps/scheduler/pool/loader/openapi.py index 17a6f3b1f..b1016a6cf 100644 --- a/apps/scheduler/pool/loader/openapi.py +++ b/apps/scheduler/pool/loader/openapi.py @@ -2,8 +2,10 @@ Copyright (c) Huawei Technologies Co., Ltd. 2023-2024. All rights reserved. """ + import uuid from typing import Any + import ray import yaml from anyio import Path @@ -52,8 +54,10 @@ class OpenAPILoader: return schema async def _get_api_data( - self, spec: ReducedOpenAPIEndpoint, service_metadata: ServiceMetadata) -> tuple[ - APINodeInput, APINodeOutput, dict[str, Any]]: + self, + spec: ReducedOpenAPIEndpoint, + service_metadata: ServiceMetadata, + ) -> tuple[APINodeInput, APINodeOutput, dict[str, Any]]: """从OpenAPI文档中获取API数据""" try: method = HTTPMethod[spec.method.upper()] @@ -80,8 +84,12 @@ class OpenAPILoader: try: inp = APINodeInput( - param_schema=await self.parameters_to_spec(spec.spec["parameters"]) if "parameters" in spec.spec else None, - body_schema=spec.spec["requestBody"]["content"][content_type]["schema"] if "requestBody" in spec.spec else None, + param_schema=await self.parameters_to_spec(spec.spec["parameters"]) + if "parameters" in spec.spec + else None, + body_schema=spec.spec["requestBody"]["content"][content_type]["schema"] + if "requestBody" in spec.spec + else None, ) except KeyError: err = f"接口{spec.name}请求体定义错误" @@ -104,8 +112,13 @@ class OpenAPILoader: return inp, out, known_params - async def _process_spec(self, service_id: str, yaml_filename: str, spec: ReducedOpenAPISpec, - service_metadata: ServiceMetadata) -> list[APINode]: + async def _process_spec( + self, + service_id: str, + yaml_filename: str, + spec: ReducedOpenAPISpec, + service_metadata: ServiceMetadata, + ) -> list[APINode]: """将OpenAPI文档拆解为Node""" nodes = [] for api_endpoint in spec.endpoints: @@ -121,7 +134,10 @@ class OpenAPILoader: ) # 合并参数 - node.override_input, node.override_output, node.known_params = await self._get_api_data(api_endpoint, service_metadata) + node.override_input, node.override_output, node.known_params = await self._get_api_data( + api_endpoint, + service_metadata, + ) nodes.append(node) return nodes diff --git a/apps/scheduler/pool/loader/service.py b/apps/scheduler/pool/loader/service.py index f27c50b2e..4bc4b5941 100644 --- a/apps/scheduler/pool/loader/service.py +++ b/apps/scheduler/pool/loader/service.py @@ -2,6 +2,7 @@ Copyright (c) Huawei Technologies Co., Ltd. 2023-2024. All rights reserved. """ + import asyncio import pathlib @@ -49,11 +50,13 @@ class ServiceLoader: nodes = [NodePool(**node.model_dump(exclude_none=True, by_alias=True)) for node in nodes] await self._update_db(nodes, metadata) - async def save(self, service_id: str, metadata: ServiceMetadata, data: dict) -> None: """在文件系统上保存Service,并更新数据库""" service_path = pathlib.Path(config["SEMANTICS_DIR"]) / "service" / service_id - openapi_path = service_path / "openapi"/"api.yaml" + # 创建文件夹 + service_path.mkdir(parents=True, exist_ok=True) + (service_path / "openapi").mkdir(parents=True, exist_ok=True) + openapi_path = service_path / "openapi" / "api.yaml" # 保存元数据 await MetadataLoader().save_one(MetadataType.SERVICE, metadata, service_id) # 保存 OpenAPI 文档 @@ -64,7 +67,6 @@ class ServiceLoader: hashes = FileChecker().check_one(service_path) await self.load(service_id, hashes) - async def delete(self, service_id: str) -> None: """删除Service,并更新数据库""" service_collection = MongoDB.get_collection("service") -- Gitee From dcc8353d59c7139d604908fe9d8bfe7d277ed32a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8F=B2=E9=B8=BF=E5=AE=87?= Date: Mon, 24 Feb 2025 23:13:41 +0800 Subject: [PATCH 2/2] =?UTF-8?q?fix:=20=E5=88=A4=E6=96=AD=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E5=A4=B9=E6=98=AF=E5=90=A6=E5=AD=98=E5=9C=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 史鸿宇 --- apps/scheduler/pool/loader/app.py | 3 ++- apps/scheduler/pool/loader/service.py | 6 ++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/apps/scheduler/pool/loader/app.py b/apps/scheduler/pool/loader/app.py index e84ae89b6..623de9e48 100644 --- a/apps/scheduler/pool/loader/app.py +++ b/apps/scheduler/pool/loader/app.py @@ -66,7 +66,8 @@ class AppLoader: """ # 创建文件夹 app_path = Path(config["SEMANTICS_DIR"]) / APP_DIR / app_id - await app_path.mkdir(parents=True, exist_ok=True) + if not app_path.exists(): + await app_path.mkdir(parents=True, exist_ok=True) # 保存元数据 await MetadataLoader().save_one(MetadataType.APP, metadata, app_id) # 保存工作流 diff --git a/apps/scheduler/pool/loader/service.py b/apps/scheduler/pool/loader/service.py index 4bc4b5941..5e5f61329 100644 --- a/apps/scheduler/pool/loader/service.py +++ b/apps/scheduler/pool/loader/service.py @@ -54,8 +54,10 @@ class ServiceLoader: """在文件系统上保存Service,并更新数据库""" service_path = pathlib.Path(config["SEMANTICS_DIR"]) / "service" / service_id # 创建文件夹 - service_path.mkdir(parents=True, exist_ok=True) - (service_path / "openapi").mkdir(parents=True, exist_ok=True) + if not service_path.exists(): + service_path.mkdir(parents=True, exist_ok=True) + if not (service_path / "openapi").exists(): + (service_path / "openapi").mkdir(parents=True, exist_ok=True) openapi_path = service_path / "openapi" / "api.yaml" # 保存元数据 await MetadataLoader().save_one(MetadataType.SERVICE, metadata, service_id) -- Gitee