diff --git a/Dockerfile b/Dockerfile index 644a0c6..19f885b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,6 +2,8 @@ FROM registry.fit2cloud.com/fit2cloud2/fabric8-java-alpine-openjdk8-jre MAINTAINER FIT2CLOUD +ARG MS_VERSION=dev + RUN mkdir -p /opt/apps ADD target/node-controller-1.0.jar /opt/apps @@ -10,6 +12,8 @@ ENV JAVA_APP_JAR=/opt/apps/node-controller-1.0.jar ENV AB_OFF=true +ENV MS_VERSION=${MS_VERSION} + ENV JAVA_OPTIONS=-Dfile.encoding=utf-8 CMD ["/deployments/run-java.sh"] diff --git a/src/main/java/io/metersphere/controller/request/DockerLoginRequest.java b/src/main/java/io/metersphere/controller/request/DockerLoginRequest.java index fa01205..9767401 100644 --- a/src/main/java/io/metersphere/controller/request/DockerLoginRequest.java +++ b/src/main/java/io/metersphere/controller/request/DockerLoginRequest.java @@ -1,8 +1,10 @@ package io.metersphere.controller.request; -import lombok.Data; +import lombok.Getter; +import lombok.Setter; -@Data +@Getter +@Setter public class DockerLoginRequest { private String username; private String password; diff --git a/src/main/java/io/metersphere/controller/request/TestRequest.java b/src/main/java/io/metersphere/controller/request/TestRequest.java index f790f43..3ec0d3f 100644 --- a/src/main/java/io/metersphere/controller/request/TestRequest.java +++ b/src/main/java/io/metersphere/controller/request/TestRequest.java @@ -1,11 +1,13 @@ package io.metersphere.controller.request; -import lombok.Data; +import lombok.Getter; +import lombok.Setter; import java.util.HashMap; import java.util.Map; -@Data +@Getter +@Setter public class TestRequest extends DockerLoginRequest { private int size; diff --git a/src/main/java/io/metersphere/service/JmeterOperateService.java b/src/main/java/io/metersphere/service/JmeterOperateService.java index 743a623..8238282 100644 --- a/src/main/java/io/metersphere/service/JmeterOperateService.java +++ b/src/main/java/io/metersphere/service/JmeterOperateService.java @@ -17,6 +17,9 @@ import java.io.File; import java.io.IOException; +import java.io.OutputStream; +import java.net.InetSocketAddress; +import java.net.Socket; import java.nio.charset.StandardCharsets; import java.util.*; import java.util.concurrent.TimeUnit; @@ -26,6 +29,9 @@ public class JmeterOperateService { public void startContainer(TestRequest testRequest) throws IOException { + String bootstrapServers = testRequest.getEnv().get("BOOTSTRAP_SERVERS"); + checkKafka(bootstrapServers); + LogUtil.info("Receive start container request, test id: {}", testRequest.getTestId()); DockerClient dockerClient = DockerClientService.connectDocker(testRequest); int size = testRequest.getSize(); @@ -77,7 +83,9 @@ public void onComplete() { try { FileUtils.forceDelete(new File(filePath)); LogUtil.info("Remove dir completed."); - DockerClientService.removeContainer(dockerClient, containerId); + if (DockerClientService.existContainer(dockerClient, containerId) > 0) { + DockerClientService.removeContainer(dockerClient, containerId); + } LogUtil.info("Remove container completed: " + containerId); } catch (IOException e) { LogUtil.error("Remove dir error: ", e); @@ -88,6 +96,30 @@ public void onComplete() { }); } + private void checkKafka(String bootstrapServers) { + String[] servers = StringUtils.split(bootstrapServers, ","); + try { + for (String s : servers) { + String[] ipAndPort = s.split(":"); + //1,建立tcp + String ip = ipAndPort[0]; + int port = Integer.parseInt(ipAndPort[1]); + Socket soc = new Socket(); + soc.connect(new InetSocketAddress(ip, port), 1000); // 1s timeout + //2.输入内容 + String content = "1010"; + byte[] bs = content.getBytes(); + OutputStream os = soc.getOutputStream(); + os.write(bs); + //3.关闭 + soc.close(); + } + } catch (Exception e) { + LogUtil.error(e); + throw new RuntimeException("Failed to connect to Kafka"); + } + } + private String[] getEnvs(TestRequest testRequest) { Map env = testRequest.getEnv(); return env.keySet().stream().map(k -> k + "=" + env.get(k)).toArray(String[]::new); @@ -129,7 +161,7 @@ public void stopContainer(String testId) { .withNameFilter(Collections.singletonList(testId)) .exec(); // container stop - list.forEach(container -> DockerClientService.stopContainer(dockerClient, container.getId())); + list.forEach(container -> DockerClientService.removeContainer(dockerClient, container.getId())); } public List taskStatus(String testId) { diff --git a/src/main/java/io/metersphere/util/DockerClientService.java b/src/main/java/io/metersphere/util/DockerClientService.java index 7222232..79b0449 100644 --- a/src/main/java/io/metersphere/util/DockerClientService.java +++ b/src/main/java/io/metersphere/util/DockerClientService.java @@ -2,6 +2,7 @@ import com.github.dockerjava.api.DockerClient; import com.github.dockerjava.api.command.CreateContainerResponse; +import com.github.dockerjava.api.model.Container; import com.github.dockerjava.api.model.HostConfig; import com.github.dockerjava.api.model.Info; import com.github.dockerjava.core.DefaultDockerClientConfig; @@ -9,6 +10,9 @@ import io.metersphere.controller.request.DockerLoginRequest; import org.apache.commons.lang.StringUtils; +import java.util.Collections; +import java.util.List; + public class DockerClientService { /** @@ -83,7 +87,23 @@ public static void stopContainer(DockerClient client, String containerId) { * @param containerId */ public static void removeContainer(DockerClient client, String containerId) { - client.removeContainerCmd(containerId).exec(); + client.removeContainerCmd(containerId) + .withForce(true) + .withRemoveVolumes(true) + .exec(); + } + + /** + * 容器是否存在 + * @param client + * @param containerId + */ + public static int existContainer(DockerClient client, String containerId) { + List list = client.listContainersCmd() + .withShowAll(true) + .withIdFilter(Collections.singleton(containerId)) + .exec(); + return list.size(); } } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 6c51bae..c45cedf 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,4 +1,4 @@ spring.application.name=node-controller -logging.file.path=/opt/fit2cloud/logs/${spring.application.name} +logging.file.path=/opt/metersphere/logs/${spring.application.name} server.port=8082