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

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


The following commit(s) were added to refs/heads/main by this push:
     new faa3f197 BIGTOP-4297: Install Tez with tarball (#120)
faa3f197 is described below

commit faa3f1974a5686823e05ffa3e6b01257cc6d3547
Author: Zhiguo Wu <[email protected]>
AuthorDate: Mon Dec 9 17:16:24 2024 +0800

    BIGTOP-4297: Install Tez with tarball (#120)
---
 .../bigtop/3.3.0/services/flink/metainfo.xml       |  6 ++-
 .../bigtop/3.3.0/services/hadoop/metainfo.xml      |  2 +-
 .../bigtop/3.3.0/services/kafka/metainfo.xml       |  4 +-
 .../stacks/bigtop/3.3.0/services/solr/metainfo.xml |  4 +-
 .../stacks/bigtop/3.3.0/services/tez/metainfo.xml  |  6 ++-
 .../bigtop/3.3.0/services/zookeeper/metainfo.xml   |  2 +-
 .../stack/bigtop/v3_3_0/tez/TezClientScript.java   | 30 +++++++++++-
 .../manager/stack/bigtop/v3_3_0/tez/TezParams.java | 15 +-----
 .../manager/stack/bigtop/v3_3_0/tez/TezSetup.java  | 32 +++++++++----
 .../stack/core/tarball/TarballDownloader.java      | 53 +++++++++++++++++++++-
 .../stack/core/tarball/TarballExtractor.java       |  2 +-
 .../manager/stack/core/utils/TarballUtils.java     | 46 +------------------
 .../stack/core/utils/linux/LinuxFileUtils.java     | 25 ++++++++++
 13 files changed, 147 insertions(+), 80 deletions(-)

diff --git 
a/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/flink/metainfo.xml
 
b/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/flink/metainfo.xml
index dd989a05..6fc6bbd4 100644
--- 
a/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/flink/metainfo.xml
+++ 
b/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/flink/metainfo.xml
@@ -52,17 +52,19 @@
             <package-specific>
                 <architectures>
                     <arch>x86_64</arch>
+                    <arch>aarch64</arch>
                 </architectures>
                 <packages>
                     <package>
-                        <name>flink_3_3_0</name>
+                        <name>flink-1.16.2-1.tgz</name>
+                        
<checksum>SHA-256:8c6da7cbab14b9cf0ce39c8c873b29f16c83df0b95b7af5cf3061a468efac228</checksum>
                     </package>
                 </packages>
             </package-specific>
         </package-specifics>
 
         <required-services>
-            <service>yarn</service>
+            <service>hadoop</service>
         </required-services>
     </service>
 </metainfo>
\ No newline at end of file
diff --git 
a/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/hadoop/metainfo.xml
 
b/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/hadoop/metainfo.xml
index ce0615be..0ced8143 100644
--- 
a/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/hadoop/metainfo.xml
+++ 
b/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/hadoop/metainfo.xml
@@ -112,7 +112,7 @@
                 <packages>
                     <package>
                         <name>hadoop-3.3.6-1.tar.gz</name>
-                        
<checksum>SHA-256:2a9312eac69a542c6266f1689d29ded243dde2d61add333a9762829008f97442</checksum>
+                        
<checksum>SHA-256:0da6364126c6ea6dd0f5b545afec33957ee801d6db6c0874edb0aa5be1e89995</checksum>
                     </package>
                 </packages>
             </package-specific>
diff --git 
a/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/kafka/metainfo.xml
 
b/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/kafka/metainfo.xml
index 2c113d53..75ed8e85 100644
--- 
a/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/kafka/metainfo.xml
+++ 
b/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/kafka/metainfo.xml
@@ -43,10 +43,12 @@
             <package-specific>
                 <architectures>
                     <arch>x86_64</arch>
+                    <arch>aarch64</arch>
                 </architectures>
                 <packages>
                     <package>
-                        <name>kafka_3_3_0</name>
+                        <name>kafka-2.8.2-1.tgz</name>
+                        
<checksum>SHA-256:30a2d69ef081813624273d8a406c9b803c5868df998484e27207f85ea217870f</checksum>
                     </package>
                 </packages>
             </package-specific>
diff --git 
a/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/solr/metainfo.xml
 
b/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/solr/metainfo.xml
index 95ee24a0..32c5465f 100644
--- 
a/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/solr/metainfo.xml
+++ 
b/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/solr/metainfo.xml
@@ -47,10 +47,12 @@
             <package-specific>
                 <architectures>
                     <arch>x86_64</arch>
+                    <arch>aarch64</arch>
                 </architectures>
                 <packages>
                     <package>
-                        <name>solr_3_3_0</name>
+                        <name>solr-8.11.2-2.tgz</name>
+                        
<checksum>SHA-256:fba6618e4c3a3133a4c4d57718e52cc797d10374f056825329a9e76b93de9f48</checksum>
                     </package>
                 </packages>
             </package-specific>
diff --git 
a/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/tez/metainfo.xml
 
b/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/tez/metainfo.xml
index 3ca39261..509db831 100644
--- 
a/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/tez/metainfo.xml
+++ 
b/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/tez/metainfo.xml
@@ -39,17 +39,19 @@
             <package-specific>
                 <architectures>
                     <arch>x86_64</arch>
+                    <arch>aarch64</arch>
                 </architectures>
                 <packages>
                     <package>
-                        <name>tez_3_3_0</name>
+                        <name>tez-0.10.2-1.tar.gz</name>
+                        
<checksum>SHA-256:ebc2c195780fc76fb9b12e8987e48c301ca0b1916dca515f5c7a1122d74f397e</checksum>
                     </package>
                 </packages>
             </package-specific>
         </package-specifics>
 
         <required-services>
-            <service>hdfs</service>
+            <service>hadoop</service>
         </required-services>
     </service>
 </metainfo>
diff --git 
a/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/zookeeper/metainfo.xml
 
b/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/zookeeper/metainfo.xml
index 7b35ebff..7748ff51 100644
--- 
a/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/zookeeper/metainfo.xml
+++ 
b/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/zookeeper/metainfo.xml
@@ -54,7 +54,7 @@
                 <packages>
                     <package>
                         <name>zookeeper-3.7.2-1.tar.gz</name>
-                        
<checksum>SHA-256:380f15d55c0282e33fdc7c2ec551bc5586f0ac126c243cd84347ccb775b846f3</checksum>
+                        
<checksum>SHA-256:83e07f914eb3477c77245f4dc44031b82ea6ef1be3691687f469ddc4b8c720bb</checksum>
                     </package>
                 </packages>
             </package-specific>
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 e65478b7..bcbea7d9 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
@@ -18,21 +18,49 @@
  */
 package org.apache.bigtop.manager.stack.bigtop.v3_3_0.tez;
 
+import org.apache.bigtop.manager.common.message.entity.pojo.PackageInfo;
+import org.apache.bigtop.manager.common.message.entity.pojo.RepoInfo;
 import org.apache.bigtop.manager.common.shell.ShellResult;
 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 com.google.auto.service.AutoService;
 import lombok.extern.slf4j.Slf4j;
 
+import java.io.File;
+import java.util.List;
+
 @Slf4j
 @AutoService(Script.class)
 public class TezClientScript extends AbstractClientScript {
 
+    /**
+     * Tez tarball file doesn't need to be extracted, so here we override 
{@link #add(Params)} method
+     * and do nothing after download the tarball file.
+     *
+     * @param params the parameters required for installation
+     * @return ShellResult
+     */
+    @Override
+    public ShellResult add(Params params) {
+        RepoInfo repo = params.repo();
+        List<PackageInfo> packages = params.packages();
+
+        String repoUrl = repo.getBaseUrl();
+        String stackHome = params.stackHome();
+        for (PackageInfo packageInfo : packages) {
+            String remoteUrl = repoUrl + File.separator + 
packageInfo.getName();
+            TarballDownloader.download(remoteUrl, stackHome, packageInfo);
+        }
+
+        return ShellResult.success();
+    }
+
     @Override
     public ShellResult configure(Params params) {
-        return TezSetup.config(params);
+        return TezSetup.configure(params);
     }
 
     @Override
diff --git 
a/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/tez/TezParams.java
 
b/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/tez/TezParams.java
index 25995737..3d2c8784 100644
--- 
a/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/tez/TezParams.java
+++ 
b/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/tez/TezParams.java
@@ -77,27 +77,14 @@ public class TezParams extends BigtopParams {
         return tezEnv;
     }
 
-    @Override
-    public String confDir() {
-        return "/etc/tez/conf";
-    }
-
     public String hadoopConfDir() {
-        return "/etc/hadoop/conf";
+        return hadoopHome() + "/etc/hadoop";
     }
 
     public String hadoopHome() {
         return stackHome() + "/hadoop";
     }
 
-    public String hdfsHome() {
-        return stackHome() + "/hadoop-hdfs";
-    }
-
-    public String yarnHome() {
-        return stackHome() + "/hadoop-yarn";
-    }
-
     @Override
     public String getServiceName() {
         return "tez";
diff --git 
a/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/tez/TezSetup.java
 
b/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/tez/TezSetup.java
index cd995251..b68c77ad 100644
--- 
a/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/tez/TezSetup.java
+++ 
b/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/tez/TezSetup.java
@@ -19,8 +19,8 @@
 package org.apache.bigtop.manager.stack.bigtop.v3_3_0.tez;
 
 import org.apache.bigtop.manager.common.constants.Constants;
+import org.apache.bigtop.manager.common.message.entity.pojo.PackageInfo;
 import org.apache.bigtop.manager.common.shell.ShellResult;
-import org.apache.bigtop.manager.stack.bigtop.utils.HdfsUtil;
 import org.apache.bigtop.manager.stack.core.enums.ConfigType;
 import org.apache.bigtop.manager.stack.core.spi.param.Params;
 import org.apache.bigtop.manager.stack.core.utils.LocalSettings;
@@ -31,6 +31,7 @@ import lombok.NoArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 
 import java.text.MessageFormat;
+import java.util.List;
 
 import static 
org.apache.bigtop.manager.common.constants.Constants.PERMISSION_755;
 
@@ -38,16 +39,29 @@ import static 
org.apache.bigtop.manager.common.constants.Constants.PERMISSION_75
 @NoArgsConstructor(access = AccessLevel.PRIVATE)
 public class TezSetup {
 
-    public static ShellResult config(Params params) {
+    public static ShellResult configure(Params params) {
+        log.info("Configuring Tez");
         TezParams tezParams = (TezParams) params;
 
         String confDir = tezParams.confDir();
-        String hdfsUser = LocalSettings.users().get("hdfs");
+        String serviceHome = tezParams.serviceHome();
+        String libDir = serviceHome + "/lib";
+        String hadoopUser = LocalSettings.users().get("hadoop");
         String tezUser = tezParams.user();
         String tezGroup = tezParams.group();
 
-        // tez-site
-        log.info("Generating [{}/tez-site.xml] file", confDir);
+        LinuxFileUtils.createDirectories(serviceHome, tezUser, tezGroup, 
Constants.PERMISSION_755, true);
+        LinuxFileUtils.createDirectories(confDir, tezUser, tezGroup, 
Constants.PERMISSION_755, true);
+        LinuxFileUtils.createDirectories(libDir, tezUser, tezGroup, 
Constants.PERMISSION_755, true);
+
+        List<PackageInfo> packages = params.packages();
+        for (PackageInfo packageInfo : packages) {
+            String source = tezParams.stackHome() + "/" + 
packageInfo.getName();
+            String dest = libDir + "/tez.tar.gz";
+            LinuxFileUtils.copyFile(source, dest);
+            LinuxFileUtils.updateOwner(dest, tezUser, tezGroup, false);
+        }
+
         LinuxFileUtils.toFile(
                 ConfigType.XML,
                 MessageFormat.format("{0}/tez-site.xml", confDir),
@@ -57,8 +71,6 @@ public class TezSetup {
                 tezParams.tezSite(),
                 tezParams.getGlobalParamsMap());
 
-        // tez-env
-        log.info("Generating [{}/tez-env.sh] file", confDir);
         LinuxFileUtils.toFileByTemplate(
                 tezParams.getTezEnvContent(),
                 MessageFormat.format("{0}/tez-env.sh", confDir),
@@ -67,10 +79,10 @@ public class TezSetup {
                 PERMISSION_755,
                 tezParams.getGlobalParamsMap());
 
-        HdfsUtil.createDirectory(hdfsUser, "/apps");
-        HdfsUtil.uploadFile(tezUser, tezParams.serviceHome() + 
"/lib/tez.tar.gz", "/apps/tez");
+        //        HdfsUtil.createDirectory(hadoopUser, "/apps");
+        //        HdfsUtil.uploadFile(tezUser, tezParams.serviceHome() + 
"/lib/tez.tar.gz", "/apps/tez");
 
         log.info("Successfully configured Tez");
-        return ShellResult.success("Tez Configure success!");
+        return ShellResult.success();
     }
 }
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/TarballDownloader.java
index 18827917..b0ca3d53 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/TarballDownloader.java
@@ -18,6 +18,9 @@
  */
 package org.apache.bigtop.manager.stack.core.tarball;
 
+import org.apache.bigtop.manager.common.message.entity.pojo.PackageInfo;
+import org.apache.bigtop.manager.stack.core.exception.StackException;
+
 import lombok.extern.slf4j.Slf4j;
 
 import java.io.File;
@@ -30,7 +33,55 @@ import java.net.URL;
 public class TarballDownloader {
 
     @SuppressWarnings("ResultOfMethodCallIgnored")
-    public static Boolean downloadFile(String fileUrl, String saveDir) {
+    public static void download(String remoteUrl, String saveDir, PackageInfo 
packageInfo) {
+        File localFile = new File(saveDir + File.separator + 
packageInfo.getName());
+        String algorithm = packageInfo.getChecksum().split(":")[0];
+        String checksum = packageInfo.getChecksum().split(":")[1];
+
+        if (localFile.exists()) {
+            log.info("File [{}] exists, validating checksum", 
localFile.getAbsolutePath());
+        } else {
+            log.info("Downloading [{}] to [{}]", remoteUrl, saveDir);
+            download(remoteUrl, saveDir);
+        }
+
+        boolean validateChecksum = 
ChecksumValidator.validateChecksum(algorithm, checksum, localFile);
+        if (!validateChecksum) {
+            log.warn("Invalid checksum for [{}], re-downloading...", 
localFile.getAbsolutePath());
+            localFile.delete();
+            download(remoteUrl, saveDir);
+        }
+
+        validateChecksum = ChecksumValidator.validateChecksum(algorithm, 
checksum, localFile);
+        if (!validateChecksum) {
+            log.error("Invalid checksum for [{}], exiting...", 
localFile.getAbsolutePath());
+            throw new StackException("Invalid checksum for " + 
localFile.getAbsolutePath());
+        }
+
+        log.info("Checksum validate successfully for [{}]", 
localFile.getAbsolutePath());
+    }
+
+    private static void download(String remoteUrl, String saveDir) {
+        int i = 1;
+        while (true) {
+            Boolean downloaded = downloadFile(remoteUrl, saveDir);
+            if (downloaded) {
+                break;
+            } else {
+                if (i == 3) {
+                    log.error("Failed to download [{}], exiting...", 
remoteUrl);
+                    throw new StackException("Failed to download " + 
remoteUrl);
+                } else {
+                    log.error("Failed to download [{}], retrying...: {}", 
remoteUrl, i);
+                }
+            }
+
+            i++;
+        }
+    }
+
+    @SuppressWarnings("ResultOfMethodCallIgnored")
+    private static Boolean downloadFile(String fileUrl, String saveDir) {
         HttpURLConnection httpConn = null;
         try {
             URL url = new URL(fileUrl);
diff --git 
a/bigtop-manager-stack/bigtop-manager-stack-core/src/main/java/org/apache/bigtop/manager/stack/core/tarball/TarballExtractor.java
 
b/bigtop-manager-stack/bigtop-manager-stack-core/src/main/java/org/apache/bigtop/manager/stack/core/tarball/TarballExtractor.java
index ef3c9f7a..f0d99c50 100644
--- 
a/bigtop-manager-stack/bigtop-manager-stack-core/src/main/java/org/apache/bigtop/manager/stack/core/tarball/TarballExtractor.java
+++ 
b/bigtop-manager-stack/bigtop-manager-stack-core/src/main/java/org/apache/bigtop/manager/stack/core/tarball/TarballExtractor.java
@@ -126,7 +126,7 @@ public class TarballExtractor {
     }
 
     private static boolean isTarGz(String filePath) {
-        return filePath.endsWith(".tar.gz");
+        return filePath.endsWith(".tar.gz") || filePath.endsWith(".tgz");
     }
 
     private static boolean isTar(String filePath) {
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 6d231356..bf8258b5 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,8 +19,6 @@
 package org.apache.bigtop.manager.stack.core.utils;
 
 import org.apache.bigtop.manager.common.message.entity.pojo.PackageInfo;
-import org.apache.bigtop.manager.stack.core.exception.StackException;
-import org.apache.bigtop.manager.stack.core.tarball.ChecksumValidator;
 import org.apache.bigtop.manager.stack.core.tarball.TarballDownloader;
 import org.apache.bigtop.manager.stack.core.tarball.TarballExtractor;
 
@@ -33,7 +31,6 @@ import java.nio.file.Path;
 @Slf4j
 public class TarballUtils {
 
-    @SuppressWarnings("ResultOfMethodCallIgnored")
     public static void installPackage(
             String repoUrl, String stackHome, String serviceHome, PackageInfo 
packageInfo, Integer skipLevels) {
         if (Files.exists(Path.of(serviceHome))) {
@@ -43,51 +40,10 @@ public class TarballUtils {
 
         String remoteUrl = repoUrl + File.separator + packageInfo.getName();
         File localFile = new File(stackHome + File.separator + 
packageInfo.getName());
-        String algorithm = packageInfo.getChecksum().split(":")[0];
-        String checksum = packageInfo.getChecksum().split(":")[1];
+        TarballDownloader.download(remoteUrl, stackHome, packageInfo);
 
-        if (localFile.exists()) {
-            log.info("File [{}] exists, validating checksum", 
localFile.getAbsolutePath());
-        } else {
-            log.info("Downloading [{}] to [{}]", remoteUrl, stackHome);
-            downloadPackage(remoteUrl, stackHome);
-        }
-
-        boolean validateChecksum = 
ChecksumValidator.validateChecksum(algorithm, checksum, localFile);
-        if (!validateChecksum) {
-            log.warn("Invalid checksum for [{}], re-downloading...", 
localFile.getAbsolutePath());
-            localFile.delete();
-            downloadPackage(remoteUrl, stackHome);
-        }
-
-        validateChecksum = ChecksumValidator.validateChecksum(algorithm, 
checksum, localFile);
-        if (!validateChecksum) {
-            log.error("Invalid checksum for [{}], exiting...", 
localFile.getAbsolutePath());
-            throw new StackException("Invalid checksum for " + 
localFile.getAbsolutePath());
-        }
-
-        log.info("Checksum validate successfully for [{}]", 
localFile.getAbsolutePath());
         log.info("Extracting [{}] to [{}]", localFile.getAbsolutePath(), 
serviceHome);
         TarballExtractor.extractTarball(localFile.getAbsolutePath(), 
serviceHome, skipLevels);
         log.info("File [{}] successfully extracted to [{}]", 
localFile.getAbsolutePath(), serviceHome);
     }
-
-    private static void downloadPackage(String remoteUrl, String saveDir) {
-        int i = 1;
-        while (true) {
-            Boolean downloaded = TarballDownloader.downloadFile(remoteUrl, 
saveDir);
-            if (downloaded) {
-                break;
-            } else {
-                if (i == 3) {
-                    log.error("Failed to download [{}], exiting...", 
remoteUrl);
-                    throw new StackException("Failed to download " + 
remoteUrl);
-                } else {
-                    log.error("Failed to download [{}], retrying...: {}", 
remoteUrl, i);
-                }
-            }
-
-            i++;
-        }
-    }
 }
diff --git 
a/bigtop-manager-stack/bigtop-manager-stack-core/src/main/java/org/apache/bigtop/manager/stack/core/utils/linux/LinuxFileUtils.java
 
b/bigtop-manager-stack/bigtop-manager-stack-core/src/main/java/org/apache/bigtop/manager/stack/core/utils/linux/LinuxFileUtils.java
index 623862f2..50858db8 100644
--- 
a/bigtop-manager-stack/bigtop-manager-stack-core/src/main/java/org/apache/bigtop/manager/stack/core/utils/linux/LinuxFileUtils.java
+++ 
b/bigtop-manager-stack/bigtop-manager-stack-core/src/main/java/org/apache/bigtop/manager/stack/core/utils/linux/LinuxFileUtils.java
@@ -208,6 +208,31 @@ public class LinuxFileUtils {
         }
     }
 
+    public static void copyFile(String source, String dest) {
+        if (StringUtils.isBlank(source) || StringUtils.isBlank(dest)) {
+            log.error("source and dest must not be empty");
+            return;
+        }
+
+        List<String> builderParameters = new ArrayList<>();
+        builderParameters.add("cp");
+        if (Files.exists(Path.of(source)) && 
Files.isDirectory(Paths.get(source))) {
+            builderParameters.add("-r");
+        }
+
+        builderParameters.add(source);
+        builderParameters.add(dest);
+
+        try {
+            ShellResult shellResult = sudoExecCmd(builderParameters);
+            if (shellResult.getExitCode() != MessageConstants.SUCCESS_CODE) {
+                throw new StackException(shellResult.getErrMsg());
+            }
+        } catch (IOException e) {
+            throw new StackException(e);
+        }
+    }
+
     public static void moveFile(String source, String dest) {
         if (StringUtils.isBlank(source) || StringUtils.isBlank(dest)) {
             log.error("source and dest must not be empty");

Reply via email to