diff --git a/api-test/backend/src/main/java/io/metersphere/api/exec/engine/KubernetesApiExec.java b/api-test/backend/src/main/java/io/metersphere/api/exec/engine/KubernetesApiExec.java index 86169110fa..fe65e2d10a 100644 --- a/api-test/backend/src/main/java/io/metersphere/api/exec/engine/KubernetesApiExec.java +++ b/api-test/backend/src/main/java/io/metersphere/api/exec/engine/KubernetesApiExec.java @@ -5,15 +5,17 @@ import io.fabric8.kubernetes.client.KubernetesClient; import io.fabric8.kubernetes.client.dsl.ExecListener; import io.fabric8.kubernetes.client.dsl.ExecWatch; import io.metersphere.commons.exception.MSException; +import io.metersphere.commons.utils.CommonBeanFactory; +import io.metersphere.commons.utils.JSON; +import io.metersphere.dto.JmeterRunRequestDTO; +import io.metersphere.service.RemakeReportService; import io.metersphere.utils.LoggerUtil; import io.metersphere.xpack.resourcepool.engine.provider.ClientCredential; -import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.CollectionUtils; -import java.io.IOException; import java.util.List; import java.util.Random; -import java.util.regex.Matcher; -import java.util.regex.Pattern; import java.util.stream.Collectors; public class KubernetesApiExec { @@ -27,72 +29,49 @@ public class KubernetesApiExec { if (CollectionUtils.isEmpty(nodePods)) { MSException.throwException("Execution node not found"); } - Pod pod = nodePods.get(new Random().nextInt(nodePods.size())); - return pod; + return nodePods.get(new Random().nextInt(nodePods.size())); } - public static ExecWatch newExecWatch(KubernetesClient client, String namespace, String podName, String command) { + public static ExecWatch newExecWatch(KubernetesClient client, String namespace, String podName, String command, JmeterRunRequestDTO runRequest) { LoggerUtil.info("CURL 命令:【 " + command + " 】"); return client.pods().inNamespace(namespace).withName(podName) .readingInput(System.in) .writingOutput(System.out) .writingError(System.err) .withTTY() - .usingListener(new SimpleListener()) + .usingListener(new SimpleListener(runRequest)) .exec("sh", "-c", command); } - private static String getQuery(String content) { - Pattern regex = Pattern.compile("\\{([^}]*)\\}"); - Matcher matcher = regex.matcher(content); - StringBuilder sql = new StringBuilder(); - while (matcher.find()) { - sql.append(matcher.group(1) + ","); - } - if (sql.length() > 0) { - sql.deleteCharAt(sql.length() - 1); - } - return sql.toString(); - } - private static class SimpleListener implements ExecListener { + private JmeterRunRequestDTO runRequest; + + SimpleListener(JmeterRunRequestDTO runRequest) { + this.runRequest = runRequest; + } + @Override public void onOpen() { - LoggerUtil.info("The shell will remain open for 10 seconds."); + LoggerUtil.info("K8s命令执行监听 onOpen ", runRequest.getReportId()); } @Override public void onFailure(Throwable t, Response response) { - // todo k8s 执行api变了 - try { - LoggerUtil.info("进入K8s onFailure"); - LoggerUtil.info(response); - LoggerUtil.info(t); - LoggerUtil.info(t.getMessage()); - LoggerUtil.info(response.body()); - } catch (IOException e) { - throw new RuntimeException(e); + LoggerUtil.info("进入K8s onFailure处理"); + if (runRequest != null) { + LoggerUtil.info("请求参数:", JSON.toJSONString(runRequest)); + RemakeReportService apiScenarioReportService = CommonBeanFactory.getBean(RemakeReportService.class); + apiScenarioReportService.testEnded(runRequest, StringUtils.join("K8s执行异常:", t.getMessage())); + } else { + MSException.throwException("K8S 节点执行错误:" + t.getMessage()); } -// List value = response.request().url().queryParameterValues("command"); -// if (CollectionUtils.isNotEmpty(value) && value.size() > 2 && value.get(2).startsWith("curl")) { -// String query = "{" + KubernetesApiExec.getQuery(value.get(2)) + "}"; -// JmeterRunRequestDTO runRequest = JSON.parseObject(query, JmeterRunRequestDTO.class); -// if (runRequest != null) { -// RemakeReportService apiScenarioReportService = CommonBeanFactory.getBean(RemakeReportService.class); -// apiScenarioReportService.testEnded(runRequest, response.networkResponse().message()); -// } else { -// MSException.throwException("K8S 节点执行错误:" + response.networkResponse().message()); -// } -// } else { -// MSException.throwException("K8S 节点执行错误:" + response.networkResponse().message()); -// } -// LoggerUtil.error("K8S 节点执行错误:" + JSON.toJSONString(value)); -// LoggerUtil.error("K8S 节点执行错误:" + response.networkResponse()); + LoggerUtil.error("K8S 节点执行错误:", t.getMessage()); } @Override public void onClose(int code, String reason) { - LoggerUtil.info("The shell will now close."); + LoggerUtil.info(code + "_" + reason, runRequest.getReportId()); + LoggerUtil.info("K8s命令执行监听 onClose ", runRequest.getReportId()); } } } diff --git a/api-test/backend/src/main/java/io/metersphere/api/exec/engine/KubernetesTestEngine.java b/api-test/backend/src/main/java/io/metersphere/api/exec/engine/KubernetesTestEngine.java index c686f5a1c7..34760930d3 100644 --- a/api-test/backend/src/main/java/io/metersphere/api/exec/engine/KubernetesTestEngine.java +++ b/api-test/backend/src/main/java/io/metersphere/api/exec/engine/KubernetesTestEngine.java @@ -6,11 +6,12 @@ import io.metersphere.api.dto.MsgDTO; import io.metersphere.base.domain.TestResource; import io.metersphere.commons.constants.ApiRunMode; import io.metersphere.commons.constants.ExtendedParameter; -import io.metersphere.commons.exception.MSException; +import io.metersphere.commons.utils.CommonBeanFactory; import io.metersphere.commons.utils.JSON; import io.metersphere.commons.utils.LogUtil; import io.metersphere.commons.utils.WebSocketUtil; import io.metersphere.dto.JmeterRunRequestDTO; +import io.metersphere.service.RemakeReportService; import io.metersphere.utils.LoggerUtil; import io.metersphere.xpack.resourcepool.engine.provider.ClientCredential; import io.metersphere.xpack.resourcepool.engine.provider.KubernetesProvider; @@ -78,7 +79,7 @@ public class KubernetesTestEngine extends AbstractEngine { command.append(StringUtils.SPACE).append("--max-time 120"); // 设置请求超时时间为120S command.append(StringUtils.SPACE).append("--retry 3"); // 设置重试次数3次 command.append(StringUtils.SPACE).append("http://127.0.0.1:8082/jmeter/").append(path); - KubernetesApiExec.newExecWatch(client, clientCredential.getNamespace(), pod.getMetadata().getName(), command.toString()); + KubernetesApiExec.newExecWatch(client, clientCredential.getNamespace(), pod.getMetadata().getName(), command.toString(), runRequest); } catch (Exception e) { MsgDTO dto = new MsgDTO(); dto.setExecEnd(false); @@ -88,13 +89,15 @@ public class KubernetesTestEngine extends AbstractEngine { LoggerUtil.debug("send. " + runRequest.getReportId()); WebSocketUtil.sendMessageSingle(dto); WebSocketUtil.onClose(runRequest.getReportId()); + + RemakeReportService remake = CommonBeanFactory.getBean(RemakeReportService.class); + remake.testEnded(runRequest, StringUtils.join("K8s执行异常:", e.getMessage())); LoggerUtil.error("当前报告:【" + runRequest.getReportId() + "】资源:【" + runRequest.getTestId() + "】CURL失败:", e); - MSException.throwException(e); } } @Override public void stop() { - + LoggerUtil.info("K8S执行STOP:", runRequest.getReportId()); } } diff --git a/api-test/backend/src/main/java/io/metersphere/service/TestDataGenerator.java b/api-test/backend/src/main/java/io/metersphere/service/TestDataGenerator.java index c4f6de99b7..c8ac5ceab5 100644 --- a/api-test/backend/src/main/java/io/metersphere/service/TestDataGenerator.java +++ b/api-test/backend/src/main/java/io/metersphere/service/TestDataGenerator.java @@ -156,32 +156,17 @@ public class TestDataGenerator { value = StringUtils.isNotBlank(v) ? v : value; try { if (object.has(FORMAT)) { - String propertyFormat = object.get(FORMAT).getAsString(); - switch (propertyFormat) { - case "date-time": - value = DateTimeSource.getInstance().randomTimestamp(LocalDate.now()) + ""; - break; - case "date": - value = DateTimeSource.getInstance().randomDate(LocalDate.now().getYear(), "yyyy-MM-dd"); - break; - case "email": - value = InternetSource.getInstance().randomEmail(maxLength); - break; - case "hostname": - value = InternetSource.getInstance().randomDomain(maxLength); - break; - case "ipv4": - value = InternetSource.getInstance().randomPublicIpv4(); - break; - case "ipv6": - value = InternetSource.getInstance().randomIpV6(); - break; - case "uri": - value = InternetSource.getInstance().randomStaticUrl("jpg"); - break; - } - } - if (object.has(PATTERN)) { + value = switch (object.get(FORMAT).getAsString()) { + case "date-time" -> DateTimeSource.getInstance().randomTimestamp(LocalDate.now()) + ""; + case "date" -> DateTimeSource.getInstance().randomDate(LocalDate.now().getYear(), "yyyy-MM-dd"); + case "email" -> InternetSource.getInstance().randomEmail(maxLength); + case "hostname" -> InternetSource.getInstance().randomDomain(maxLength); + case "ipv4" -> InternetSource.getInstance().randomPublicIpv4(); + case "ipv6" -> InternetSource.getInstance().randomIpV6(); + case "uri" -> InternetSource.getInstance().randomStaticUrl("jpg"); + default -> value; + }; + } else if (object.has(PATTERN)) { String pattern = object.get(PATTERN).getAsString(); if (StringUtils.isNotEmpty(pattern)) { Generex generex = new Generex(pattern);