You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@devlake.apache.org by kl...@apache.org on 2023/10/17 03:45:37 UTC

[incubator-devlake] branch main updated: feat(zentao): check db url when testing connections (#6258)

This is an automated email from the ASF dual-hosted git repository.

klesh pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/incubator-devlake.git


The following commit(s) were added to refs/heads/main by this push:
     new ee1b60e32 feat(zentao): check db url when testing connections (#6258)
ee1b60e32 is described below

commit ee1b60e32b6dc333c1ee42e782f954dab20b3aeb
Author: Lynwee <li...@merico.dev>
AuthorDate: Tue Oct 17 11:45:33 2023 +0800

    feat(zentao): check db url when testing connections (#6258)
    
    * feat(zentao): check db url when testing connections
    
    * fix(zentao): remove test codes
    
    * fix(zentao): remove test codes
---
 backend/core/runner/db.go                          | 35 ++++++++++++++++------
 config-ui/src/api/connection/index.ts              |  2 +-
 config-ui/src/api/connection/types.ts              |  2 ++
 .../plugins/components/connection-form/index.tsx   |  1 +
 config-ui/src/store/connections/context.tsx        |  3 ++
 config-ui/src/store/connections/types.ts           |  1 +
 6 files changed, 34 insertions(+), 10 deletions(-)

diff --git a/backend/core/runner/db.go b/backend/core/runner/db.go
index 72febf504..af0a3386c 100644
--- a/backend/core/runner/db.go
+++ b/backend/core/runner/db.go
@@ -160,15 +160,32 @@ func getDbConnection(dbUrl string, conf *gorm.Config) (*gorm.DB, error) {
 }
 
 func CheckDbConnection(dbUrl string, d time.Duration) errors.Error {
-	db, err := getDbConnection(dbUrl, &gorm.Config{})
-	if err != nil {
-		return errors.Convert(err)
-	}
 	ctx := context.Background()
-	if d > 0 {
-		var cancel context.CancelFunc
-		ctx, cancel = context.WithTimeout(context.Background(), d)
-		defer cancel()
+
+	result := make(chan errors.Error, 1)
+	done := make(chan struct{}, 1)
+	go func() {
+		db, err := getDbConnection(dbUrl, &gorm.Config{})
+		if err != nil {
+			result <- errors.Convert(err)
+		}
+		if d > 0 {
+			var cancel context.CancelFunc
+			ctx, cancel = context.WithTimeout(context.Background(), d)
+			defer cancel()
+		}
+		if err := db.WithContext(ctx).Exec("SELECT 1").Error; err != nil {
+			done <- struct{}{}
+		} else {
+			result <- errors.Convert(err)
+		}
+	}()
+	select {
+	case <-time.After(d):
+		return errors.Default.New("timeout")
+	case <-done:
+		return nil
+	case err := <-result:
+		return err
 	}
-	return errors.Convert(db.WithContext(ctx).Exec("SELECT 1").Error)
 }
diff --git a/config-ui/src/api/connection/index.ts b/config-ui/src/api/connection/index.ts
index 138ea6b2e..c142d2879 100644
--- a/config-ui/src/api/connection/index.ts
+++ b/config-ui/src/api/connection/index.ts
@@ -41,6 +41,6 @@ export const test = (
   plugin: string,
   payload: Pick<
     T.ConnectionForm,
-    'endpoint' | 'authMethod' | 'username' | 'password' | 'token' | 'appId' | 'secretKey' | 'proxy'
+    'endpoint' | 'authMethod' | 'username' | 'password' | 'token' | 'appId' | 'secretKey' | 'proxy' | 'dbUrl'
   >,
 ): Promise<T.ConnectionTest> => request(`/plugins/${plugin}/test`, { method: 'post', data: payload });
diff --git a/config-ui/src/api/connection/types.ts b/config-ui/src/api/connection/types.ts
index 933133e2d..a61f954a7 100644
--- a/config-ui/src/api/connection/types.ts
+++ b/config-ui/src/api/connection/types.ts
@@ -26,6 +26,7 @@ export type Connection = {
   password?: string;
   proxy: string;
   apiKey?: string;
+  dbUrl?: string;
 };
 
 export type ConnectionForm = {
@@ -40,6 +41,7 @@ export type ConnectionForm = {
   enableGraphql?: boolean;
   proxy: string;
   rateLimitPerHour?: number;
+  dbUrl?: string;
 };
 
 export type ConnectionTest = {
diff --git a/config-ui/src/plugins/components/connection-form/index.tsx b/config-ui/src/plugins/components/connection-form/index.tsx
index e64dd6ba4..4ef0a9573 100644
--- a/config-ui/src/plugins/components/connection-form/index.tsx
+++ b/config-ui/src/plugins/components/connection-form/index.tsx
@@ -73,6 +73,7 @@ export const ConnectionForm = ({ plugin, connectionId, onSuccess }: Props) => {
             'secretKey',
             'tenantId',
             'tenantType',
+            "dbUrl",
           ]),
         ),
       {
diff --git a/config-ui/src/store/connections/context.tsx b/config-ui/src/store/connections/context.tsx
index a41b238bc..42e213dea 100644
--- a/config-ui/src/store/connections/context.tsx
+++ b/config-ui/src/store/connections/context.tsx
@@ -72,6 +72,7 @@ export const ConnectionContextProvider = ({ children, ...props }: Props) => {
     authMethod,
     secretKey,
     appId,
+    dbUrl,
   }: ConnectionItemType) => {
     try {
       const res = await API.connection.test(plugin, {
@@ -83,6 +84,7 @@ export const ConnectionContextProvider = ({ children, ...props }: Props) => {
         authMethod,
         secretKey,
         appId,
+        dbUrl,
       });
       return res.success ? ConnectionStatusEnum.ONLINE : ConnectionStatusEnum.OFFLINE;
     } catch {
@@ -109,6 +111,7 @@ export const ConnectionContextProvider = ({ children, ...props }: Props) => {
       authMethod: it.authMethod,
       secretKey: it.secretKey,
       appId: it.appId,
+      dbUrl: it.dbUrl,
     }));
   };
 
diff --git a/config-ui/src/store/connections/types.ts b/config-ui/src/store/connections/types.ts
index 68847166f..07475889a 100644
--- a/config-ui/src/store/connections/types.ts
+++ b/config-ui/src/store/connections/types.ts
@@ -41,4 +41,5 @@ export type ConnectionItemType = {
   authMethod?: string;
   appId?: string;
   secretKey?: string;
+  dbUrl?: string;
 };