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

dataroaring pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/master by this push:
     new e8da5d2e8de [fix](cloud) Support cloud multi cluster run in docker 
(#37925)
e8da5d2e8de is described below

commit e8da5d2e8de05d6301795c1134218229083f67de
Author: deardeng <565620...@qq.com>
AuthorDate: Wed Jul 17 10:06:52 2024 +0800

    [fix](cloud) Support cloud multi cluster run in docker (#37925)
---
 docker/runtime/doris-compose/command.py            |  2 +
 .../org/apache/doris/regression/suite/Suite.groovy | 14 +++-
 .../doris/regression/suite/SuiteCluster.groovy     | 87 ++++++++++++++++++----
 .../apache/doris/regression/util/DebugPoint.groovy |  3 +
 4 files changed, 90 insertions(+), 16 deletions(-)

diff --git a/docker/runtime/doris-compose/command.py 
b/docker/runtime/doris-compose/command.py
index 87ae862236a..b0863eae153 100644
--- a/docker/runtime/doris-compose/command.py
+++ b/docker/runtime/doris-compose/command.py
@@ -707,6 +707,8 @@ class ListNode(object):
                 http_port = CLUSTER.FE_HTTP_PORT
             elif self.node_type == CLUSTER.Node.TYPE_BE:
                 http_port = CLUSTER.BE_WEBSVR_PORT
+            elif self.node_type == CLUSTER.Node.TYPE_MS or self.node_type == 
CLUSTER.Node.TYPE_RECYCLE:
+                http_port = CLUSTER.MS_PORT
             else:
                 pass
             result += [
diff --git 
a/regression-test/framework/src/main/groovy/org/apache/doris/regression/suite/Suite.groovy
 
b/regression-test/framework/src/main/groovy/org/apache/doris/regression/suite/Suite.groovy
index fec337f59ed..50d430b6c6d 100644
--- 
a/regression-test/framework/src/main/groovy/org/apache/doris/regression/suite/Suite.groovy
+++ 
b/regression-test/framework/src/main/groovy/org/apache/doris/regression/suite/Suite.groovy
@@ -1570,7 +1570,14 @@ class Suite implements GroovyInterceptable {
         json.result.cluster
     }
 
-    def drop_cluster = { cluster_name, cluster_id ->
+    // cloud
+    String getCloudBeTagByName(String clusterName) {
+        def bes = sql_return_maparray "show backends"
+        def be = bes.stream().filter(be -> 
be.Tag.contains(clusterName)).findFirst().orElse(null)
+        return be.Tag
+    }
+
+    def drop_cluster = { cluster_name, cluster_id, MetaService ms=null ->
         def jsonOutput = new JsonOutput()
         def reqBody = [
                      type: "COMPUTE",
@@ -1585,6 +1592,11 @@ class Suite implements GroovyInterceptable {
 
         def drop_cluster_api = { request_body, check_func ->
             httpTest {
+                if (ms) {
+                    endpoint ms.host+':'+ms.httpPort
+                } else {
+                    endpoint context.config.metaServiceHttpAddress
+                }
                 endpoint context.config.metaServiceHttpAddress
                 uri "/MetaService/http/drop_cluster?token=${token}"
                 body request_body
diff --git 
a/regression-test/framework/src/main/groovy/org/apache/doris/regression/suite/SuiteCluster.groovy
 
b/regression-test/framework/src/main/groovy/org/apache/doris/regression/suite/SuiteCluster.groovy
index 49bfbc18792..68a57ad27f3 100644
--- 
a/regression-test/framework/src/main/groovy/org/apache/doris/regression/suite/SuiteCluster.groovy
+++ 
b/regression-test/framework/src/main/groovy/org/apache/doris/regression/suite/SuiteCluster.groovy
@@ -170,6 +170,34 @@ class Backend extends ServerNode {
 
 }
 
+class MetaService extends ServerNode {
+
+    static MetaService fromCompose(ListHeader header, int index, List<Object> 
fields) {
+        MetaService ms = new MetaService()
+        ServerNode.fromCompose(ms, header, index, fields)
+        return ms
+    }
+
+    NodeType getNodeType() {
+        return NodeType.MS
+    }
+
+}
+
+class Recycler extends ServerNode {
+
+    static Recycler fromCompose(ListHeader header, int index, List<Object> 
fields) {
+        Recycler rs = new Recycler()
+        ServerNode.fromCompose(rs, header, index, fields)
+        return rs
+    }
+
+    NodeType getNodeType() {
+        return NodeType.RECYCLER
+    }
+
+}
+
 @Slf4j
 @CompileStatic
 class SuiteCluster {
@@ -287,21 +315,39 @@ class SuiteCluster {
         return getBackends().stream().filter(be -> be.alive || 
!needAlive).collect(Collectors.toList());
     }
 
+    List<MetaService> getAllMetaservices(boolean needAlive = false) {
+        return getMetaservices().stream().filter(ms -> ms.alive || 
!needAlive).collect(Collectors.toList());
+    }
+
+    List<MetaService> getAllRecyclers(boolean needAlive = false) {
+        return getRecyclers().stream().filter(rc -> rc.alive || 
!needAlive).collect(Collectors.toList());
+    }
+
     private List<Frontend> getFrontends() {
-        List<Frontend> frontends = []
-        List<Backend> backends = []
-        getAllNodes(frontends, backends)
-        return frontends
+        def ret = getAllNodes()
+        return ret.getV1()
     }
 
     private List<Backend> getBackends() {
-        List<Frontend> frontends = []
-        List<Backend> backends = []
-        getAllNodes(frontends, backends)
-        return backends
+        def ret = getAllNodes()
+        return ret.getV2()
     }
 
-    private void getAllNodes(List<Frontend> frontends, List<Backend> backends) 
{
+    private List<MetaService> getMetaservices() {
+        def ret = getAllNodes()
+        return ret.getV3()
+    }
+
+    private List<Recycler> getRecyclers() {
+        def ret = getAllNodes()
+        return ret.getV4()
+    }
+
+    private Tuple4<List<Frontend>, List<Backend>, List<MetaService>, 
List<Recycler>> getAllNodes() {
+        List<Frontend> frontends = []
+        List<Backend> backends = []
+        List<MetaService> metaservices = []
+        List<Recycler> recyclers = []
         def cmd = 'ls ' + name + ' --detail'
         def data = runCmd(cmd)
         assert data instanceof List
@@ -316,25 +362,33 @@ class SuiteCluster {
             } else if (name.startsWith('fe-')) {
                 int index = name.substring('fe-'.length()) as int
                 frontends.add(Frontend.fromCompose(header, index, row))
-            } else if (name.startsWith('ms-') || name.startsWith('recycle-') 
|| name.startsWith('fdb-')) {
-            // TODO: handle these nodes
+            } else if (name.startsWith('ms-')){
+                int index = name.substring('ms-'.length()) as int
+                metaservices.add(MetaService.fromCompose(header, index, row))
+            } else if (name.startsWith('recycle-')){
+                int index = name.substring('recycle-'.length()) as int
+                recyclers.add(Recycler.fromCompose(header, index, row))
+            } else if (name.startsWith('fdb-')) {
+                // current not used
             } else {
                 assert false : 'Unknown node type with name: ' + name
             }
         }
+        return new Tuple4(frontends, backends, metaservices, recyclers)
     }
 
     List<Integer> addFrontend(int num) throws Exception {
-        def result = add(num, 0)
+        def result = add(num, 0, null)
         return result.first
     }
 
-    List<Integer> addBackend(int num) throws Exception {
-        def result = add(0, num)
+    List<Integer> addBackend(int num, String ClusterName="") throws Exception {
+        def result = add(0, num, ClusterName)
         return result.second
     }
 
-    Tuple2<List<Integer>, List<Integer>> add(int feNum, int beNum) throws 
Exception {
+    // APPR: clusterName just used for cloud mode, 1 cluster has n bes
+    Tuple2<List<Integer>, List<Integer>> add(int feNum, int beNum, String 
clusterName) throws Exception {
         assert feNum > 0 || beNum > 0
 
         def sb = new StringBuilder()
@@ -344,6 +398,9 @@ class SuiteCluster {
         }
         if (beNum > 0) {
             sb.append('--add-be-num ' + beNum + ' ')
+            if (clusterName != null && !clusterName.isEmpty()) {
+                sb.append(' --be-cluster ' + clusterName + ' ')
+            }
         }
         sb.append('--wait-timeout 60')
 
diff --git 
a/regression-test/framework/src/main/groovy/org/apache/doris/regression/util/DebugPoint.groovy
 
b/regression-test/framework/src/main/groovy/org/apache/doris/regression/util/DebugPoint.groovy
index a28683f0ee9..8c764eb453d 100644
--- 
a/regression-test/framework/src/main/groovy/org/apache/doris/regression/util/DebugPoint.groovy
+++ 
b/regression-test/framework/src/main/groovy/org/apache/doris/regression/util/DebugPoint.groovy
@@ -24,6 +24,9 @@ import org.slf4j.LoggerFactory
 enum NodeType {
     FE,
     BE,
+    // cloud
+    MS,
+    RECYCLER,
 }
 
 class DebugPoint {


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to