This is an automated email from the ASF dual-hosted git repository.
Aias00 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shenyu.git
The following commit(s) were added to refs/heads/master by this push:
new 392db947fb fix: default namespace for Swagger MCP imports (#6714)
(#7025)
392db947fb is described below
commit 392db947fbfdad606864951510c29bd23356230c
Author: Southern <[email protected]>
AuthorDate: Wed Sep 2 13:15:46 2026 +0800
fix: default namespace for Swagger MCP imports (#6714) (#7025)
- In the `importMcpConfig` method of `SwaggerImportServiceImpl`, use
`Constants.SYS_DEFAULT_NAMESPACE_ID` for an empty namespace.
- Ensure that the MCP tool DTOs and metadata DTOs use the same namespace.
- Add unit tests for missing namespaces.
Co-authored-by: zhengpeng <[email protected]>
Co-authored-by: aias00 <[email protected]>
---
.../service/impl/SwaggerImportServiceImpl.java | 6 ++++-
.../service/impl/SwaggerImportServiceImplTest.java | 31 ++++++++++++++++++++++
2 files changed, 36 insertions(+), 1 deletion(-)
diff --git
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/SwaggerImportServiceImpl.java
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/SwaggerImportServiceImpl.java
index 62846158ed..81e31f0b39 100644
---
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/SwaggerImportServiceImpl.java
+++
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/SwaggerImportServiceImpl.java
@@ -26,6 +26,7 @@ import io.swagger.v3.oas.models.Paths;
import io.swagger.v3.oas.models.parameters.Parameter;
import io.swagger.v3.parser.OpenAPIV3Parser;
import okhttp3.Response;
+import org.apache.commons.lang3.StringUtils;
import org.apache.shenyu.admin.model.bean.UpstreamInstance;
import org.apache.shenyu.admin.model.dto.SwaggerImportRequest;
@@ -59,6 +60,8 @@ import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;
+import static
org.apache.shenyu.common.constant.Constants.SYS_DEFAULT_NAMESPACE_ID;
+
/**
* Implementation of the {@link
org.apache.shenyu.admin.service.SwaggerImportService}.
*/
@@ -126,7 +129,8 @@ public class SwaggerImportServiceImpl implements
SwaggerImportService {
String swaggerJson = fetchSwaggerDoc(request.getSwaggerUrl());
- List<McpToolsRegisterDTO> mcpToolsRegisterDTOList =
buildMcpToolRegisterDTO(swaggerJson, request.getNamespaceId());
+ String namespaceId =
StringUtils.defaultIfEmpty(request.getNamespaceId(), SYS_DEFAULT_NAMESPACE_ID);
+ List<McpToolsRegisterDTO> mcpToolsRegisterDTOList =
buildMcpToolRegisterDTO(swaggerJson, namespaceId);
mcpToolsRegisterDTOList.forEach(mcpToolsRegisterDTO -> {
shenyuClientRegisterMcpService.registerMcpTools(mcpToolsRegisterDTO);
diff --git
a/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/impl/SwaggerImportServiceImplTest.java
b/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/impl/SwaggerImportServiceImplTest.java
index 231c01aa8a..cb48e6f2b4 100644
---
a/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/impl/SwaggerImportServiceImplTest.java
+++
b/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/impl/SwaggerImportServiceImplTest.java
@@ -28,9 +28,15 @@ import org.apache.shenyu.admin.model.bean.DocInfo;
import org.apache.shenyu.admin.model.bean.UpstreamInstance;
import org.apache.shenyu.admin.model.dto.SwaggerImportRequest;
import org.apache.shenyu.admin.service.manager.DocManager;
+import
org.apache.shenyu.admin.service.register.ShenyuClientRegisterMcpServiceImpl;
import org.apache.shenyu.admin.utils.HttpUtils;
+import org.apache.shenyu.register.common.dto.McpToolsRegisterDTO;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mock;
+import org.mockito.junit.jupiter.MockitoExtension;
import org.springframework.test.util.ReflectionTestUtils;
import java.io.IOException;
@@ -41,18 +47,25 @@ import java.util.Collections;
import java.util.Map;
import java.util.function.Consumer;
+import static
org.apache.shenyu.common.constant.Constants.SYS_DEFAULT_NAMESPACE_ID;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.mockito.Mockito.verify;
/**
* Test for {@link SwaggerImportServiceImpl}.
*/
+@ExtendWith(MockitoExtension.class)
public class SwaggerImportServiceImplTest {
private static final String SWAGGER_URL = "https://8.8.8.8/swagger.json";
private static final String SWAGGER_JSON =
"{\"swagger\":\"2.0\",\"info\":{\"title\":\"test\",\"version\":\"1.0\"},\"paths\":{}}";
+ private static final String MCP_SWAGGER_JSON =
"{\"openapi\":\"3.0.0\",\"info\":{\"title\":\"test\",\"version\":\"1.0\"},"
+ +
"\"servers\":[{\"url\":\"http://localhost:8080\"}],\"paths\":{\"/pets\":{\"get\":{"
+ +
"\"operationId\":\"listPets\",\"parameters\":[],\"responses\":{\"200\":{\"description\":\"ok\"}}}}}}";
+
private static final MediaType JSON_UTF_8 =
MediaType.parse("application/json; charset=utf-8");
private static final long DEFAULT_MAX_SWAGGER_BODY_SIZE = 10L * 1024 *
1024;
@@ -63,12 +76,16 @@ public class SwaggerImportServiceImplTest {
private SwaggerImportServiceImpl service;
+ @Mock
+ private ShenyuClientRegisterMcpServiceImpl mcpService;
+
@BeforeEach
public void setUp() {
docManager = new RecordingDocManager();
httpUtils = new StubHttpUtils();
service = new SwaggerImportServiceImpl(docManager, httpUtils);
ReflectionTestUtils.setField(service, "maxSwaggerBodySize",
DEFAULT_MAX_SWAGGER_BODY_SIZE);
+ ReflectionTestUtils.setField(service,
"shenyuClientRegisterMcpService", mcpService);
}
@Test
@@ -98,6 +115,20 @@ public class SwaggerImportServiceImplTest {
assertThrows(IllegalArgumentException.class, () ->
service.importSwagger(request()));
}
+ @Test
+ public void importMcpConfigShouldDefaultMissingNamespaceId() throws
IOException {
+ httpUtils.setResponse(response(responseBody(MCP_SWAGGER_JSON,
+ MCP_SWAGGER_JSON.getBytes(StandardCharsets.UTF_8).length,
JSON_UTF_8)));
+
+ service.importMcpConfig(request());
+
+ ArgumentCaptor<McpToolsRegisterDTO> captor =
ArgumentCaptor.forClass(McpToolsRegisterDTO.class);
+ verify(mcpService).registerMcpTools(captor.capture());
+ assertEquals(SYS_DEFAULT_NAMESPACE_ID,
captor.getValue().getNamespaceId());
+ assertEquals(SYS_DEFAULT_NAMESPACE_ID,
+ captor.getValue().getMetaDataRegisterDTO().getNamespaceId());
+ }
+
private SwaggerImportRequest request() {
SwaggerImportRequest request = new SwaggerImportRequest();
request.setSwaggerUrl(SWAGGER_URL);