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({

Reply via email to