refactor(接口测试): 添加异常逻辑处理

This commit is contained in:
fit2-zhao 2024-10-12 14:19:55 +08:00 committed by Craftsman
parent ade3421a2d
commit 387e1ef46e
1 changed files with 56 additions and 8 deletions

View File

@ -5,11 +5,21 @@ import io.fabric8.kubernetes.client.ConfigBuilder;
import io.fabric8.kubernetes.client.KubernetesClient; import io.fabric8.kubernetes.client.KubernetesClient;
import io.fabric8.kubernetes.client.KubernetesClientBuilder; import io.fabric8.kubernetes.client.KubernetesClientBuilder;
import io.fabric8.kubernetes.client.dsl.ExecListener; import io.fabric8.kubernetes.client.dsl.ExecListener;
import io.metersphere.sdk.constants.KafkaTopicConstants;
import io.metersphere.sdk.constants.MsgType;
import io.metersphere.sdk.constants.ResultStatus;
import io.metersphere.sdk.dto.SocketMsgDTO;
import io.metersphere.sdk.dto.api.result.ProcessResultDTO;
import io.metersphere.sdk.dto.api.result.TaskResultDTO;
import io.metersphere.sdk.dto.api.task.TaskRequestDTO;
import io.metersphere.sdk.exception.MSException; import io.metersphere.sdk.exception.MSException;
import io.metersphere.sdk.util.CommonBeanFactory;
import io.metersphere.sdk.util.JSON; import io.metersphere.sdk.util.JSON;
import io.metersphere.sdk.util.LogUtils; import io.metersphere.sdk.util.LogUtils;
import io.metersphere.sdk.util.WebSocketUtils;
import io.metersphere.system.dto.pool.TestResourceDTO; import io.metersphere.system.dto.pool.TestResourceDTO;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
import java.util.List; import java.util.List;
@ -18,7 +28,7 @@ import java.util.concurrent.ThreadLocalRandom;
public class KubernetesProvider { public class KubernetesProvider {
private static final String RUNNING_PHASE = "Running"; private static final String RUNNING_PHASE = "Running";
private static final String SHELL_COMMAND = "#!/bin/bash"; private static final String SHELL_COMMAND = "sh";
public static KubernetesClient getKubernetesClient(TestResourceDTO credential) { public static KubernetesClient getKubernetesClient(TestResourceDTO credential) {
ConfigBuilder configBuilder = new ConfigBuilder() ConfigBuilder configBuilder = new ConfigBuilder()
@ -56,10 +66,7 @@ public class KubernetesProvider {
try (KubernetesClient client = getKubernetesClient(resource)) { try (KubernetesClient client = getKubernetesClient(resource)) {
Pod pod = getExecPod(client, resource); Pod pod = getExecPod(client, resource);
LogUtils.info("当前执行 Pod" + pod.getMetadata().getName() + ""); LogUtils.info("当前执行 Pod" + pod.getMetadata().getName() + "");
LogUtils.info("执行命令:【 " + command + "");
String commandX = SHELL_COMMAND + StringUtils.LF + command + StringUtils.LF;
LogUtils.info("执行命令:【 " + commandX + "");
// 同步执行命令 // 同步执行命令
client.pods().inNamespace(client.getNamespace()) client.pods().inNamespace(client.getNamespace())
.withName(pod.getMetadata().getName()) .withName(pod.getMetadata().getName())
@ -68,7 +75,7 @@ public class KubernetesProvider {
.writingError(System.err) .writingError(System.err)
.withTTY() .withTTY()
.usingListener(new SimpleListener(runRequest)) .usingListener(new SimpleListener(runRequest))
.exec(commandX); .exec(SHELL_COMMAND, "-c", command + StringUtils.LF);
} }
} }
@ -83,8 +90,8 @@ public class KubernetesProvider {
LogUtils.error("K8s 监听失败", t); LogUtils.error("K8s 监听失败", t);
if (runRequest != null) { if (runRequest != null) {
LogUtils.info("请求参数:{}", JSON.toJSONString(runRequest)); LogUtils.info("请求参数:{}", JSON.toJSONString(runRequest));
// TODO: Add proper error handling based on response or task request details handleGeneralError(runRequest, t);
return;
} }
throw new MSException("K8S 节点执行错误:" + t.getMessage(), t); throw new MSException("K8S 节点执行错误:" + t.getMessage(), t);
} }
@ -95,4 +102,45 @@ public class KubernetesProvider {
// No additional actions needed for now // No additional actions needed for now
} }
} }
private static void handleGeneralError(Object requestObj, Throwable e) {
// 检查请求对象是否为 TaskRequestDTO 类型
if (requestObj instanceof TaskRequestDTO request) {
// 发送结果到 WebSocket如果报告 ID 存在
String reportId = request.getTaskItem().getReportId();
if (WebSocketUtils.has(reportId)) {
SocketMsgDTO socketMsgDTO = new SocketMsgDTO(
reportId,
request.getTaskInfo().getRunMode(),
MsgType.EXEC_END.name(),
e.getMessage()
);
WebSocketUtils.sendMessageSingle(socketMsgDTO);
}
// 尝试获取 KafkaTemplate 并发送任务结果
KafkaTemplate<String, String> kafkaTemplate = CommonBeanFactory.getBean(KafkaTemplate.class);
if (kafkaTemplate != null) {
TaskResultDTO result = buildTaskResult(request, e);
kafkaTemplate.send(KafkaTopicConstants.API_REPORT_TOPIC, JSON.toJSONString(result));
}
}
}
private static TaskResultDTO buildTaskResult(TaskRequestDTO request, Throwable e) {
// 创建并配置 TaskResultDTO
TaskResultDTO result = new TaskResultDTO();
result.setRequest(request);
result.setRequestResults(List.of()); // 空的请求结果列表
result.setHasEnded(true); // 标记任务已结束
// 创建并配置 ProcessResultDTO
ProcessResultDTO processResultDTO = new ProcessResultDTO();
processResultDTO.setStatus(ResultStatus.ERROR.name());
result.setProcessResultDTO(processResultDTO);
result.setConsole(e.getMessage()); // 将异常信息记录到控制台日志
return result;
}
} }