This is an automated email from the ASF dual-hosted git repository. benjobs pushed a commit to branch docker_check in repository https://gitbox.apache.org/repos/asf/incubator-streampark.git
commit 9d5214e21ba146a081ddc3bdeb08637a90296297 Author: benjobs <[email protected]> AuthorDate: Fri Mar 1 16:01:16 2024 +0800 [Feat] docker check support --- .../streampark-console-service/pom.xml | 22 +++++++++++ .../core/service/impl/SettingServiceImpl.java | 45 ++++++++++++++++++++-- .../console/core/service/SettingServiceTest.java | 15 ++++++++ .../src/views/setting/System/SettingForm.vue | 2 +- 4 files changed, 80 insertions(+), 4 deletions(-) diff --git a/streampark-console/streampark-console-service/pom.xml b/streampark-console/streampark-console-service/pom.xml index b53096058..7022c2c24 100644 --- a/streampark-console/streampark-console-service/pom.xml +++ b/streampark-console/streampark-console-service/pom.xml @@ -41,6 +41,8 @@ <MaxPermGen>512m</MaxPermGen> <CodeCacheSize>512m</CodeCacheSize> + <docker.client.version>3.2.13</docker.client.version> + <knife4j-openapi3.version>4.0.0</knife4j-openapi3.version> <springdoc-openapi-ui.version>1.6.9</springdoc-openapi-ui.version> <commons-compress.version>1.21</commons-compress.version> @@ -153,6 +155,26 @@ </exclusions> </dependency> + + <!-- docker client--> + <dependency> + <groupId>com.github.docker-java</groupId> + <artifactId>docker-java-core</artifactId> + <version>${docker.client.version}</version> + <exclusions> + <exclusion> + <artifactId>guava</artifactId> + <groupId>com.google.guava</groupId> + </exclusion> + </exclusions> + </dependency> + + <dependency> + <groupId>com.github.docker-java</groupId> + <artifactId>docker-java-transport-httpclient5</artifactId> + <version>${docker.client.version}</version> + </dependency> + <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-undertow</artifactId> diff --git a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/service/impl/SettingServiceImpl.java b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/service/impl/SettingServiceImpl.java index f7da3fa7a..0386db4b1 100644 --- a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/service/impl/SettingServiceImpl.java +++ b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/service/impl/SettingServiceImpl.java @@ -29,6 +29,14 @@ import org.apache.commons.lang3.StringUtils; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.github.dockerjava.api.DockerClient; +import com.github.dockerjava.api.model.AuthConfig; +import com.github.dockerjava.api.model.AuthResponse; +import com.github.dockerjava.core.DefaultDockerClientConfig; +import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.core.DockerClientImpl; +import com.github.dockerjava.httpclient5.ApacheDockerHttpClient; +import com.github.dockerjava.transport.DockerHttpClient; import lombok.extern.slf4j.Slf4j; import org.springframework.context.ApplicationListener; import org.springframework.context.event.ContextRefreshedEvent; @@ -145,10 +153,41 @@ public class SettingServiceImpl extends ServiceImpl<SettingMapper, Setting> @Override public ResponseResult checkDocker(DockerConfig dockerConfig) { - // TODO check + DockerClientConfig config = + DefaultDockerClientConfig.createDefaultConfigBuilder() + .withRegistryUrl(dockerConfig.getAddress()) + .build(); + + DockerHttpClient httpClient = + new ApacheDockerHttpClient.Builder().dockerHost(config.getDockerHost()).build(); + ResponseResult result = new ResponseResult(); - result.setStatus(200); - result.setMsg("success"); + + try (DockerClient dockerClient = DockerClientImpl.getInstance(config, httpClient)) { + AuthConfig authConfig = + new AuthConfig() + .withUsername(dockerConfig.getUserName()) + .withPassword(dockerConfig.getPassword()) + .withRegistryAddress(dockerConfig.getAddress()); + AuthResponse response = dockerClient.authCmd().withAuthConfig(authConfig).exec(); + if (response.getStatus().equals("Login Succeeded")) { + result.setStatus(200); + } else { + result.setStatus(500); + result.setMsg("docker login failed, status: " + response.getStatus()); + } + } catch (Exception e) { + if (e.getMessage().contains("LastErrorException")) { + result.setStatus(400); + } else if (e.getMessage().contains("Status 401")) { + result.setStatus(500); + result.setMsg( + "Failed to validate Docker registry, unauthorized: incorrect username or password "); + } else { + result.setStatus(500); + result.setMsg("Failed to validate Docker registry, error: " + e.getMessage()); + } + } return result; } diff --git a/streampark-console/streampark-console-service/src/test/java/org/apache/streampark/console/core/service/SettingServiceTest.java b/streampark-console/streampark-console-service/src/test/java/org/apache/streampark/console/core/service/SettingServiceTest.java index 40ab59621..8d119a42c 100644 --- a/streampark-console/streampark-console-service/src/test/java/org/apache/streampark/console/core/service/SettingServiceTest.java +++ b/streampark-console/streampark-console-service/src/test/java/org/apache/streampark/console/core/service/SettingServiceTest.java @@ -98,4 +98,19 @@ class SettingServiceTest extends SpringTestBase { ResponseResult result = settingService.checkEmail(senderEmail); Assertions.assertEquals(result.getStatus(), 200); } + + @Test + void checkDockerTest() { + String username = "******"; + String password = "******"; + + DockerConfig dockerConfig = new DockerConfig(); + dockerConfig.setAddress("registry.cn-hangzhou.aliyuncs.com"); + dockerConfig.setUserName(username); + dockerConfig.setPassword(password); + dockerConfig.setNamespace("streampark"); + + ResponseResult result = settingService.checkDocker(dockerConfig); + Assertions.assertEquals(result.getStatus(), 200); + } } diff --git a/streampark-console/streampark-console-webapp/src/views/setting/System/SettingForm.vue b/streampark-console/streampark-console-webapp/src/views/setting/System/SettingForm.vue index 0175f72b1..86d3bd3e8 100644 --- a/streampark-console/streampark-console-webapp/src/views/setting/System/SettingForm.vue +++ b/streampark-console/streampark-console-webapp/src/views/setting/System/SettingForm.vue @@ -95,7 +95,7 @@ const formData = await validate(); if (type.value === 'docker') { const resp = await fetchVerifyDocker(formData); - if (resp.status === 200) { + if (resp.status === 200 || resp.status === 400) { await fetchDockerUpdate(formData); } else { Swal.fire({
