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

wuzhiguo pushed a commit to branch branch-1.0
in repository https://gitbox.apache.org/repos/asf/bigtop-manager.git

commit b3ca1078fbd87a802bcc1916e1b9b19ad1ddf4be
Author: Zhiguo Wu <[email protected]>
AuthorDate: Sun Apr 20 23:29:03 2025 +0800

    BIGTOP-4414: Move tool info to database (#214)
---
 .../grpc/service/SetupJdkServiceGrpcImpl.java      | 51 +++-------------------
 .../org/apache/bigtop/manager/dao/po/RepoPO.java   |  3 --
 .../manager/dao/po/{RepoPO.java => ToolPO.java}    | 17 +++++---
 .../bigtop/manager/dao/repository/ToolDao.java     | 15 ++-----
 .../bigtop/manager/grpc/pojo/ClusterInfo.java      |  4 ++
 .../apache/bigtop/manager/grpc/pojo/RepoInfo.java  |  2 -
 .../grpc/pojo/{ClusterInfo.java => ToolInfo.java}  | 10 +++--
 .../server/command/helper/JobCacheHelper.java      | 19 +++++++-
 .../bigtop/manager/server/model/dto/RepoDTO.java   |  2 -
 .../server/service/impl/HostServiceImpl.java       |  4 +-
 .../src/main/resources/ddl/MySQL-DDL-CREATE.sql    | 34 +++++++++++----
 .../main/resources/ddl/PostgreSQL-DDL-CREATE.sql   | 36 ++++++++++-----
 .../stacks/bigtop/3.3.0/services/flink/order.json  |  2 +-
 .../bigtop/v3_3_0/hive/HiveMetastoreScript.java    | 10 +++--
 .../stack/bigtop/v3_3_0/tez/TezClientScript.java   |  4 +-
 .../manager/stack/core/spi/param/BaseParams.java   |  3 +-
 ...{TarballDownloader.java => FileDownloader.java} | 12 ++++-
 .../manager/stack/core/utils/LocalSettings.java    | 25 ++++++++---
 .../manager/stack/core/utils/TarballUtils.java     |  4 +-
 .../stack/core/spi/param/BaseParamsTest.java       |  6 +--
 .../stack/core/utils/LocalSettingsTest.java        |  8 ++--
 docs/en/cluster.md                                 |  4 +-
 docs/zh/cluster.md                                 |  4 +-
 23 files changed, 155 insertions(+), 124 deletions(-)

diff --git 
a/bigtop-manager-agent/src/main/java/org/apache/bigtop/manager/agent/grpc/service/SetupJdkServiceGrpcImpl.java
 
b/bigtop-manager-agent/src/main/java/org/apache/bigtop/manager/agent/grpc/service/SetupJdkServiceGrpcImpl.java
index bdb0d048..4a999454 100644
--- 
a/bigtop-manager-agent/src/main/java/org/apache/bigtop/manager/agent/grpc/service/SetupJdkServiceGrpcImpl.java
+++ 
b/bigtop-manager-agent/src/main/java/org/apache/bigtop/manager/agent/grpc/service/SetupJdkServiceGrpcImpl.java
@@ -21,13 +21,12 @@ package org.apache.bigtop.manager.agent.grpc.service;
 import org.apache.bigtop.manager.common.constants.Constants;
 import org.apache.bigtop.manager.common.constants.MessageConstants;
 import org.apache.bigtop.manager.common.utils.Environments;
-import org.apache.bigtop.manager.common.utils.os.OSDetection;
 import org.apache.bigtop.manager.grpc.generated.SetupJdkReply;
 import org.apache.bigtop.manager.grpc.generated.SetupJdkRequest;
 import org.apache.bigtop.manager.grpc.generated.SetupJdkServiceGrpc;
 import org.apache.bigtop.manager.grpc.pojo.ClusterInfo;
 import org.apache.bigtop.manager.grpc.pojo.PackageInfo;
-import org.apache.bigtop.manager.grpc.pojo.RepoInfo;
+import org.apache.bigtop.manager.grpc.pojo.ToolInfo;
 import org.apache.bigtop.manager.stack.core.utils.LocalSettings;
 import org.apache.bigtop.manager.stack.core.utils.TarballUtils;
 import org.apache.bigtop.manager.stack.core.utils.linux.LinuxFileUtils;
@@ -36,8 +35,6 @@ import io.grpc.stub.StreamObserver;
 import lombok.extern.slf4j.Slf4j;
 import net.devh.boot.grpc.server.service.GrpcService;
 
-import java.text.MessageFormat;
-
 @Slf4j
 @GrpcService
 public class SetupJdkServiceGrpcImpl extends 
SetupJdkServiceGrpc.SetupJdkServiceImplBase {
@@ -55,26 +52,18 @@ public class SetupJdkServiceGrpcImpl extends 
SetupJdkServiceGrpc.SetupJdkService
             }
 
             log.info("Setting up cluster jdk...");
-            String arch = OSDetection.getArch();
-            String pkgName = getPkgName(arch);
-            String checksum = getChecksum(arch);
-
-            PackageInfo packageInfo = new PackageInfo();
-            packageInfo.setName(pkgName);
-            packageInfo.setChecksum(checksum);
-
             ClusterInfo clusterInfo = LocalSettings.cluster();
-            RepoInfo repoInfo = LocalSettings.repos().stream()
-                    .filter(r -> arch.equals(r.getArch()) && r.getType() == 2)
-                    .findFirst()
-                    .orElseThrow(() -> new RuntimeException(
-                            "Cannot find repo for os: [" + OSDetection.getOS() 
+ "] and arch: [" + arch + "]"));
             String toolsHome = clusterInfo.getRootDir() + "/tools";
             String user = System.getProperty("user.name");
             LinuxFileUtils.createDirectories(toolsHome, user, user, 
Constants.PERMISSION_755, true);
 
             String jdkHome = toolsHome + "/jdk";
-            TarballUtils.installPackage(repoInfo.getBaseUrl(), toolsHome, 
jdkHome, packageInfo, 1);
+            ToolInfo tool = LocalSettings.getTool("jdk8");
+            PackageInfo packageInfo = new PackageInfo();
+            packageInfo.setUrl(tool.getBaseUrl());
+            packageInfo.setName(tool.getPkgName());
+            packageInfo.setChecksum(tool.getChecksum());
+            TarballUtils.installPackage(null, toolsHome, jdkHome, packageInfo, 
1);
             LinuxFileUtils.createDirectories(jdkHome, user, user, 
Constants.PERMISSION_755, true);
 
             SetupJdkReply reply = SetupJdkReply.newBuilder()
@@ -87,30 +76,4 @@ public class SetupJdkServiceGrpcImpl extends 
SetupJdkServiceGrpc.SetupJdkService
             responseObserver.onError(e);
         }
     }
-
-    private String getPkgName(String arch) {
-        String replacedArch =
-                switch (arch) {
-                    case "x86_64" -> "x64";
-                    case "arm64", "aarch64" -> "aarch64";
-                    default -> {
-                        log.error("Unsupported architecture: {}", arch);
-                        throw new IllegalArgumentException("Unsupported 
architecture: " + arch);
-                    }
-                };
-        String pkgName = MessageFormat.format("jdk-8u431-linux-{0}.tar.gz", 
replacedArch);
-        log.debug("Generated package name: {}", pkgName);
-        return pkgName;
-    }
-
-    private String getChecksum(String arch) {
-        return switch (arch) {
-            case "x64", "x86_64" -> 
"SHA-256:b396978a716b7d23ccccabfe5c47c3b75d2434d7f8f7af690bc648172382720d";
-            case "arm64", "aarch64" -> 
"SHA-256:e68d3e31ffcf7f05a4de65d04974843073bdff238bb6524adb272de9e616be7c";
-            default -> {
-                log.error("Unknown arch for jdk: {}", arch);
-                throw new IllegalArgumentException("Unknown arch for jdk: " + 
arch);
-            }
-        };
-    }
 }
diff --git 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/RepoPO.java 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/RepoPO.java
index a4e0ec8f..bd64fc49 100644
--- 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/RepoPO.java
+++ 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/RepoPO.java
@@ -43,7 +43,4 @@ public class RepoPO extends BasePO implements Serializable {
 
     @Column(name = "base_url")
     private String baseUrl;
-
-    @Column(name = "type")
-    private Integer type;
 }
diff --git 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/RepoPO.java 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/ToolPO.java
similarity index 86%
copy from 
bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/RepoPO.java
copy to 
bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/ToolPO.java
index a4e0ec8f..b7e16ca9 100644
--- 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/RepoPO.java
+++ 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/ToolPO.java
@@ -28,8 +28,8 @@ import java.io.Serializable;
 
 @Data
 @EqualsAndHashCode(callSuper = true)
-@Table(name = "repo")
-public class RepoPO extends BasePO implements Serializable {
+@Table(name = "tool")
+public class ToolPO extends BasePO implements Serializable {
 
     @Id
     @Column(name = "id")
@@ -38,12 +38,15 @@ public class RepoPO extends BasePO implements Serializable {
     @Column(name = "name")
     private String name;
 
-    @Column(name = "arch")
-    private String arch;
-
     @Column(name = "base_url")
     private String baseUrl;
 
-    @Column(name = "type")
-    private Integer type;
+    @Column(name = "pkg_name")
+    private String pkgName;
+
+    @Column(name = "arch")
+    private String arch;
+
+    @Column(name = "checksum")
+    private String checksum;
 }
diff --git 
a/bigtop-manager-grpc/src/main/java/org/apache/bigtop/manager/grpc/pojo/ClusterInfo.java
 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/repository/ToolDao.java
similarity index 76%
copy from 
bigtop-manager-grpc/src/main/java/org/apache/bigtop/manager/grpc/pojo/ClusterInfo.java
copy to 
bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/repository/ToolDao.java
index 957e0c86..3306e41c 100644
--- 
a/bigtop-manager-grpc/src/main/java/org/apache/bigtop/manager/grpc/pojo/ClusterInfo.java
+++ 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/repository/ToolDao.java
@@ -7,7 +7,7 @@
  * "License"); you may not use this file except in compliance
  * with the License.  You may obtain a copy of the License at
  *
- *    https://www.apache.org/licenses/LICENSE-2.0
+ *   http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing,
  * software distributed under the License is distributed on an
@@ -16,16 +16,9 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.bigtop.manager.grpc.pojo;
 
-import lombok.Data;
+package org.apache.bigtop.manager.dao.repository;
 
-@Data
-public class ClusterInfo {
+import org.apache.bigtop.manager.dao.po.ToolPO;
 
-    private String name;
-
-    private String userGroup;
-
-    private String rootDir;
-}
+public interface ToolDao extends BaseDao<ToolPO> {}
diff --git 
a/bigtop-manager-grpc/src/main/java/org/apache/bigtop/manager/grpc/pojo/ClusterInfo.java
 
b/bigtop-manager-grpc/src/main/java/org/apache/bigtop/manager/grpc/pojo/ClusterInfo.java
index 957e0c86..358e646a 100644
--- 
a/bigtop-manager-grpc/src/main/java/org/apache/bigtop/manager/grpc/pojo/ClusterInfo.java
+++ 
b/bigtop-manager-grpc/src/main/java/org/apache/bigtop/manager/grpc/pojo/ClusterInfo.java
@@ -20,6 +20,8 @@ package org.apache.bigtop.manager.grpc.pojo;
 
 import lombok.Data;
 
+import java.util.List;
+
 @Data
 public class ClusterInfo {
 
@@ -28,4 +30,6 @@ public class ClusterInfo {
     private String userGroup;
 
     private String rootDir;
+
+    private List<ToolInfo> tools;
 }
diff --git 
a/bigtop-manager-grpc/src/main/java/org/apache/bigtop/manager/grpc/pojo/RepoInfo.java
 
b/bigtop-manager-grpc/src/main/java/org/apache/bigtop/manager/grpc/pojo/RepoInfo.java
index 874d886f..e92415b2 100644
--- 
a/bigtop-manager-grpc/src/main/java/org/apache/bigtop/manager/grpc/pojo/RepoInfo.java
+++ 
b/bigtop-manager-grpc/src/main/java/org/apache/bigtop/manager/grpc/pojo/RepoInfo.java
@@ -32,6 +32,4 @@ public class RepoInfo {
     private String arch;
 
     private String baseUrl;
-
-    private Integer type;
 }
diff --git 
a/bigtop-manager-grpc/src/main/java/org/apache/bigtop/manager/grpc/pojo/ClusterInfo.java
 
b/bigtop-manager-grpc/src/main/java/org/apache/bigtop/manager/grpc/pojo/ToolInfo.java
similarity index 87%
copy from 
bigtop-manager-grpc/src/main/java/org/apache/bigtop/manager/grpc/pojo/ClusterInfo.java
copy to 
bigtop-manager-grpc/src/main/java/org/apache/bigtop/manager/grpc/pojo/ToolInfo.java
index 957e0c86..6069809e 100644
--- 
a/bigtop-manager-grpc/src/main/java/org/apache/bigtop/manager/grpc/pojo/ClusterInfo.java
+++ 
b/bigtop-manager-grpc/src/main/java/org/apache/bigtop/manager/grpc/pojo/ToolInfo.java
@@ -21,11 +21,15 @@ package org.apache.bigtop.manager.grpc.pojo;
 import lombok.Data;
 
 @Data
-public class ClusterInfo {
+public class ToolInfo {
 
     private String name;
 
-    private String userGroup;
+    private String baseUrl;
 
-    private String rootDir;
+    private String pkgName;
+
+    private String arch;
+
+    private String checksum;
 }
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/helper/JobCacheHelper.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/helper/JobCacheHelper.java
index 9221db33..6abf0f2c 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/helper/JobCacheHelper.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/helper/JobCacheHelper.java
@@ -25,18 +25,21 @@ import org.apache.bigtop.manager.dao.po.ComponentPO;
 import org.apache.bigtop.manager.dao.po.HostPO;
 import org.apache.bigtop.manager.dao.po.RepoPO;
 import org.apache.bigtop.manager.dao.po.ServiceConfigPO;
+import org.apache.bigtop.manager.dao.po.ToolPO;
 import org.apache.bigtop.manager.dao.query.ComponentQuery;
 import org.apache.bigtop.manager.dao.repository.ClusterDao;
 import org.apache.bigtop.manager.dao.repository.ComponentDao;
 import org.apache.bigtop.manager.dao.repository.HostDao;
 import org.apache.bigtop.manager.dao.repository.RepoDao;
 import org.apache.bigtop.manager.dao.repository.ServiceConfigDao;
+import org.apache.bigtop.manager.dao.repository.ToolDao;
 import org.apache.bigtop.manager.grpc.generated.JobCacheReply;
 import org.apache.bigtop.manager.grpc.generated.JobCacheRequest;
 import org.apache.bigtop.manager.grpc.generated.JobCacheServiceGrpc;
 import org.apache.bigtop.manager.grpc.payload.JobCachePayload;
 import org.apache.bigtop.manager.grpc.pojo.ClusterInfo;
 import org.apache.bigtop.manager.grpc.pojo.RepoInfo;
+import org.apache.bigtop.manager.grpc.pojo.ToolInfo;
 import org.apache.bigtop.manager.server.exception.ServerException;
 import org.apache.bigtop.manager.server.grpc.GrpcClient;
 import org.apache.bigtop.manager.server.holder.SpringContextHolder;
@@ -63,6 +66,7 @@ public class JobCacheHelper {
     private static RepoDao repoDao;
     private static HostDao hostDao;
     private static ComponentDao componentDao;
+    private static ToolDao toolDao;
 
     private static final AtomicBoolean INITIALIZED = new AtomicBoolean(false);
 
@@ -72,6 +76,7 @@ public class JobCacheHelper {
         repoDao = SpringContextHolder.getBean(RepoDao.class);
         hostDao = SpringContextHolder.getBean(HostDao.class);
         componentDao = SpringContextHolder.getBean(ComponentDao.class);
+        toolDao = SpringContextHolder.getBean(ToolDao.class);
 
         INITIALIZED.set(true);
     }
@@ -127,12 +132,25 @@ public class JobCacheHelper {
         }
 
         ClusterPO clusterPO = clusterDao.findById(clusterId);
+        List<ToolPO> toolPOList = toolDao.findAll();
 
         ClusterInfo clusterInfo = new ClusterInfo();
         clusterInfo.setName(clusterPO.getName());
         clusterInfo.setUserGroup(clusterPO.getUserGroup());
         clusterInfo.setRootDir(clusterPO.getRootDir());
 
+        List<ToolInfo> toolInfoList = new ArrayList<>();
+        for (ToolPO toolPO : toolPOList) {
+            ToolInfo toolInfo = new ToolInfo();
+            toolInfo.setName(toolPO.getName());
+            toolInfo.setBaseUrl(toolPO.getBaseUrl());
+            toolInfo.setPkgName(toolPO.getPkgName());
+            toolInfo.setArch(toolPO.getArch());
+            toolInfo.setChecksum(toolPO.getChecksum());
+            toolInfoList.add(toolInfo);
+        }
+        clusterInfo.setTools(toolInfoList);
+
         Map<String, Map<String, String>> serviceConfigMap = 
payload.getConfigurations();
         serviceConfigMap.putAll(getServiceConfigMap(clusterId));
 
@@ -162,7 +180,6 @@ public class JobCacheHelper {
             repoInfo.setName(repoPO.getName());
             repoInfo.setArch(repoPO.getArch());
             repoInfo.setBaseUrl(repoPO.getBaseUrl());
-            repoInfo.setType(repoPO.getType());
             repoList.add(repoInfo);
         });
 
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/RepoDTO.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/RepoDTO.java
index adc9ca28..28c1dd84 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/RepoDTO.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/RepoDTO.java
@@ -34,6 +34,4 @@ public class RepoDTO {
     private String arch;
 
     private String baseUrl;
-
-    private Integer type;
 }
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/HostServiceImpl.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/HostServiceImpl.java
index 1808cc3f..f1d9a621 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/HostServiceImpl.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/HostServiceImpl.java
@@ -218,9 +218,7 @@ public class HostServiceImpl implements HostService {
     @Override
     public Boolean installDependencies(List<HostDTO> hostDTOList) {
         List<RepoPO> repoPOList = repoDao.findAll();
-        Map<String, RepoPO> archRepoMap = repoPOList.stream()
-                .filter(repoPO -> repoPO.getType() == 2)
-                .collect(Collectors.toMap(RepoPO::getArch, repo -> repo));
+        Map<String, RepoPO> archRepoMap = 
repoPOList.stream().collect(Collectors.toMap(RepoPO::getArch, repo -> repo));
 
         // Clear cache list
         installedStatus.clear();
diff --git a/bigtop-manager-server/src/main/resources/ddl/MySQL-DDL-CREATE.sql 
b/bigtop-manager-server/src/main/resources/ddl/MySQL-DDL-CREATE.sql
index 3314dfda..e6add511 100644
--- a/bigtop-manager-server/src/main/resources/ddl/MySQL-DDL-CREATE.sql
+++ b/bigtop-manager-server/src/main/resources/ddl/MySQL-DDL-CREATE.sql
@@ -126,8 +126,7 @@ CREATE TABLE `repo`
     `id`          BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
     `name`        VARCHAR(32) DEFAULT NULL,
     `arch`        VARCHAR(32) DEFAULT NULL,
-    `base_url`    VARCHAR(256) DEFAULT NULL,
-    `type`        INT DEFAULT NULL COMMENT '1-services, 2-tools',
+    `base_url`    VARCHAR(255) DEFAULT NULL,
     `create_time` DATETIME    DEFAULT CURRENT_TIMESTAMP,
     `update_time` DATETIME    DEFAULT CURRENT_TIMESTAMP ON UPDATE 
CURRENT_TIMESTAMP,
     `create_by`   BIGINT,
@@ -332,16 +331,29 @@ CREATE TABLE `llm_chat_message`
     KEY              `idx_user_id` (`user_id`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
 
+CREATE TABLE `tool`
+(
+    `id`          BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
+    `name`        VARCHAR(64) DEFAULT NULL,
+    `base_url`    VARCHAR(255) DEFAULT NULL,
+    `pkg_name`    VARCHAR(64) DEFAULT NULL,
+    `arch`        VARCHAR(64) DEFAULT NULL,
+    `checksum`    VARCHAR(255) DEFAULT NULL,
+    `create_time` DATETIME    DEFAULT CURRENT_TIMESTAMP,
+    `update_time` DATETIME    DEFAULT CURRENT_TIMESTAMP ON UPDATE 
CURRENT_TIMESTAMP,
+    `create_by`   BIGINT,
+    `update_by`   BIGINT,
+    PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
 -- Adding default admin user
 INSERT INTO user (username, password, nickname, status)
 VALUES ('admin', '21232f297a57a5a743894a0e4a801fc3', 'Administrator', true);
 
-INSERT INTO repo (name, arch, base_url, type)
+INSERT INTO repo (name, arch, base_url)
 VALUES
-('Service tarballs', 'x86_64', 
'http://repos.bigtop.apache.org/releases/bigtop-manager/1.0.0/tarballs', 1),
-('Service tarballs', 'aarch64', 
'http://repos.bigtop.apache.org/releases/bigtop-manager/1.0.0/tarballs', 1),
-('BM tools', 'x86_64', 
'http://repos.bigtop.apache.org/releases/bigtop-manager/1.0.0/tools', 2),
-('BM tools', 'aarch64', 
'http://repos.bigtop.apache.org/releases/bigtop-manager/1.0.0/tools', 2);
+('Service tarballs', 'x86_64', 
'http://repos.bigtop.apache.org/releases/bigtop-manager/1.0.0'),
+('Service tarballs', 'aarch64', 
'http://repos.bigtop.apache.org/releases/bigtop-manager/1.0.0');
 
 -- Adding default llm platform
 INSERT INTO llm_platform (credential, name, support_models)
@@ -365,4 +377,10 @@ WHERE `name` = 'QianFan';
 
 UPDATE `llm_platform`
 SET `desc` = 'Get your API Key in https://platform.deepseek.com'
-WHERE `name` = 'DeepSeek';
\ No newline at end of file
+WHERE `name` = 'DeepSeek';
+
+INSERT INTO tool (name, base_url, pkg_name, arch, checksum)
+VALUES
+('jdk8', 
'https://github.com/adoptium/temurin8-binaries/releases/download/jdk8u452-b09/',
 'OpenJDK8U-jdk_x64_linux_hotspot_8u452b09.tar.gz', 'x86_64', 
'SHA-256:9448308a21841960a591b47927cf2d44fdc4c0533a5f8111a4b243a6bafb5d27'),
+('jdk8', 
'https://github.com/adoptium/temurin8-binaries/releases/download/jdk8u452-b09/',
 'OpenJDK8U-jdk_aarch64_linux_hotspot_8u452b09.tar.gz', 'aarch64', 
'SHA-256:d8a1aecea0913b7a1e0d737ba6f7ea99059b3f6fd17813d4a24e8b3fc3aee278'),
+('mysql-connector-j', 
'https://repo1.maven.org/maven2/com/mysql/mysql-connector-j/8.0.33/', 
'mysql-connector-j-8.0.33.jar', 'x86_64,aarch64', 
'SHA-256:e2a3b2fc726a1ac64e998585db86b30fa8bf3f706195b78bb77c5f99bf877bd9');
diff --git 
a/bigtop-manager-server/src/main/resources/ddl/PostgreSQL-DDL-CREATE.sql 
b/bigtop-manager-server/src/main/resources/ddl/PostgreSQL-DDL-CREATE.sql
index 02f59f44..94f94874 100644
--- a/bigtop-manager-server/src/main/resources/ddl/PostgreSQL-DDL-CREATE.sql
+++ b/bigtop-manager-server/src/main/resources/ddl/PostgreSQL-DDL-CREATE.sql
@@ -120,8 +120,7 @@ CREATE TABLE repo
     id          BIGINT CHECK (id > 0)         NOT NULL GENERATED ALWAYS AS 
IDENTITY,
     name        VARCHAR(32)  DEFAULT NULL,
     arch        VARCHAR(32)  DEFAULT NULL,
-    base_url    VARCHAR(256)  DEFAULT NULL,
-    type        INTEGER  DEFAULT NULL,
+    base_url    VARCHAR(255)  DEFAULT NULL,
     create_time TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP,
     update_time TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP,
     create_by   BIGINT,
@@ -129,8 +128,6 @@ CREATE TABLE repo
     PRIMARY KEY (id)
 );
 
-COMMENT ON COLUMN repo.type IS '1-services, 2-tools';
-
 CREATE TABLE service
 (
     id                BIGINT NOT NULL GENERATED ALWAYS AS IDENTITY,
@@ -343,18 +340,31 @@ CREATE TABLE llm_chat_message
     PRIMARY KEY (id)
 );
 
+CREATE TABLE tool
+(
+    id          BIGINT CHECK (id > 0)        NOT NULL GENERATED ALWAYS AS 
IDENTITY,
+    name        VARCHAR(64)                  NOT NULL,
+    base_url    VARCHAR(255)                 DEFAULT NULL,
+    pkg_name    VARCHAR(64)                  DEFAULT NULL,
+    arch        VARCHAR(64)                  DEFAULT NULL,
+    checksum    VARCHAR(255)                 DEFAULT NULL,
+    create_time TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP,
+    update_time TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP,
+    create_by   BIGINT,
+    update_by   BIGINT,
+    PRIMARY KEY (id)
+);
+
 CREATE INDEX idx_thread_id ON llm_chat_message (thread_id);
 CREATE INDEX idx_message_user_id ON llm_chat_message (user_id);
 
 INSERT INTO "user" (username, password, nickname, status)
 VALUES ('admin', '21232f297a57a5a743894a0e4a801fc3', 'Administrator', true);
 
-INSERT INTO repo (name, arch, base_url, type)
+INSERT INTO repo (name, arch, base_url)
 VALUES
-('Service tarballs', 'x86_64', 
'http://repos.bigtop.apache.org/releases/bigtop-manager/1.0.0/tarballs', 1),
-('Service tarballs', 'aarch64', 
'http://repos.bigtop.apache.org/releases/bigtop-manager/1.0.0/tarballs', 1),
-('BM tools', 'x86_64', 
'http://repos.bigtop.apache.org/releases/bigtop-manager/1.0.0/tools', 2),
-('BM tools', 'aarch64', 
'http://repos.bigtop.apache.org/releases/bigtop-manager/1.0.0/tools', 2);
+('Service tarballs', 'x86_64', 
'http://repos.bigtop.apache.org/releases/bigtop-manager/1.0.0'),
+('Service tarballs', 'aarch64', 
'http://repos.bigtop.apache.org/releases/bigtop-manager/1.0.0');
 
 INSERT INTO llm_platform (credential, name, support_models)
 VALUES
@@ -377,4 +387,10 @@ WHERE "name" = 'QianFan';
 
 UPDATE llm_platform
 SET "desc" = 'Get your API Key in https://platform.deepseek.com'
-WHERE "name" = 'DeepSeek';
\ No newline at end of file
+WHERE "name" = 'DeepSeek';
+
+INSERT INTO tool (name, base_url, pkg_name, arch, checksum)
+VALUES
+('jdk8', 
'https://github.com/adoptium/temurin8-binaries/releases/download/jdk8u452-b09/',
 'OpenJDK8U-jdk_x64_linux_hotspot_8u452b09.tar.gz', 'x86_64', 
'SHA-256:9448308a21841960a591b47927cf2d44fdc4c0533a5f8111a4b243a6bafb5d27'),
+('jdk8', 
'https://github.com/adoptium/temurin8-binaries/releases/download/jdk8u452-b09/',
 'OpenJDK8U-jdk_aarch64_linux_hotspot_8u452b09.tar.gz', 'aarch64', 
'SHA-256:d8a1aecea0913b7a1e0d737ba6f7ea99059b3f6fd17813d4a24e8b3fc3aee278'),
+('mysql-connector-j', 
'https://repo1.maven.org/maven2/com/mysql/mysql-connector-j/8.0.33/', 
'mysql-connector-j-8.0.33.jar', 'x86_64,aarch64', 
'SHA-256:e2a3b2fc726a1ac64e998585db86b30fa8bf3f706195b78bb77c5f99bf877bd9');
diff --git 
a/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/flink/order.json
 
b/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/flink/order.json
index 459414e4..55f4cf14 100644
--- 
a/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/flink/order.json
+++ 
b/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/flink/order.json
@@ -1,3 +1,3 @@
 {
-    "FLINK_HISTORY_SERVER-START": ["NAMENODE-START", "DATANODE-START"]
+    "FLINK_HISTORYSERVER-START": ["NAMENODE-START", "DATANODE-START"]
 }
diff --git 
a/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/hive/HiveMetastoreScript.java
 
b/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/hive/HiveMetastoreScript.java
index 373e5dc5..065a6d2a 100644
--- 
a/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/hive/HiveMetastoreScript.java
+++ 
b/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/hive/HiveMetastoreScript.java
@@ -21,11 +21,12 @@ package org.apache.bigtop.manager.stack.bigtop.v3_3_0.hive;
 import org.apache.bigtop.manager.common.constants.Constants;
 import org.apache.bigtop.manager.common.constants.MessageConstants;
 import org.apache.bigtop.manager.common.shell.ShellResult;
+import org.apache.bigtop.manager.grpc.pojo.ToolInfo;
 import org.apache.bigtop.manager.stack.core.exception.StackException;
 import org.apache.bigtop.manager.stack.core.spi.param.Params;
 import org.apache.bigtop.manager.stack.core.spi.script.AbstractServerScript;
 import org.apache.bigtop.manager.stack.core.spi.script.Script;
-import org.apache.bigtop.manager.stack.core.tarball.TarballDownloader;
+import org.apache.bigtop.manager.stack.core.tarball.FileDownloader;
 import org.apache.bigtop.manager.stack.core.utils.LocalSettings;
 import org.apache.bigtop.manager.stack.core.utils.linux.LinuxFileUtils;
 import org.apache.bigtop.manager.stack.core.utils.linux.LinuxOSUtils;
@@ -33,6 +34,7 @@ import 
org.apache.bigtop.manager.stack.core.utils.linux.LinuxOSUtils;
 import com.google.auto.service.AutoService;
 import lombok.extern.slf4j.Slf4j;
 
+import java.io.File;
 import java.io.IOException;
 import java.text.MessageFormat;
 import java.util.Properties;
@@ -113,9 +115,9 @@ public class HiveMetastoreScript extends 
AbstractServerScript {
     }
 
     private void downloadMySQLJdbcDriver(Params params) {
-        String mysqlDriver =
-                
"https://repo1.maven.org/maven2/com/mysql/mysql-connector-j/8.0.33/mysql-connector-j-8.0.33.jar";;
-        TarballDownloader.download(mysqlDriver, params.stackHome());
+        ToolInfo tool = LocalSettings.getTool("mysql-connector-j");
+        String downloadUrl = tool.getBaseUrl() + File.separator + 
tool.getPkgName();
+        FileDownloader.download(downloadUrl, params.stackHome(), tool);
         LinuxFileUtils.moveFile(params.stackHome() + 
"/mysql-connector-j-8.0.33.jar", params.serviceHome() + "/lib/");
         LinuxFileUtils.updateOwner(params.serviceHome() + "/lib", 
params.user(), params.group(), true);
         LinuxFileUtils.updatePermissions(params.serviceHome() + "/lib", 
Constants.PERMISSION_755, true);
diff --git 
a/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/tez/TezClientScript.java
 
b/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/tez/TezClientScript.java
index 640370ab..43c04f2b 100644
--- 
a/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/tez/TezClientScript.java
+++ 
b/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/tez/TezClientScript.java
@@ -24,7 +24,7 @@ import org.apache.bigtop.manager.grpc.pojo.RepoInfo;
 import org.apache.bigtop.manager.stack.core.spi.param.Params;
 import org.apache.bigtop.manager.stack.core.spi.script.AbstractClientScript;
 import org.apache.bigtop.manager.stack.core.spi.script.Script;
-import org.apache.bigtop.manager.stack.core.tarball.TarballDownloader;
+import org.apache.bigtop.manager.stack.core.tarball.FileDownloader;
 
 import com.google.auto.service.AutoService;
 import lombok.extern.slf4j.Slf4j;
@@ -52,7 +52,7 @@ public class TezClientScript extends AbstractClientScript {
         String stackHome = params.stackHome();
         for (PackageInfo packageInfo : packages) {
             String remoteUrl = repoUrl + File.separator + 
packageInfo.getName();
-            TarballDownloader.download(remoteUrl, stackHome, packageInfo);
+            FileDownloader.download(remoteUrl, stackHome, packageInfo);
         }
 
         return ShellResult.success();
diff --git 
a/bigtop-manager-stack/bigtop-manager-stack-core/src/main/java/org/apache/bigtop/manager/stack/core/spi/param/BaseParams.java
 
b/bigtop-manager-stack/bigtop-manager-stack-core/src/main/java/org/apache/bigtop/manager/stack/core/spi/param/BaseParams.java
index 3c7985dc..9f6f47a0 100644
--- 
a/bigtop-manager-stack/bigtop-manager-stack-core/src/main/java/org/apache/bigtop/manager/stack/core/spi/param/BaseParams.java
+++ 
b/bigtop-manager-stack/bigtop-manager-stack-core/src/main/java/org/apache/bigtop/manager/stack/core/spi/param/BaseParams.java
@@ -95,8 +95,7 @@ public abstract class BaseParams implements Params {
     @Override
     public RepoInfo repo() {
         return LocalSettings.repos().stream()
-                // Use service tarballs repo(type == 1)
-                .filter(r -> OSDetection.getArch().equals(r.getArch()) && 
r.getType() == 1)
+                .filter(r -> OSDetection.getArch().equals(r.getArch()))
                 .findFirst()
                 .orElseThrow(() -> new StackException(
                         "Cannot find repo for os: [{0}] and arch: [{1}]", 
OSDetection.getOS(), OSDetection.getArch()));
diff --git 
a/bigtop-manager-stack/bigtop-manager-stack-core/src/main/java/org/apache/bigtop/manager/stack/core/tarball/TarballDownloader.java
 
b/bigtop-manager-stack/bigtop-manager-stack-core/src/main/java/org/apache/bigtop/manager/stack/core/tarball/FileDownloader.java
similarity index 91%
rename from 
bigtop-manager-stack/bigtop-manager-stack-core/src/main/java/org/apache/bigtop/manager/stack/core/tarball/TarballDownloader.java
rename to 
bigtop-manager-stack/bigtop-manager-stack-core/src/main/java/org/apache/bigtop/manager/stack/core/tarball/FileDownloader.java
index 4e1cf5b0..1e5608ba 100644
--- 
a/bigtop-manager-stack/bigtop-manager-stack-core/src/main/java/org/apache/bigtop/manager/stack/core/tarball/TarballDownloader.java
+++ 
b/bigtop-manager-stack/bigtop-manager-stack-core/src/main/java/org/apache/bigtop/manager/stack/core/tarball/FileDownloader.java
@@ -19,6 +19,7 @@
 package org.apache.bigtop.manager.stack.core.tarball;
 
 import org.apache.bigtop.manager.grpc.pojo.PackageInfo;
+import org.apache.bigtop.manager.grpc.pojo.ToolInfo;
 import org.apache.bigtop.manager.stack.core.exception.StackException;
 
 import lombok.extern.slf4j.Slf4j;
@@ -30,7 +31,16 @@ import java.net.HttpURLConnection;
 import java.net.URL;
 
 @Slf4j
-public class TarballDownloader {
+public class FileDownloader {
+
+    public static void download(String remoteUrl, String saveDir, ToolInfo 
toolInfo) {
+        PackageInfo packageInfo = new PackageInfo();
+        packageInfo.setUrl(toolInfo.getBaseUrl());
+        packageInfo.setName(toolInfo.getPkgName());
+        packageInfo.setChecksum(toolInfo.getChecksum());
+
+        download(remoteUrl, saveDir, packageInfo);
+    }
 
     @SuppressWarnings("ResultOfMethodCallIgnored")
     public static void download(String remoteUrl, String saveDir, PackageInfo 
packageInfo) {
diff --git 
a/bigtop-manager-stack/bigtop-manager-stack-core/src/main/java/org/apache/bigtop/manager/stack/core/utils/LocalSettings.java
 
b/bigtop-manager-stack/bigtop-manager-stack-core/src/main/java/org/apache/bigtop/manager/stack/core/utils/LocalSettings.java
index ba0b7363..7e90001d 100644
--- 
a/bigtop-manager-stack/bigtop-manager-stack-core/src/main/java/org/apache/bigtop/manager/stack/core/utils/LocalSettings.java
+++ 
b/bigtop-manager-stack/bigtop-manager-stack-core/src/main/java/org/apache/bigtop/manager/stack/core/utils/LocalSettings.java
@@ -21,8 +21,11 @@ package org.apache.bigtop.manager.stack.core.utils;
 import org.apache.bigtop.manager.common.constants.CacheFiles;
 import org.apache.bigtop.manager.common.utils.JsonUtils;
 import org.apache.bigtop.manager.common.utils.ProjectPathUtils;
+import org.apache.bigtop.manager.common.utils.os.OSDetection;
 import org.apache.bigtop.manager.grpc.pojo.ClusterInfo;
 import org.apache.bigtop.manager.grpc.pojo.RepoInfo;
+import org.apache.bigtop.manager.grpc.pojo.ToolInfo;
+import org.apache.bigtop.manager.stack.core.exception.StackException;
 
 import com.fasterxml.jackson.core.type.TypeReference;
 import lombok.extern.slf4j.Slf4j;
@@ -41,7 +44,6 @@ public class LocalSettings {
     }
 
     public static Map<String, Object> configurations(String service, String 
type) {
-
         Map<String, Object> configDataMap = new HashMap<>();
         File file = createFile(ProjectPathUtils.getAgentCachePath() + 
CacheFiles.CONFIGURATIONS_INFO);
         try {
@@ -65,7 +67,6 @@ public class LocalSettings {
     }
 
     public static Map<String, List<String>> hosts() {
-
         Map<String, List<String>> hostJson = new HashMap<>();
         File file = createFile(ProjectPathUtils.getAgentCachePath() + 
CacheFiles.HOSTS_INFO);
         if (file.exists()) {
@@ -75,7 +76,6 @@ public class LocalSettings {
     }
 
     public static Map<String, Object> basicInfo() {
-
         Map<String, Object> settings = new HashMap<>();
         File file = createFile(ProjectPathUtils.getAgentCachePath() + 
CacheFiles.SETTINGS_INFO);
         if (file.exists()) {
@@ -85,7 +85,6 @@ public class LocalSettings {
     }
 
     public static Map<String, String> users() {
-
         Map<String, String> userMap = new HashMap<>();
         File file = createFile(ProjectPathUtils.getAgentCachePath() + 
CacheFiles.USERS_INFO);
         if (file.exists()) {
@@ -99,7 +98,6 @@ public class LocalSettings {
     }
 
     public static List<RepoInfo> repos() {
-
         List<RepoInfo> repoInfoList = List.of();
         File file = createFile(ProjectPathUtils.getAgentCachePath() + 
CacheFiles.REPOS_INFO);
         if (file.exists()) {
@@ -109,7 +107,6 @@ public class LocalSettings {
     }
 
     public static ClusterInfo cluster() {
-
         ClusterInfo clusterInfo = new ClusterInfo();
         File file = createFile(ProjectPathUtils.getAgentCachePath() + 
CacheFiles.CLUSTER_INFO);
         if (file.exists()) {
@@ -118,6 +115,22 @@ public class LocalSettings {
         return clusterInfo;
     }
 
+    public static ToolInfo getTool(String name) {
+        return getTool(name, OSDetection.getArch());
+    }
+
+    public static ToolInfo getTool(String name, String arch) {
+        ClusterInfo clusterInfo = cluster();
+        for (ToolInfo toolInfo : clusterInfo.getTools()) {
+            if (toolInfo.getName().equals(name) && 
toolInfo.getArch().contains(arch)) {
+                return toolInfo;
+            }
+        }
+
+        log.error("Cannot find tool: [{}] for arch: [{}]", name, arch);
+        throw new StackException("Tool not found: " + name);
+    }
+
     protected static File createFile(String fileName) {
         return new File(fileName);
     }
diff --git 
a/bigtop-manager-stack/bigtop-manager-stack-core/src/main/java/org/apache/bigtop/manager/stack/core/utils/TarballUtils.java
 
b/bigtop-manager-stack/bigtop-manager-stack-core/src/main/java/org/apache/bigtop/manager/stack/core/utils/TarballUtils.java
index 263694e2..bed366e6 100644
--- 
a/bigtop-manager-stack/bigtop-manager-stack-core/src/main/java/org/apache/bigtop/manager/stack/core/utils/TarballUtils.java
+++ 
b/bigtop-manager-stack/bigtop-manager-stack-core/src/main/java/org/apache/bigtop/manager/stack/core/utils/TarballUtils.java
@@ -19,7 +19,7 @@
 package org.apache.bigtop.manager.stack.core.utils;
 
 import org.apache.bigtop.manager.grpc.pojo.PackageInfo;
-import org.apache.bigtop.manager.stack.core.tarball.TarballDownloader;
+import org.apache.bigtop.manager.stack.core.tarball.FileDownloader;
 import org.apache.bigtop.manager.stack.core.tarball.TarballExtractor;
 
 import org.apache.commons.lang3.StringUtils;
@@ -44,7 +44,7 @@ public class TarballUtils {
                 ? repoUrl + File.separator + packageInfo.getName()
                 : packageInfo.getUrl() + File.separator + 
packageInfo.getName();
         File localFile = new File(stackHome + File.separator + 
packageInfo.getName());
-        TarballDownloader.download(remoteUrl, stackHome, packageInfo);
+        FileDownloader.download(remoteUrl, stackHome, packageInfo);
 
         log.info("Extracting [{}] to [{}]", localFile.getAbsolutePath(), 
serviceHome);
         TarballExtractor.extractTarball(localFile.getAbsolutePath(), 
serviceHome, skipLevels);
diff --git 
a/bigtop-manager-stack/bigtop-manager-stack-core/src/test/java/org/apache/bigtop/manager/stack/core/spi/param/BaseParamsTest.java
 
b/bigtop-manager-stack/bigtop-manager-stack-core/src/test/java/org/apache/bigtop/manager/stack/core/spi/param/BaseParamsTest.java
index f3dfb8ed..59d53a81 100644
--- 
a/bigtop-manager-stack/bigtop-manager-stack-core/src/test/java/org/apache/bigtop/manager/stack/core/spi/param/BaseParamsTest.java
+++ 
b/bigtop-manager-stack/bigtop-manager-stack-core/src/test/java/org/apache/bigtop/manager/stack/core/spi/param/BaseParamsTest.java
@@ -57,9 +57,8 @@ public class BaseParamsTest {
     @BeforeEach
     public void setUp() {
         List<RepoInfo> repos = new ArrayList<>();
-        repos.add(new RepoInfo("repo1", "mockArch", "testURL", 2));
-        repos.add(new RepoInfo("repo2", "mockArch", "testURL", 1));
-        repos.add(new RepoInfo("repo3", "mockArch", "testURL", 1));
+        repos.add(new RepoInfo("repo2", "mockArch", "testURL"));
+        repos.add(new RepoInfo("repo3", "mockArch", "testURL"));
 
         List<String> arch = new ArrayList<>();
         arch.add("mockArch");
@@ -133,7 +132,6 @@ public class BaseParamsTest {
     @Test
     public void testRepo() {
         RepoInfo repo = mockBaseParams.repo();
-        assertEquals(1, repo.getType());
         assertEquals("repo2", repo.getName());
         assertEquals("mockArch", repo.getArch());
     }
diff --git 
a/bigtop-manager-stack/bigtop-manager-stack-core/src/test/java/org/apache/bigtop/manager/stack/core/utils/LocalSettingsTest.java
 
b/bigtop-manager-stack/bigtop-manager-stack-core/src/test/java/org/apache/bigtop/manager/stack/core/utils/LocalSettingsTest.java
index fef270bf..b5f31d45 100644
--- 
a/bigtop-manager-stack/bigtop-manager-stack-core/src/test/java/org/apache/bigtop/manager/stack/core/utils/LocalSettingsTest.java
+++ 
b/bigtop-manager-stack/bigtop-manager-stack-core/src/test/java/org/apache/bigtop/manager/stack/core/utils/LocalSettingsTest.java
@@ -174,8 +174,8 @@ public class LocalSettingsTest {
 
     @Test
     public void testRepos() {
-        RepoInfo repo1 = new RepoInfo("repo1", "x86_64", "http://repo1.com";, 
1);
-        RepoInfo repo2 = new RepoInfo("repo2", "arch64", "http://repo2.com";, 
2);
+        RepoInfo repo1 = new RepoInfo("repo1", "x86_64", "http://repo1.com";);
+        RepoInfo repo2 = new RepoInfo("repo2", "arch64", "http://repo2.com";);
         List<RepoInfo> repoInfoList = List.of(repo1, repo2);
 
         File file = mock(File.class);
@@ -190,8 +190,8 @@ public class LocalSettingsTest {
         
localSettingsMockedStatic.when(LocalSettings::repos).thenCallRealMethod();
 
         List<RepoInfo> expectedRepoInfoList = List.of(
-                new RepoInfo("repo1", "x86_64", "http://repo1.com";, 1),
-                new RepoInfo("repo2", "arch64", "http://repo2.com";, 2));
+                new RepoInfo("repo1", "x86_64", "http://repo1.com";),
+                new RepoInfo("repo2", "arch64", "http://repo2.com";));
         assertEquals(expectedRepoInfoList, LocalSettings.repos());
     }
 
diff --git a/docs/en/cluster.md b/docs/en/cluster.md
index a16e0950..da0b6440 100644
--- a/docs/en/cluster.md
+++ b/docs/en/cluster.md
@@ -19,12 +19,12 @@ The stack page is a display page that mainly shows which 
optional services are a
 
 
![Stack](https://github.com/user-attachments/assets/faf1112c-f0a6-4353-ba63-83abbb819c29)
 
-Expect for our official repository, users can also set their own repository 
which can configured here
+Expect for our official repository, users can also set their own repository 
which can configured here(due to license issue, MySQL/Grafana in Infra Stack 
are downloaded from the official website instead of the repository).
 
 We also provide other ways for you download dependencies:
 * BaiduNetdisk: https://pan.baidu.com/s/162FXYsaRuwFQjrOlMuDRjg?pwd=hufb
 
-![Repository](https://github.com/user-attachments/assets/6b235122-ffdf-4d16-a4b4-994525f12d51)
+![Repository](https://github.com/user-attachments/assets/9ff12f07-5a15-42e7-84d7-a3eab3455468)
 
 ### Hosts
 #### Add a Host
diff --git a/docs/zh/cluster.md b/docs/zh/cluster.md
index d54b550b..3dab536c 100644
--- a/docs/zh/cluster.md
+++ b/docs/zh/cluster.md
@@ -17,12 +17,12 @@
 
 
![Stack](https://github.com/user-attachments/assets/faf1112c-f0a6-4353-ba63-83abbb819c29)
 
-除了官方 Repository 外,用户也可以搭建自己的 Repository 并在此处进行配置
+除了官方 Repository 外,用户也可以搭建自己的 Repository 并在此处进行配置(注意 Infra 中的 MySQL/Grafana 由于 
License 原因,是从官方网站下载而不是从 Repository 下载)
 
 我们也提供了其他方式供您下载相应的依赖:
 * 百度云:https://pan.baidu.com/s/162FXYsaRuwFQjrOlMuDRjg?pwd=hufb
 
-![Repository](https://github.com/user-attachments/assets/6b235122-ffdf-4d16-a4b4-994525f12d51)
+![Repository](https://github.com/user-attachments/assets/9ff12f07-5a15-42e7-84d7-a3eab3455468)
 
 ### 主机
 #### 新增主机


Reply via email to