diff --git a/backend/services/api-test/pom.xml b/backend/services/api-test/pom.xml
index 6cf54012b7..6cbc840c19 100644
--- a/backend/services/api-test/pom.xml
+++ b/backend/services/api-test/pom.xml
@@ -36,11 +36,6 @@
test-jar
test
-
- io.metersphere
- monitoring-engine
- ${monitoring-engine.revision}
-
io.metersphere
metersphere-project-management
@@ -94,13 +89,6 @@
-
-
-
- io.fabric8
- kubernetes-client
- ${kubernetes-client.version}
-
diff --git a/backend/services/system-setting/pom.xml b/backend/services/system-setting/pom.xml
index ff6cf7357d..37c7409b3f 100644
--- a/backend/services/system-setting/pom.xml
+++ b/backend/services/system-setting/pom.xml
@@ -166,6 +166,17 @@
springdoc-openapi-starter-webmvc-ui
${springdoc-openapi-ui.version}
+
+
+ io.fabric8
+ kubernetes-client
+ ${kubernetes-client.version}
+
+
+ io.metersphere
+ monitoring-engine
+ ${monitoring-engine.revision}
+
diff --git a/backend/services/api-test/src/main/java/io/metersphere/api/engine/KubernetesExecEngine.java b/backend/services/system-setting/src/main/java/io/metersphere/system/engine/KubernetesExecEngine.java
similarity index 84%
rename from backend/services/api-test/src/main/java/io/metersphere/api/engine/KubernetesExecEngine.java
rename to backend/services/system-setting/src/main/java/io/metersphere/system/engine/KubernetesExecEngine.java
index b403fe8c0d..07fc14401c 100644
--- a/backend/services/api-test/src/main/java/io/metersphere/api/engine/KubernetesExecEngine.java
+++ b/backend/services/system-setting/src/main/java/io/metersphere/system/engine/KubernetesExecEngine.java
@@ -1,4 +1,4 @@
-package io.metersphere.api.engine;
+package io.metersphere.system.engine;
import io.metersphere.engine.ApiEngine;
import io.metersphere.sdk.dto.api.task.TaskBatchRequestDTO;
@@ -14,8 +14,6 @@ import java.util.Arrays;
import java.util.List;
import java.util.Optional;
-import static io.metersphere.api.controller.result.ApiResultCode.RESOURCE_POOL_EXECUTE_ERROR;
-
public class KubernetesExecEngine implements ApiEngine {
/**
* 任务请求参数 @LINK TaskRequestDTO or TaskBatchRequestDTO or List
@@ -26,7 +24,7 @@ public class KubernetesExecEngine implements ApiEngine {
/**
* 单调执行构造函数
*
- * @param request 任务请求参数
+ * @param request 任务请求参数
* @param resource 资源池
*/
public KubernetesExecEngine(TaskRequestDTO request, TestResourceDTO resource) {
@@ -38,7 +36,7 @@ public class KubernetesExecEngine implements ApiEngine {
* 批量执行构造函数
*
* @param batchRequestDTO 批量任务请求参数
- * @param resource 资源池
+ * @param resource 资源池
*/
public KubernetesExecEngine(TaskBatchRequestDTO batchRequestDTO, TestResourceDTO resource) {
this.resource = resource;
@@ -49,7 +47,7 @@ public class KubernetesExecEngine implements ApiEngine {
* 停止执行构造函数
*
* @param reportIds 任务ID列表
- * @param resource 资源池
+ * @param resource 资源池
*/
public KubernetesExecEngine(List reportIds, TestResourceDTO resource) {
this.resource = resource;
@@ -79,19 +77,19 @@ public class KubernetesExecEngine implements ApiEngine {
// 获取错误代码并处理
int errorCode = Optional.ofNullable(e.getResponseBodyAs(ResultHolder.class))
.map(ResultHolder::getCode)
- .orElseThrow(() -> new MSException(RESOURCE_POOL_EXECUTE_ERROR, "Unknown error code"));
+ .orElseThrow(() -> new MSException("Unknown error code"));
// 匹配资源池的错误代码并抛出相应异常
TaskRunnerResultCode resultCode = Arrays.stream(TaskRunnerResultCode.values())
.filter(code -> code.getCode() == errorCode)
.findFirst()
- .orElseThrow(() -> new MSException(RESOURCE_POOL_EXECUTE_ERROR, e.getMessage()));
+ .orElseThrow(() -> new MSException(e.getMessage()));
throw new MSException(resultCode, e.getMessage());
}
private void handleGeneralError(Exception e) {
LogUtils.error("K8S 执行异常:", e);
- throw new MSException(RESOURCE_POOL_EXECUTE_ERROR, e.getMessage());
+ throw new MSException(e.getMessage());
}
}
diff --git a/backend/services/api-test/src/main/java/io/metersphere/api/engine/KubernetesProvider.java b/backend/services/system-setting/src/main/java/io/metersphere/system/engine/KubernetesProvider.java
similarity index 89%
rename from backend/services/api-test/src/main/java/io/metersphere/api/engine/KubernetesProvider.java
rename to backend/services/system-setting/src/main/java/io/metersphere/system/engine/KubernetesProvider.java
index a57110a123..55320693a1 100644
--- a/backend/services/api-test/src/main/java/io/metersphere/api/engine/KubernetesProvider.java
+++ b/backend/services/system-setting/src/main/java/io/metersphere/system/engine/KubernetesProvider.java
@@ -1,4 +1,4 @@
-package io.metersphere.api.engine;
+package io.metersphere.system.engine;
import io.fabric8.kubernetes.api.model.Pod;
import io.fabric8.kubernetes.client.ConfigBuilder;
@@ -219,4 +219,25 @@ public class KubernetesProvider {
return result;
}
+
+ public static boolean validateNamespaceExists(TestResourceDTO testResourceDTO) {
+ LogUtils.info("Test resource config: {}", testResourceDTO);
+ try (KubernetesClient kubernetesClient = getKubernetesClient(testResourceDTO)) {
+ // 校验 KubernetesClient 是否为空,避免后续调用产生 NullPointerException
+ if (kubernetesClient == null) {
+ throw new IllegalArgumentException("Kubernetes client initialization failed. Please check your configuration.");
+ }
+
+ // 直接获取 pods 并进行非空判断
+ List pods = getPods(kubernetesClient, testResourceDTO);
+ if (org.apache.commons.collections.CollectionUtils.isEmpty(pods)) {
+ throw new RuntimeException("No execution pods found for the given resource: " + testResourceDTO.getNamespace());
+ }
+ } catch (Exception e) {
+ LogUtils.error("Failed to validate namespace exists", e);
+ return false;
+ }
+ return true;
+ }
+
}
diff --git a/backend/services/system-setting/src/main/java/io/metersphere/system/service/TestResourcePoolService.java b/backend/services/system-setting/src/main/java/io/metersphere/system/service/TestResourcePoolService.java
index 424f4c415a..9b45e56dc4 100644
--- a/backend/services/system-setting/src/main/java/io/metersphere/system/service/TestResourcePoolService.java
+++ b/backend/services/system-setting/src/main/java/io/metersphere/system/service/TestResourcePoolService.java
@@ -11,6 +11,7 @@ import io.metersphere.system.domain.*;
import io.metersphere.system.dto.pool.*;
import io.metersphere.system.dto.sdk.OptionDTO;
import io.metersphere.system.dto.sdk.QueryResourcePoolRequest;
+import io.metersphere.system.engine.KubernetesProvider;
import io.metersphere.system.log.constants.OperationLogModule;
import io.metersphere.system.log.constants.OperationLogType;
import io.metersphere.system.log.dto.LogDTO;
@@ -95,11 +96,7 @@ public class TestResourcePoolService {
return false;
}
} else {
- KubernetesResourcePoolService resourcePoolService = CommonBeanFactory.getBean(KubernetesResourcePoolService.class);
- if (resourcePoolService == null) {
- return false;
- }
- return resourcePoolService.validate(testResourceDTO);
+ return KubernetesProvider.validateNamespaceExists(testResourceDTO);
}
}