diff --git a/apps/scheduler/pool/loader/openapi.py b/apps/scheduler/pool/loader/openapi.py index 9a90a4eae46294855697a84879aa023777f048f1..17a6f3b1fffd16419097897196ee5b9f75c255dc 100644 --- a/apps/scheduler/pool/loader/openapi.py +++ b/apps/scheduler/pool/loader/openapi.py @@ -4,7 +4,6 @@ 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 @@ -36,7 +35,6 @@ class OpenAPILoader: return reduce_openapi_spec(spec) - async def parameters_to_spec(self, raw_schema: list[dict[str, Any]]) -> dict[str, Any]: """将OpenAPI中GET接口List形式的请求体Spec转换为JSON Schema""" schema = { @@ -53,8 +51,9 @@ class OpenAPILoader: schema["properties"][item["name"]][key] = val return schema - - async def _get_api_data(self, spec: ReducedOpenAPIEndpoint, service_metadata: ServiceMetadata) -> tuple[APINodeInput, APINodeOutput, dict[str, Any]]: + async def _get_api_data( + self, spec: ReducedOpenAPIEndpoint, service_metadata: ServiceMetadata) -> tuple[ + APINodeInput, APINodeOutput, dict[str, Any]]: """从OpenAPI文档中获取API数据""" try: method = HTTPMethod[spec.method.upper()] @@ -105,8 +104,8 @@ 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: @@ -126,7 +125,6 @@ class OpenAPILoader: nodes.append(node) return nodes - async def load_one(self, service_id: str, yaml_path: Path, service_metadata: ServiceMetadata) -> list[APINode]: """加载单个OpenAPI文档,可以直接指定路径""" try: @@ -139,7 +137,16 @@ class OpenAPILoader: yaml_filename = yaml_path.name return await self._process_spec(service_id, yaml_filename, spec, service_metadata) - - async def save_one(self, yaml_dict: dict[str, Any]) -> None: + async def save_one(self, yaml_path: Path, yaml_dict: dict[str, Any]) -> None: """保存单个OpenAPI文档""" - pass + """在文件系统上保存Service,并更新数据库""" + + try: + yaml_data = yaml.safe_dump(yaml_dict) + await yaml_path.write_text(yaml_data) + except Exception as e: + if yaml_path.exists(): + await yaml_path.unlink() + err = f"保存OpenAPI文档{yaml_path}失败:{e}" + LOGGER.error(msg=err) + raise RuntimeError(err) from e diff --git a/apps/scheduler/pool/loader/service.py b/apps/scheduler/pool/loader/service.py index 576ff1410afd22a53983f07a009bb26dab523393..b30766093cb994b751479d1939152cdfcd01588a 100644 --- a/apps/scheduler/pool/loader/service.py +++ b/apps/scheduler/pool/loader/service.py @@ -2,7 +2,6 @@ Copyright (c) Huawei Technologies Co., Ltd. 2023-2024. All rights reserved. """ - import asyncio import pathlib @@ -52,11 +51,12 @@ class ServiceLoader: 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" # 保存元数据 await MetadataLoader().save_one(MetadataType.SERVICE, metadata, service_id) # 保存 OpenAPI 文档 openapi_loader = OpenAPILoader.remote() - await openapi_loader.save_one.remote(data) # type: ignore[arg-type] + await openapi_loader.save_one.remote(openapi_path, data) # type: ignore[arg-type] ray.kill(openapi_loader) # 重新载入 hashes = FileChecker().check_one(service_path)