feat(接口测试): 批量执行指令并添加监听事件

This commit is contained in:
fit2-zhao 2024-10-12 12:23:51 +08:00 committed by Craftsman
parent 8a0b9b06e5
commit ade3421a2d
2 changed files with 9 additions and 60 deletions

View File

@ -22,7 +22,6 @@ public class KubernetesExecEngine implements ApiEngine {
*/ */
private final Object request; private final Object request;
private final TestResourceDTO resource; private final TestResourceDTO resource;
private final String scriptId;
/** /**
* 单调执行构造函数 * 单调执行构造函数
@ -30,10 +29,9 @@ public class KubernetesExecEngine implements ApiEngine {
* @param request * @param request
* @param resource * @param resource
*/ */
public KubernetesExecEngine(TaskRequestDTO request, TestResourceDTO resource, String scriptId) { public KubernetesExecEngine(TaskRequestDTO request, TestResourceDTO resource) {
this.request = request; this.request = request;
this.resource = resource; this.resource = resource;
this.scriptId = scriptId;
} }
/** /**
@ -42,10 +40,9 @@ public class KubernetesExecEngine implements ApiEngine {
* @param batchRequestDTO * @param batchRequestDTO
* @param resource * @param resource
*/ */
public KubernetesExecEngine(TaskBatchRequestDTO batchRequestDTO, TestResourceDTO resource, String scriptId) { public KubernetesExecEngine(TaskBatchRequestDTO batchRequestDTO, TestResourceDTO resource) {
this.resource = resource; this.resource = resource;
this.request = batchRequestDTO; this.request = batchRequestDTO;
this.scriptId = scriptId;
} }
/** /**
@ -54,10 +51,9 @@ public class KubernetesExecEngine implements ApiEngine {
* @param reportIds * @param reportIds
* @param resource * @param resource
*/ */
public KubernetesExecEngine(List<String> reportIds, TestResourceDTO resource, String scriptId) { public KubernetesExecEngine(List<String> reportIds, TestResourceDTO resource) {
this.resource = resource; this.resource = resource;
this.request = reportIds; this.request = reportIds;
this.scriptId = scriptId;
} }
@Override @Override
@ -69,7 +65,7 @@ public class KubernetesExecEngine implements ApiEngine {
private void runApi(String command, Object request) { private void runApi(String command, Object request) {
try { try {
KubernetesProvider.exec(resource, request, scriptId, command); KubernetesProvider.exec(resource, request, command);
} catch (HttpServerErrorException e) { } catch (HttpServerErrorException e) {
handleHttpServerError(e); handleHttpServerError(e);
} catch (Exception e) { } catch (Exception e) {

View File

@ -5,7 +5,6 @@ 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.fabric8.kubernetes.client.dsl.ExecWatch;
import io.metersphere.sdk.exception.MSException; import io.metersphere.sdk.exception.MSException;
import io.metersphere.sdk.util.JSON; import io.metersphere.sdk.util.JSON;
import io.metersphere.sdk.util.LogUtils; import io.metersphere.sdk.util.LogUtils;
@ -13,7 +12,6 @@ import io.metersphere.system.dto.pool.TestResourceDTO;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
import java.io.InputStream;
import java.util.List; import java.util.List;
import java.util.concurrent.ThreadLocalRandom; import java.util.concurrent.ThreadLocalRandom;
@ -49,73 +47,28 @@ public class KubernetesProvider {
} }
/** /**
* 同步执行命令 * 执行命令
* *
* @param resource * @param resource
* @param command * @param command
* @throws Exception
*/ */
protected static void exec(TestResourceDTO resource, Object runRequest, String scriptId, String command) throws Exception { protected static void exec(TestResourceDTO resource, Object runRequest, String command) {
// 防止执行非法命令
if (StringUtils.isEmpty(command) || !StringUtils.contains(command, scriptId)) {
throw new MSException("Invalid command: " + command);
}
ExecWatch execWatch = null;
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() + "");
// 创建文件
String parameters = "cat <<EOF > " + scriptId + StringUtils.LF + JSON.toFormatJSONString(runRequest) + StringUtils.LF + "EOF" + StringUtils.LF;
// 删除文件 String commandX = SHELL_COMMAND + StringUtils.LF + command + StringUtils.LF;
String deleteFile = "rm -f " + scriptId + StringUtils.LF;
String commandX = SHELL_COMMAND + StringUtils.LF + parameters + command + StringUtils.LF + deleteFile;
LogUtils.info("执行命令:【 " + commandX + ""); LogUtils.info("执行命令:【 " + commandX + "");
// 同步执行命令 // 同步执行命令
execWatch = client.pods().inNamespace(client.getNamespace()) client.pods().inNamespace(client.getNamespace())
.withName(pod.getMetadata().getName()) .withName(pod.getMetadata().getName())
.redirectingInput()
.writingOutput(System.out)
.writingError(System.err)
.withTTY().exec(commandX);
// 等待命令执行完成获取结果
try (InputStream error = execWatch.getError()) {
// 判断是否有错误输出
if (error != null && error.available() > 0) {
throw new MSException("Kubernetes exec error");
}
}
} finally {
// 确保 ExecWatch 被关闭以释放资源
if (execWatch != null) {
execWatch.close();
}
}
}
/**
* 异步执行命令
*
* @param resource
* @param runRequest
* @param command
*/
public static void execCommand(TestResourceDTO resource, Object runRequest, String command) {
try (KubernetesClient client = getKubernetesClient(resource)) {
Pod pod = getExecPod(client, resource);
LogUtils.info("当前执行 Pod" + pod.getMetadata().getName() + "");
client.pods().inNamespace(client.getNamespace()).withName(pod.getMetadata().getName())
.redirectingInput() .redirectingInput()
.writingOutput(System.out) .writingOutput(System.out)
.writingError(System.err) .writingError(System.err)
.withTTY() .withTTY()
.usingListener(new SimpleListener(runRequest)) .usingListener(new SimpleListener(runRequest))
.exec(SHELL_COMMAND, "-c", command); .exec(commandX);
} catch (Exception e) {
throw new MSException("Error during Kubernetes execution: " + e.getMessage(), e);
} }
} }