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

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


The following commit(s) were added to refs/heads/master by this push:
     new 3ae27abb3f [INLONG-9802][Agent] Add an agent installer module for 
agent installation (#9803)
3ae27abb3f is described below

commit 3ae27abb3f5d739ed3b34eed8fb79d79049e81c8
Author: justinwwhuang <hww_jus...@163.com>
AuthorDate: Wed Mar 13 14:37:58 2024 +0800

    [INLONG-9802][Agent] Add an agent installer module for agent installation 
(#9803)
    
    Co-authored-by: Charles Zhang <dockerzh...@apache.org>
    Co-authored-by: AloysZhang <lofterzh...@gmail.com>
---
 .../inlong/agent/conf/AbstractConfiguration.java   |   2 +-
 .../inlong/agent/constant/FetcherConstants.java    |  20 +---
 inlong-agent/{ => agent-installer}/pom.xml         |  31 ++---
 .../org/apache/inlong/agent/installer/Main.java    | 127 +++++++++++++++++++++
 .../org/apache/inlong/agent/installer/Manager.java | 103 +++++++++++++++++
 .../installer/conf/InstallerConfiguration.java     |  67 +++++++++++
 inlong-agent/pom.xml                               |   1 +
 7 files changed, 318 insertions(+), 33 deletions(-)

diff --git 
a/inlong-agent/agent-common/src/main/java/org/apache/inlong/agent/conf/AbstractConfiguration.java
 
b/inlong-agent/agent-common/src/main/java/org/apache/inlong/agent/conf/AbstractConfiguration.java
index ec7fcf1151..f323386bfd 100644
--- 
a/inlong-agent/agent-common/src/main/java/org/apache/inlong/agent/conf/AbstractConfiguration.java
+++ 
b/inlong-agent/agent-common/src/main/java/org/apache/inlong/agent/conf/AbstractConfiguration.java
@@ -116,7 +116,7 @@ public abstract class AbstractConfiguration {
         loadResource(fileName, true);
     }
 
-    void loadPropertiesResource(String fileName) {
+    public void loadPropertiesResource(String fileName) {
         loadResource(fileName, false);
     }
 
diff --git 
a/inlong-agent/agent-common/src/main/java/org/apache/inlong/agent/constant/FetcherConstants.java
 
b/inlong-agent/agent-common/src/main/java/org/apache/inlong/agent/constant/FetcherConstants.java
index 2214db1fbb..8540676d39 100644
--- 
a/inlong-agent/agent-common/src/main/java/org/apache/inlong/agent/constant/FetcherConstants.java
+++ 
b/inlong-agent/agent-common/src/main/java/org/apache/inlong/agent/constant/FetcherConstants.java
@@ -31,16 +31,9 @@ public class FetcherConstants {
     // default is 30s
     public static final int DEFAULT_AGENT_MANAGER_REQUEST_TIMEOUT = 30;
 
-    // enable https
-    public static final String ENABLE_HTTPS = "enable.https";
-    public static final boolean DEFAULT_ENABLE_HTTPS = false;
-
     // required config
     public static final String AGENT_MANAGER_ADDR = "agent.manager.addr";
 
-    public static final String AGENT_MANAGER_VIP_HTTP_PATH = 
"agent.manager.vip.http.managerIp.path";
-    public static final String DEFAULT_AGENT_TDM_VIP_HTTP_PATH = 
"/agent/getManagerIpList";
-
     public static final String AGENT_MANAGER_VIP_HTTP_PREFIX_PATH = 
"agent.manager.vip.http.prefix.path";
     public static final String DEFAULT_AGENT_MANAGER_VIP_HTTP_PREFIX_PATH = 
"/inlong/manager/openapi";
 
@@ -48,16 +41,7 @@ public class FetcherConstants {
     public static final String DEFAULT_AGENT_MANAGER_TASK_HTTP_PATH = 
"/agent/reportAndGetTask";
     public static final String DEFAULT_AGENT_MANAGER_CONFIG_HTTP_PATH = 
"/agent/getExistTaskConfig";
 
-    public static final String AGENT_MANAGER_IP_CHECK_HTTP_PATH = 
"agent.manager.vip.http.checkIP.path";
-    public static final String DEFAULT_AGENT_TDM_IP_CHECK_HTTP_PATH = 
"/fileAgent/confirmAgentIp";
-
-    public static final String AGENT_MANAGER_DBCOLLECT_GETTASK_HTTP_PATH = 
"agent.manager.dbcollect.gettask.http.path";
-    public static final String 
DEFAULT_AGENT_MANAGER_DBCOLLECTOR_GETTASK_HTTP_PATH = "/dbCollector/getTask";
-
-    public static final String AGENT_MANAGER_REPORTSNAPSHOT_HTTP_PATH = 
"agent.manager.reportsnapshot.http.path";
-    public static final String DEFAULT_AGENT_MANAGER_REPORTSNAPSHOT_HTTP_PATH 
= "/agent/reportSnapshot";
-
-    public static final String AGENT_MANAGER_HEARTBEAT_HTTP_PATH = 
"agent.manager.heartbeat.http.path";
+    public static final String AGENT_MANAGER_HEARTBEAT_HTTP_PATH = 
"heartbeat.http.path";
     public static final String DEFAULT_AGENT_MANAGER_HEARTBEAT_HTTP_PATH = 
"/heartbeat/report";
 
     public static final String AGENT_HTTP_APPLICATION_JSON = 
"application/json";
@@ -67,8 +51,6 @@ public class FetcherConstants {
     public static final String AGENT_MANAGER_RETURN_PARAM_IP = "ip";
     public static final String AGENT_MANAGER_RETURN_PARAM_DATA = "data";
 
-    public static final String VERSION = "1.0";
-
     public static final String AGENT_MANAGER_AUTH_SECRET_ID = 
"agent.manager.auth.secretId";
     public static final String AGENT_MANAGER_AUTH_SECRET_KEY = 
"agent.manager.auth.secretKey";
 
diff --git a/inlong-agent/pom.xml b/inlong-agent/agent-installer/pom.xml
similarity index 64%
copy from inlong-agent/pom.xml
copy to inlong-agent/agent-installer/pom.xml
index b3658102e3..fc7b4191a0 100644
--- a/inlong-agent/pom.xml
+++ b/inlong-agent/agent-installer/pom.xml
@@ -22,24 +22,29 @@
     <modelVersion>4.0.0</modelVersion>
     <parent>
         <groupId>org.apache.inlong</groupId>
-        <artifactId>inlong</artifactId>
+        <artifactId>inlong-agent</artifactId>
         <version>1.12.0-SNAPSHOT</version>
     </parent>
 
-    <artifactId>inlong-agent</artifactId>
-    <packaging>pom</packaging>
-    <name>Apache InLong - Agent</name>
-
-    <modules>
-        <module>agent-common</module>
-        <module>agent-core</module>
-        <module>agent-plugins</module>
-        <module>agent-release</module>
-        <module>agent-docker</module>
-    </modules>
+    <artifactId>agent-installer</artifactId>
+    <name>Apache InLong - Agent Installer</name>
 
     <properties>
-        <inlong.root.dir>${project.parent.basedir}</inlong.root.dir>
+        <inlong.root.dir>${project.parent.parent.basedir}</inlong.root.dir>
     </properties>
 
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.inlong</groupId>
+            <artifactId>agent-common</artifactId>
+            <version>${project.version}</version>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.inlong</groupId>
+            <artifactId>agent-core</artifactId>
+            <version>${project.version}</version>
+            <scope>compile</scope>
+        </dependency>
+    </dependencies>
 </project>
diff --git 
a/inlong-agent/agent-installer/src/main/java/org/apache/inlong/agent/installer/Main.java
 
b/inlong-agent/agent-installer/src/main/java/org/apache/inlong/agent/installer/Main.java
new file mode 100644
index 0000000000..f03739b3d3
--- /dev/null
+++ 
b/inlong-agent/agent-installer/src/main/java/org/apache/inlong/agent/installer/Main.java
@@ -0,0 +1,127 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * 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 "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.inlong.agent.installer;
+
+import org.apache.inlong.agent.installer.conf.InstallerConfiguration;
+import org.apache.inlong.agent.metrics.audit.AuditUtils;
+import org.apache.inlong.common.metric.MetricObserver;
+
+import org.apache.commons.cli.CommandLine;
+import org.apache.commons.cli.CommandLineParser;
+import org.apache.commons.cli.DefaultParser;
+import org.apache.commons.cli.HelpFormatter;
+import org.apache.commons.cli.Option;
+import org.apache.commons.cli.Options;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Iterator;
+
+/**
+ * Agent installer entrance class
+ */
+public class Main {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(Main.class);
+
+    /**
+     * Print help information
+     *
+     * @param opts options
+     */
+    private static void help(Options opts) {
+        HelpFormatter formatter = new HelpFormatter();
+        formatter.printHelp("inlong-agent", opts);
+        System.exit(0);
+    }
+
+    /**
+     * Init options
+     *
+     * @param args argument
+     * @return command line
+     */
+    public static CommandLine initOptions(String[] args) {
+        CommandLineParser parser = new DefaultParser();
+        Options options = new Options();
+        options.addOption("h", "help", false, "show help");
+        try {
+            return parser.parse(options, args);
+        } catch (Exception ex) {
+            help(options);
+        }
+        return null;
+    }
+
+    /**
+     * Init agent conf
+     *
+     * @param cl commandline
+     */
+    public static void initAgentConf(CommandLine cl) {
+        InstallerConfiguration conf = 
InstallerConfiguration.getInstallerConf();
+        Iterator<Option> iterator = cl.iterator();
+        while (iterator != null && iterator.hasNext()) {
+            Option opt = iterator.next();
+            if (opt != null && opt.getLongOpt() != null
+                    && opt.getValue() != null && 
conf.hasKey(opt.getLongOpt())) {
+                conf.set(opt.getLongOpt(), opt.getValue().trim());
+            }
+        }
+    }
+
+    /**
+     * Stopping installer manager gracefully if it was killed.
+     *
+     * @param manager installer manager
+     */
+    private static void stopInstallerIfKilled(Manager manager) {
+        Runtime.getRuntime().addShutdownHook(new Thread(() -> {
+            try {
+                LOGGER.info("stopping installer gracefully");
+                manager.stop();
+                AuditUtils.send();
+            } catch (Exception ex) {
+                LOGGER.error("stop installer manager error: ", ex);
+            }
+        }));
+    }
+
+    /**
+     * Main entrance.
+     */
+    public static void main(String[] args) throws Exception {
+        Thread.currentThread().setName("main-thread");
+        CommandLine cl = initOptions(args);
+        assert cl != null;
+        initAgentConf(cl);
+        AuditUtils.initAudit();
+        Manager manager = new Manager();
+        try {
+            manager.start();
+            stopInstallerIfKilled(manager);
+            // metrics
+            
MetricObserver.init(InstallerConfiguration.getInstallerConf().getConfigProperties());
+            manager.join();
+        } catch (Exception ex) {
+            LOGGER.error("installer running exception: ", ex);
+        } finally {
+            manager.stop();
+        }
+    }
+}
diff --git 
a/inlong-agent/agent-installer/src/main/java/org/apache/inlong/agent/installer/Manager.java
 
b/inlong-agent/agent-installer/src/main/java/org/apache/inlong/agent/installer/Manager.java
new file mode 100755
index 0000000000..973e0bdd57
--- /dev/null
+++ 
b/inlong-agent/agent-installer/src/main/java/org/apache/inlong/agent/installer/Manager.java
@@ -0,0 +1,103 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * 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 "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.inlong.agent.installer;
+
+import org.apache.inlong.agent.common.AbstractDaemon;
+import org.apache.inlong.agent.conf.ProfileFetcher;
+import org.apache.inlong.agent.constant.AgentConstants;
+import org.apache.inlong.agent.core.task.TaskManager;
+import org.apache.inlong.agent.installer.conf.InstallerConfiguration;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.lang.reflect.Constructor;
+
+/**
+ * Installer Manager, the bridge for job manager, task manager, db e.t.c it 
manages agent level operations and
+ * communicates with outside system.
+ */
+public class Manager extends AbstractDaemon {
+
+    private static final Logger LOGGER = 
LoggerFactory.getLogger(Manager.class);
+    private final TaskManager taskManager;
+    private final ProfileFetcher fetcher;
+    private final InstallerConfiguration conf;
+
+    public Manager() {
+        conf = InstallerConfiguration.getInstallerConf();
+        taskManager = new TaskManager();
+        fetcher = initFetcher(this);
+    }
+
+    /**
+     * Init fetch by class name
+     */
+    private ProfileFetcher initFetcher(Manager manager) {
+        try {
+            Constructor<?> constructor =
+                    
Class.forName(conf.get(AgentConstants.AGENT_FETCHER_CLASSNAME))
+                            .getDeclaredConstructor(Manager.class);
+            constructor.setAccessible(true);
+            return (ProfileFetcher) constructor.newInstance(manager);
+        } catch (Exception ex) {
+            LOGGER.warn("cannot find fetcher: ", ex);
+        }
+        return null;
+    }
+
+    public ProfileFetcher getFetcher() {
+        return fetcher;
+    }
+
+    public TaskManager getTaskManager() {
+        return taskManager;
+    }
+
+    @Override
+    public void join() {
+        super.join();
+        taskManager.join();
+    }
+
+    @Override
+    public void start() throws Exception {
+        LOGGER.info("starting installer manager");
+        taskManager.start();
+        LOGGER.info("starting fetcher");
+        if (fetcher != null) {
+            fetcher.start();
+        }
+        LOGGER.info("starting agent manager end");
+    }
+
+    /**
+     * It should guarantee thread-safe, and can be invoked many times.
+     *
+     * @throws Exception exceptions
+     */
+    @Override
+    public void stop() throws Exception {
+        if (fetcher != null) {
+            fetcher.stop();
+        }
+        // TODO: change job state which is in running state.
+        LOGGER.info("stopping installer manager");
+        taskManager.stop();
+    }
+}
diff --git 
a/inlong-agent/agent-installer/src/main/java/org/apache/inlong/agent/installer/conf/InstallerConfiguration.java
 
b/inlong-agent/agent-installer/src/main/java/org/apache/inlong/agent/installer/conf/InstallerConfiguration.java
new file mode 100644
index 0000000000..a9b3fa9bf8
--- /dev/null
+++ 
b/inlong-agent/agent-installer/src/main/java/org/apache/inlong/agent/installer/conf/InstallerConfiguration.java
@@ -0,0 +1,67 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * 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 "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.inlong.agent.installer.conf;
+
+import org.apache.inlong.agent.conf.AbstractConfiguration;
+
+import java.util.ArrayList;
+
+/**
+ * Installer configuration. Only one instance in the process.
+ * Basically it use properties file to store configurations.
+ */
+public class InstallerConfiguration extends AbstractConfiguration {
+
+    public static final String DEFAULT_CONFIG_FILE = "installer.properties";
+    private static final ArrayList<String> LOCAL_RESOURCES = new ArrayList<>();
+    private static volatile InstallerConfiguration installerConf = null;
+
+    static {
+        LOCAL_RESOURCES.add(DEFAULT_CONFIG_FILE);
+    }
+
+    /**
+     * Load config from file.
+     */
+    private InstallerConfiguration() {
+        for (String fileName : LOCAL_RESOURCES) {
+            super.loadPropertiesResource(fileName);
+        }
+    }
+
+    /**
+     * Singleton for agent configuration.
+     *
+     * @return static instance of InstallerConfiguration
+     */
+    public static InstallerConfiguration getInstallerConf() {
+        if (installerConf == null) {
+            synchronized (InstallerConfiguration.class) {
+                if (installerConf == null) {
+                    installerConf = new InstallerConfiguration();
+                }
+            }
+        }
+        return installerConf;
+    }
+
+    @Override
+    public boolean allRequiredKeyExist() {
+        return true;
+    }
+}
diff --git a/inlong-agent/pom.xml b/inlong-agent/pom.xml
index b3658102e3..5ea1957b85 100644
--- a/inlong-agent/pom.xml
+++ b/inlong-agent/pom.xml
@@ -34,6 +34,7 @@
         <module>agent-common</module>
         <module>agent-core</module>
         <module>agent-plugins</module>
+        <module>agent-installer</module>
         <module>agent-release</module>
         <module>agent-docker</module>
     </modules>

Reply via email to