This is an automated email from the ASF dual-hosted git repository.
arshad pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/seatunnel-web.git
The following commit(s) were added to refs/heads/main by this push:
new f410d8d9 [Feature] Add Seatunnel Ambari MPack Support (#290)
f410d8d9 is described below
commit f410d8d92d7fd9293452b9f7867d7882322dc997
Author: Mohammad Arshad <[email protected]>
AuthorDate: Mon Apr 28 09:30:03 2025 +0530
[Feature] Add Seatunnel Ambari MPack Support (#290)
---
pom.xml | 1 +
seatunnel-mpack/README.md | 39 +++
seatunnel-mpack/pom.xml | 55 ++++
.../src/main/assemblies/seatunnel-mpack.xml | 55 ++++
.../2.3.8/configuration/ranger-seatunnel-audit.xml | 133 +++++++++
.../ranger-seatunnel-plugin-properties.xml | 134 +++++++++
.../ranger-seatunnel-policymgr-ssl.xml | 72 +++++
.../configuration/ranger-seatunnel-security.xml | 64 ++++
.../2.3.8/configuration/seatunnel-common.xml | 51 ++++
.../2.3.8/configuration/seatunnel-hazelcast.xml | 44 +++
.../configuration/seatunnel-web-application.xml | 217 ++++++++++++++
.../SEATUNNEL/2.3.8/configuration/seatunnel.xml | 105 +++++++
.../addon-services/SEATUNNEL/2.3.8/metainfo.xml | 111 +++++++
.../2.3.8/package/scripts/config_seatunnel.py | 89 ++++++
.../2.3.8/package/scripts/config_seatunnel_web.py | 55 ++++
.../SEATUNNEL/2.3.8/package/scripts/params.py | 327 +++++++++++++++++++++
.../SEATUNNEL/2.3.8/package/scripts/seatunnel.py | 66 +++++
.../2.3.8/package/scripts/seatunnel_web.py | 69 +++++
.../2.3.8/package/scripts/service_check.py | 52 ++++
.../package/scripts/setup_ranger_seatunnel.py | 80 +++++
.../SEATUNNEL/2.3.8/properties/application.yaml | 87 ++++++
.../2.3.8/properties/hazelcast-client.yaml | 28 ++
.../SEATUNNEL/2.3.8/properties/hazelcast.yaml | 48 +++
.../SEATUNNEL/2.3.8/properties/jvm_client_options | 24 ++
.../SEATUNNEL/2.3.8/properties/jvm_options | 30 ++
.../SEATUNNEL/2.3.8/properties/log4j2.properties | 103 +++++++
.../2.3.8/properties/log4j2_client.properties | 81 +++++
.../SEATUNNEL/2.3.8/properties/logback-spring.xml | 47 +++
.../SEATUNNEL/2.3.8/properties/seatunnel-env.sh | 27 ++
.../2.3.8/properties/seatunnel-web-env.sh | 37 +++
.../SEATUNNEL/2.3.8/properties/seatunnel.yaml | 39 +++
.../SEATUNNEL/2.3.8/quicklinks/quicklinks.json | 49 +++
.../SEATUNNEL/2.3.8/role_command_order.json | 11 +
.../extensions/SEATUNNEL/2.3.8/metainfo.xml | 23 ++
seatunnel-mpack/src/main/resources/mpack.json | 37 +++
35 files changed, 2490 insertions(+)
diff --git a/pom.xml b/pom.xml
index e62d4f9b..ce4ce9fd 100644
--- a/pom.xml
+++ b/pom.xml
@@ -38,6 +38,7 @@
<module>seatunnel-datasource</module>
<module>seatunnel-web-dist</module>
<module>seatunnel-web-it</module>
+ <module>seatunnel-mpack</module>
</modules>
<properties>
diff --git a/seatunnel-mpack/README.md b/seatunnel-mpack/README.md
new file mode 100644
index 00000000..33a0814a
--- /dev/null
+++ b/seatunnel-mpack/README.md
@@ -0,0 +1,39 @@
+## Seaatunnel Ambari MPack Installation Guide
+
+**Note:** Replace `versions`, `paths`, and `urls` with values applicable to
your environment.
+### Stop the Ambari server:
+```bash
+ambari-server stop
+```
+### Uninstall MPack, if already installed
+```bash
+ambari-server uninstall-mpack --mpack-name seatunnel-mpack --verbose
+```
+### Install the Seatunnel MPack on Ambari Server:
+Execute the following command to install the Seatunnel MPack on the Ambari
server.
+
+```bash
+ambari-server install-mpack --mpack=${mpack_url} --verbose
+# Example:
+ambari-server install-mpack
--mpack=http://localhost:8080/myrepo/mpack-mpack-2.3.8.tar.gz --verbose
+
+# Specify the local path to the MPack tarball if it is available on your
system:
+# Example:
+ambari-server install-mpack
--mpack=/some/path/mpack-mpack-${mpack_version}.tar.gz --verbose
+```
+
+### Install Seatunnel MPack on Ambari agents:
+Ambari server does not automatically copy the MPack to all agents. Manually
copy the MPack to all agents.
+Commands for reference:
+```bash
+# From Ambari server machine:
+stack-version=3.3.0
+cp -r
/var/lib/ambari-server/resources/stacks/BIGTOP/${stack-version}/services/SEATUNNEL
/var/lib/ambari-agent/cache/stacks/BIGTOP/${stack-version}/services/
+scp -r
/var/lib/ambari-server/resources/stacks/BIGTOP/${stack-version}/services/SEATUNNEL
username@agent_host2:/var/lib/ambari-agent/cache/stacks/BIGTOP/${stack-version}/services/
+scp -r
/var/lib/ambari-server/resources/stacks/BIGTOP/${stack-version}/services/SEATUNNEL
username@agent_host3:/var/lib/ambari-agent/cache/stacks/BIGTOP/${stack-version}/services/
+```
+
+### Start the Ambari server:
+```bash
+ambari-server start
+```
\ No newline at end of file
diff --git a/seatunnel-mpack/pom.xml b/seatunnel-mpack/pom.xml
new file mode 100644
index 00000000..14cdc873
--- /dev/null
+++ b/seatunnel-mpack/pom.xml
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ 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.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.apache.seatunnel</groupId>
+ <artifactId>seatunnel-web</artifactId>
+ <version>${revision}</version>
+ </parent>
+
+ <artifactId>seatunnel-mpack</artifactId>
+ <packaging>pom</packaging>
+ <name>SeaTunnel Ambari MPack</name>
+
+ <build>
+ <plugins>
+ <plugin>
+ <artifactId>maven-assembly-plugin</artifactId>
+ <configuration>
+ <finalName>seatunnel-mpack-${project.version}</finalName>
+ <appendAssemblyId>false</appendAssemblyId>
+ <descriptors>
+
<descriptor>src/main/assemblies/seatunnel-mpack.xml</descriptor>
+ </descriptors>
+ </configuration>
+ <executions>
+ <execution>
+ <id>build-tarball</id>
+ <goals>
+ <goal>single</goal>
+ </goals>
+ <phase>package</phase>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+
+</project>
diff --git a/seatunnel-mpack/src/main/assemblies/seatunnel-mpack.xml
b/seatunnel-mpack/src/main/assemblies/seatunnel-mpack.xml
new file mode 100644
index 00000000..d3108678
--- /dev/null
+++ b/seatunnel-mpack/src/main/assemblies/seatunnel-mpack.xml
@@ -0,0 +1,55 @@
+<!--
+ 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.
+-->
+<assembly xmlns="http://maven.apache.org/ASSEMBLY/2.1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.1.0
http://maven.apache.org/xsd/assembly-2.1.0.xsd">
+ <id>archive</id>
+ <formats>
+ <format>tar.gz</format>
+ </formats>
+ <includeBaseDirectory>true</includeBaseDirectory>
+ <fileSets>
+ <fileSet>
+ <directory>src/main/resources/addon-services</directory>
+ <outputDirectory>addon-services</outputDirectory>
+ <includes>
+ <include>**</include>
+ </includes>
+ </fileSet>
+ <fileSet>
+ <directory>src/main/resources/extensions</directory>
+ <outputDirectory>extensions</outputDirectory>
+ <includes>
+ <include>**</include>
+ </includes>
+ </fileSet>
+ <fileSet>
+ <directory>src/main/resources/extensions</directory>
+ <outputDirectory>extensions</outputDirectory>
+ <includes>
+ <include>**</include>
+ </includes>
+ </fileSet>
+ <fileSet>
+ <directory>src/main/resources</directory>
+ <outputDirectory>.</outputDirectory>
+ <includes>
+ <include>mpack.json</include>
+ </includes>
+ </fileSet>
+ </fileSets>
+</assembly>
diff --git
a/seatunnel-mpack/src/main/resources/addon-services/SEATUNNEL/2.3.8/configuration/ranger-seatunnel-audit.xml
b/seatunnel-mpack/src/main/resources/addon-services/SEATUNNEL/2.3.8/configuration/ranger-seatunnel-audit.xml
new file mode 100755
index 00000000..9193407b
--- /dev/null
+++
b/seatunnel-mpack/src/main/resources/addon-services/SEATUNNEL/2.3.8/configuration/ranger-seatunnel-audit.xml
@@ -0,0 +1,133 @@
+<?xml version="1.0"?>
+<!--
+/**
+ * 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.
+ */
+-->
+<configuration>
+ <property>
+ <name>xasecure.audit.is.enabled</name>
+ <value>true</value>
+ <description>Is Audit enabled?</description>
+ <value-attributes>
+ <type>boolean</type>
+ </value-attributes>
+ <on-ambari-upgrade add="false"/>
+ </property>
+ <property>
+ <name>xasecure.audit.destination.hdfs</name>
+ <value>true</value>
+ <display-name>Audit to HDFS</display-name>
+ <description>Is Audit to HDFS enabled?</description>
+ <value-attributes>
+ <type>boolean</type>
+ </value-attributes>
+ <depends-on>
+ <property>
+ <type>ranger-env</type>
+ <name>xasecure.audit.destination.hdfs</name>
+ </property>
+ </depends-on>
+ <on-ambari-upgrade add="false"/>
+ </property>
+ <property>
+ <name>xasecure.audit.destination.hdfs.dir</name>
+ <value>hdfs://NAMENODE_HOSTNAME:8020/ranger/audit</value>
+ <description>HDFS folder to write audit to, make sure the service user has
requried permissions</description>
+ <depends-on>
+ <property>
+ <type>ranger-env</type>
+ <name>xasecure.audit.destination.hdfs.dir</name>
+ </property>
+ </depends-on>
+ <on-ambari-upgrade add="false"/>
+ </property>
+ <property>
+ <name>xasecure.audit.destination.hdfs.batch.filespool.dir</name>
+ <value>/var/log/seatunnel-web/audit/hdfs/spool</value>
+ <description>/var/log/seatunnel-web/audit/hdfs/spool</description>
+ <on-ambari-upgrade add="false"/>
+ </property>
+ <property>
+ <name>xasecure.audit.destination.solr</name>
+ <value>false</value>
+ <display-name>Audit to SOLR</display-name>
+ <description>Is Solr audit enabled?</description>
+ <value-attributes>
+ <type>boolean</type>
+ </value-attributes>
+ <depends-on>
+ <property>
+ <type>ranger-env</type>
+ <name>xasecure.audit.destination.solr</name>
+ </property>
+ </depends-on>
+ <on-ambari-upgrade add="false"/>
+ </property>
+ <property>
+ <name>xasecure.audit.destination.solr.urls</name>
+ <value/>
+ <description>Solr URL</description>
+ <value-attributes>
+ <empty-value-valid>true</empty-value-valid>
+ </value-attributes>
+ <depends-on>
+ <property>
+ <type>ranger-admin-site</type>
+ <name>ranger.audit.solr.urls</name>
+ </property>
+ </depends-on>
+ <on-ambari-upgrade add="false"/>
+ </property>
+ <property>
+ <name>xasecure.audit.destination.solr.zookeepers</name>
+ <value>NONE</value>
+ <description>Solr Zookeeper string</description>
+ <depends-on>
+ <property>
+ <type>ranger-admin-site</type>
+ <name>ranger.audit.solr.zookeepers</name>
+ </property>
+ </depends-on>
+ <on-ambari-upgrade add="false"/>
+ </property>
+ <property>
+ <name>xasecure.audit.destination.solr.batch.filespool.dir</name>
+ <value>/var/log/seatunnel-web/audit/solr/spool</value>
+ <description>/var/log/seatunnel-web/audit/solr/spool</description>
+ <on-ambari-upgrade add="false"/>
+ </property>
+ <property>
+ <name>xasecure.audit.provider.summary.enabled</name>
+ <value>false</value>
+ <display-name>Audit provider summary enabled</display-name>
+ <description>Enable Summary audit?</description>
+ <value-attributes>
+ <type>boolean</type>
+ </value-attributes>
+ <on-ambari-upgrade add="false"/>
+ </property>
+ <property>
+ <name>ranger.plugin.seatunnel.ambari.cluster.name</name>
+ <value>{{cluster_name}}</value>
+ <description>Capture cluster name from where Ranger seatunnel plugin is
enabled.</description>
+ <value-attributes>
+ <empty-value-valid>true</empty-value-valid>
+ </value-attributes>
+ <on-ambari-upgrade add="false"/>
+ </property>
+</configuration>
diff --git
a/seatunnel-mpack/src/main/resources/addon-services/SEATUNNEL/2.3.8/configuration/ranger-seatunnel-plugin-properties.xml
b/seatunnel-mpack/src/main/resources/addon-services/SEATUNNEL/2.3.8/configuration/ranger-seatunnel-plugin-properties.xml
new file mode 100755
index 00000000..e30173aa
--- /dev/null
+++
b/seatunnel-mpack/src/main/resources/addon-services/SEATUNNEL/2.3.8/configuration/ranger-seatunnel-plugin-properties.xml
@@ -0,0 +1,134 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * 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.
+ */
+-->
+<configuration supports_final="true">
+ <property>
+ <name>common.name.for.certificate</name>
+ <value/>
+ <description>Common name for certificate, this value should match what is
specified in repo within ranger admin</description>
+ <value-attributes>
+ <empty-value-valid>true</empty-value-valid>
+ </value-attributes>
+ <on-ambari-upgrade add="false"/>
+ </property>
+ <property>
+ <name>policy_user</name>
+ <value>ambari-qa</value>
+ <display-name>Policy user for SEATUNNEL</display-name>
+ <depends-on>
+ <property>
+ <type>ranger-env</type>
+ <name>ranger_user</name>
+ </property>
+ </depends-on>
+ <description>This user must be system user and also present at Ranger
admin portal</description>
+ <on-ambari-upgrade add="false"/>
+ </property>
+ <property>
+ <name>ranger-seatunnel-plugin-enabled</name>
+ <value>No</value>
+ <display-name>Enable Ranger for seatunnel</display-name>
+ <description>Enable ranger seatunnel plugin ?</description>
+ <value-attributes>
+ <type>boolean</type>
+ <overridable>false</overridable>
+ </value-attributes>
+ <depends-on>
+ <property>
+ <type>ranger-env</type>
+ <name>ranger-seatunnel-plugin-enabled</name>
+ </property>
+ </depends-on>
+ <on-ambari-upgrade add="false"/>
+ </property>
+ <property>
+ <name>REPOSITORY_CONFIG_USERNAME</name>
+ <value>admin</value>
+ <display-name>Ranger repository config user</display-name>
+ <description>Used for repository creation on ranger admin</description>
+ <depends-on>
+ <property>
+ <type>ranger-seatunnel-plugin-properties</type>
+ <name>ranger-seatunnel-plugin-enabled</name>
+ </property>
+ <property>
+ <type>seatunnel-env</type>
+ <name>seatunnel_user</name>
+ </property>
+ </depends-on>
+ <on-ambari-upgrade add="false"/>
+ </property>
+ <property>
+ <name>REPOSITORY_CONFIG_PASSWORD</name>
+ <value>seatunnel</value>
+ <display-name>Ranger repository config password</display-name>
+ <property-type>PASSWORD</property-type>
+ <description>Used for repository creation on ranger admin</description>
+ <value-attributes>
+ <type>password</type>
+ </value-attributes>
+ <on-ambari-upgrade add="false"/>
+ </property>
+
+ <property>
+ <name>external_admin_username</name>
+ <value/>
+ <display-name>External Ranger admin username</display-name>
+ <description>Add ranger default admin username if want to communicate to
external ranger</description>
+ <value-attributes>
+ <empty-value-valid>true</empty-value-valid>
+ </value-attributes>
+ <on-ambari-upgrade add="false"/>
+ </property>
+ <property>
+ <name>external_admin_password</name>
+ <value/>
+ <display-name>External Ranger admin password</display-name>
+ <property-type>PASSWORD</property-type>
+ <description>Add ranger default admin password if want to communicate to
external ranger</description>
+ <value-attributes>
+ <type>password</type>
+ <empty-value-valid>true</empty-value-valid>
+ </value-attributes>
+ <on-ambari-upgrade add="false"/>
+ </property>
+ <property>
+ <name>external_ranger_admin_username</name>
+ <value/>
+ <display-name>External Ranger Ambari admin username</display-name>
+ <description>Add ranger default ambari admin username if want to
communicate to external ranger</description>
+ <value-attributes>
+ <empty-value-valid>true</empty-value-valid>
+ </value-attributes>
+ <on-ambari-upgrade add="false"/>
+ </property>
+ <property>
+ <name>external_ranger_admin_password</name>
+ <value/>
+ <display-name>External Ranger Ambari admin password</display-name>
+ <property-type>PASSWORD</property-type>
+ <description>Add ranger default ambari admin password if want to
communicate to external ranger</description>
+ <value-attributes>
+ <type>password</type>
+ <empty-value-valid>true</empty-value-valid>
+ </value-attributes>
+ <on-ambari-upgrade add="false"/>
+ </property>
+</configuration>
diff --git
a/seatunnel-mpack/src/main/resources/addon-services/SEATUNNEL/2.3.8/configuration/ranger-seatunnel-policymgr-ssl.xml
b/seatunnel-mpack/src/main/resources/addon-services/SEATUNNEL/2.3.8/configuration/ranger-seatunnel-policymgr-ssl.xml
new file mode 100755
index 00000000..88ec4ad4
--- /dev/null
+++
b/seatunnel-mpack/src/main/resources/addon-services/SEATUNNEL/2.3.8/configuration/ranger-seatunnel-policymgr-ssl.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0"?>
+<!--
+/**
+ * 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.
+ */
+-->
+<configuration>
+ <property>
+ <name>xasecure.policymgr.clientssl.keystore</name>
+ <value/>
+ <description>Java Keystore files</description>
+ <value-attributes>
+ <empty-value-valid>true</empty-value-valid>
+ </value-attributes>
+ <on-ambari-upgrade add="false"/>
+ </property>
+ <property>
+ <name>xasecure.policymgr.clientssl.keystore.password</name>
+ <value>myKeyFilePassword</value>
+ <property-type>PASSWORD</property-type>
+ <description>password for keystore</description>
+ <value-attributes>
+ <type>password</type>
+ </value-attributes>
+ <on-ambari-upgrade add="false"/>
+ </property>
+ <property>
+ <name>xasecure.policymgr.clientssl.truststore</name>
+ <value/>
+ <description>java truststore file</description>
+ <value-attributes>
+ <empty-value-valid>true</empty-value-valid>
+ </value-attributes>
+ <on-ambari-upgrade add="false"/>
+ </property>
+ <property>
+ <name>xasecure.policymgr.clientssl.truststore.password</name>
+ <value>changeit</value>
+ <property-type>PASSWORD</property-type>
+ <description>java truststore password</description>
+ <value-attributes>
+ <type>password</type>
+ </value-attributes>
+ <on-ambari-upgrade add="false"/>
+ </property>
+ <property>
+ <name>xasecure.policymgr.clientssl.keystore.credential.file</name>
+ <value>jceks://file{{credential_file}}</value>
+ <description>java keystore credential file</description>
+ <on-ambari-upgrade add="false"/>
+ </property>
+ <property>
+ <name>xasecure.policymgr.clientssl.truststore.credential.file</name>
+ <value>jceks://file{{credential_file}}</value>
+ <description>java truststore credential file</description>
+ <on-ambari-upgrade add="false"/>
+ </property>
+</configuration>
diff --git
a/seatunnel-mpack/src/main/resources/addon-services/SEATUNNEL/2.3.8/configuration/ranger-seatunnel-security.xml
b/seatunnel-mpack/src/main/resources/addon-services/SEATUNNEL/2.3.8/configuration/ranger-seatunnel-security.xml
new file mode 100755
index 00000000..344c359a
--- /dev/null
+++
b/seatunnel-mpack/src/main/resources/addon-services/SEATUNNEL/2.3.8/configuration/ranger-seatunnel-security.xml
@@ -0,0 +1,64 @@
+<?xml version="1.0"?>
+<!--
+/**
+ * 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.
+ */
+-->
+<configuration>
+ <property>
+ <name>ranger.plugin.seatunnel.service.name</name>
+ <value>{{repo_name}}</value>
+ <description>Name of the Ranger service containing Seatunnel
policies</description>
+ <on-ambari-upgrade add="false"/>
+ </property>
+ <property>
+ <name>ranger.plugin.seatunnel.policy.source.impl</name>
+ <value>org.apache.ranger.admin.client.RangerAdminRESTClient</value>
+ <description>Class to retrieve policies from the source</description>
+ <on-ambari-upgrade add="false"/>
+ </property>
+ <property>
+ <name>ranger.plugin.seatunnel.policy.rest.url</name>
+ <value>{{policymgr_mgr_url}}</value>
+ <description>URL to Ranger Admin</description>
+ <on-ambari-upgrade add="false"/>
+ <depends-on>
+ <property>
+ <type>admin-properties</type>
+ <name>policymgr_external_url</name>
+ </property>
+ </depends-on>
+ </property>
+ <property>
+ <name>ranger.plugin.seatunnel.policy.rest.ssl.config.file</name>
+ <value>/etc/seatunnel-web/conf/ranger-policymgr-ssl.xml</value>
+ <description>Path to the file containing SSL details to contact Ranger
Admin</description>
+ <on-ambari-upgrade add="false"/>
+ </property>
+ <property>
+ <name>ranger.plugin.seatunnel.policy.pollIntervalMs</name>
+ <value>30000</value>
+ <description>How often to poll for changes in policies?</description>
+ <on-ambari-upgrade add="false"/>
+ </property>
+ <property>
+ <name>ranger.plugin.seatunnel.policy.cache.dir</name>
+ <value>/etc/ranger/{{repo_name}}/policycache</value>
+ <description>Directory where Ranger policies are cached after successful
retrieval from the source</description>
+ <on-ambari-upgrade add="false"/>
+ </property>
+</configuration>
diff --git
a/seatunnel-mpack/src/main/resources/addon-services/SEATUNNEL/2.3.8/configuration/seatunnel-common.xml
b/seatunnel-mpack/src/main/resources/addon-services/SEATUNNEL/2.3.8/configuration/seatunnel-common.xml
new file mode 100644
index 00000000..597596d6
--- /dev/null
+++
b/seatunnel-mpack/src/main/resources/addon-services/SEATUNNEL/2.3.8/configuration/seatunnel-common.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * 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.
+ */
+-->
+<configuration>
+ <property require-input="true">
+ <name>seatunnel_cluster_name</name>
+ <value>seatunnel</value>
+ <display-name>Seatunnel Cluster Name</display-name>
+ <description>The cluster-name is used to specify the name of the
cluster to which the job will be submitted
+ </description>
+ </property>
+ <property require-input="true">
+ <name>hazelcast_port</name>
+ <value>5801</value>
+ <display-name>Hazelcast Port</display-name>
+ <description>Hazelcast member interaction port</description>
+ <value-attributes>
+ <type>int</type>
+ </value-attributes>
+ </property>
+
+ <property require-input="true">
+ <name>hazelcast_client_config_content</name>
+ <display-name>Hazelcast Client Configuration</display-name>
+ <description>Hazelcast client configuration template</description>
+ <property-type>VALUE_FROM_PROPERTY_FILE</property-type>
+ <value/>
+ <value-attributes>
+ <type>content</type>
+ <property-file-name>hazelcast-client.yaml</property-file-name>
+ <property-file-type>text</property-file-type>
+ </value-attributes>
+ </property>
+</configuration>
diff --git
a/seatunnel-mpack/src/main/resources/addon-services/SEATUNNEL/2.3.8/configuration/seatunnel-hazelcast.xml
b/seatunnel-mpack/src/main/resources/addon-services/SEATUNNEL/2.3.8/configuration/seatunnel-hazelcast.xml
new file mode 100644
index 00000000..1109c13d
--- /dev/null
+++
b/seatunnel-mpack/src/main/resources/addon-services/SEATUNNEL/2.3.8/configuration/seatunnel-hazelcast.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0"?>
+<!--
+/**
+ * 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.
+ */
+-->
+<configuration>
+ <property>
+ <name>enable_rest_api</name>
+ <value>false</value>
+ <display-name>Enable Hazelcast REST API</display-name>
+ <description>Enable hazelcast REST API</description>
+ <value-attributes>
+ <type>boolean</type>
+ </value-attributes>
+ <on-ambari-upgrade add="true"/>
+ </property>
+ <property>
+ <name>hazelcast_config_content</name>
+ <display-name>Hazelcast Configuration</display-name>
+ <description>Hazelcast Configuration template</description>
+ <property-type>VALUE_FROM_PROPERTY_FILE</property-type>
+ <value/>
+ <value-attributes>
+ <type>content</type>
+ <property-file-name>hazelcast.yaml</property-file-name>
+ <property-file-type>text</property-file-type>
+ </value-attributes>
+ </property>
+</configuration>
diff --git
a/seatunnel-mpack/src/main/resources/addon-services/SEATUNNEL/2.3.8/configuration/seatunnel-web-application.xml
b/seatunnel-mpack/src/main/resources/addon-services/SEATUNNEL/2.3.8/configuration/seatunnel-web-application.xml
new file mode 100644
index 00000000..9328e828
--- /dev/null
+++
b/seatunnel-mpack/src/main/resources/addon-services/SEATUNNEL/2.3.8/configuration/seatunnel-web-application.xml
@@ -0,0 +1,217 @@
+<?xml version="1.0"?>
+<!--
+/**
+ * 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.
+ */
+-->
+<configuration>
+ <property require-input="true">
+ <name>http_port</name>
+ <value>8801</value>
+ <display-name>Seatunnel-web HTTP Port</display-name>
+ <description>Seatunnel-web http port</description>
+ <value-attributes>
+ <type>int</type>
+ </value-attributes>
+ </property>
+ <property require-input="true">
+ <name>db_driver_class</name>
+ <value>com.mysql.cj.jdbc.Driver</value>
+ <display-name>Driver Class</display-name>
+ <description>The jdbc class name used to connect to the remote data
source</description>
+ </property>
+ <property require-input="true">
+ <name>db_url</name>
+
<value>jdbc:mysql://localhost:3306/seatunnel?useSSL=false&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&allowPublicKeyRetrieval=true</value>
+ <display-name>URL</display-name>
+ <description>The URL of the JDBC connection</description>
+ </property>
+ <property require-input="true">
+ <name>db_username</name>
+ <value>seatunnel_user</value>
+ <display-name>User Name</display-name>
+ <description>Connection instance user name</description>
+ </property>
+ <property require-input="true">
+ <name>db_password</name>
+ <value>seaTunnel_1234</value>
+ <property-type>PASSWORD</property-type>
+ <display-name>Password</display-name>
+ <description>Connection instance password</description>
+ <value-attributes>
+ <overridable>false</overridable>
+ <type>password</type>
+ </value-attributes>
+ </property>
+ <property require-input="false">
+ <name>write_job_definition_to_file</name>
+ <value>true</value>
+ <display-name>Write Job Definition to File</display-name>
+ <description>Boolean property to determine if job definitions should
be written to a file for execution
+ </description>
+ <value-attributes>
+ <type>boolean</type>
+ </value-attributes>
+ </property>
+ <property require-input="true">
+ <name>datasource_encryption_type</name>
+ <value>base64</value>
+ <display-name>Datasource Encryption Type</display-name>
+ <description>The type of encryption used for the
datasource</description>
+ <value-attributes>
+ <type>string</type>
+ </value-attributes>
+ </property>
+ <property require-input="true">
+ <name>jwt_expire_time</name>
+ <value>86400</value>
+ <display-name>JWT Expire time(second)</display-name>
+ <description>JSON Web Token(JWT) expire time in seconds. Default is
86400 seconds or 24 hour</description>
+ <value-attributes>
+ <type>int</type>
+ </value-attributes>
+ </property>
+ <property require-input="true">
+ <name>jwt_secret_key</name>
+ <value>https://github.com/apache/seatunnel</value>
+ <display-name>JWT Secret Key</display-name>
+ <description>A JWT secret key is a string used to sign and verify the
authenticity of a JSON Web Token (JWT). It
+ ensures that the token has not been tampered with. The secret key
is shared between the server and the
+ client and must be kept secure.
+ </description>
+ </property>
+ <property require-input="true">
+ <name>jwt_algorithm</name>
+ <value>HS256</value>
+ <display-name>JWT Algorithm</display-name>
+ <description>The JWT algorithm specifies the cryptographic method used
to secure the JSON Web Token. The
+ algorithm ensures the integrity and authenticity of the token.
+ </description>
+ </property>
+ <property require-input="true">
+ <name>seatunnel.web.ssl.enabled</name>
+ <value>false</value>
+ <display-name>Seatunnel-web SSL Enabled</display-name>
+ <description>Boolean property to enable or disable SSL for
Seatunnel-web</description>
+ <value-attributes>
+ <type>boolean</type>
+ </value-attributes>
+ </property>
+ <property require-input="true">
+ <name>https_port</name>
+ <value>8443</value>
+ <display-name>Seatunnel-web HTTPS Port</display-name>
+ <description>Seatunnel-web https port</description>
+ <value-attributes>
+ <type>int</type>
+ </value-attributes>
+ <depends-on>
+ <property>
+ <name>seatunnel.web.ssl.enabled</name>
+ <value>true</value>
+ </property>
+ </depends-on>
+ </property>
+ <property require-input="true">
+ <name>seatunnel.web.ssl.keystore</name>
+ <value>/etc/security/serverKeys/keystore.jks</value>
+ <display-name>Seatunnel-web Keystore</display-name>
+ <description>Path to the keystore file for Seatunnel-web</description>
+ <depends-on>
+ <property>
+ <name>seatunnel.web.ssl.enabled</name>
+ <value>true</value>
+ </property>
+ </depends-on>
+ </property>
+ <property require-input="true">
+ <name>seatunnel.web.ssl.keystore.password</name>
+ <value>keystorePassword</value>
+ <property-type>PASSWORD</property-type>
+ <display-name>Seatunnel-web Keystore Password</display-name>
+ <description>Password for the keystore file</description>
+ <value-attributes>
+ <type>password</type>
+ </value-attributes>
+ <depends-on>
+ <property>
+ <name>seatunnel.web.ssl.enabled</name>
+ <value>true</value>
+ </property>
+ </depends-on>
+ </property>
+ <property require-input="true">
+ <name>seatunnel.web.ssl.keystore.type</name>
+ <value>JKS</value>
+ <display-name>Seatunnel-web Keystore Type</display-name>
+ <description>Type of the keystore (e.g., JKS, PKCS12)</description>
+ <depends-on>
+ <property>
+ <name>seatunnel.web.ssl.enabled</name>
+ <value>true</value>
+ </property>
+ </depends-on>
+ </property>
+ <property require-input="true">
+ <name>seatunnel.web.ssl.keystore.key.alias</name>
+ <value>ambari-key-alias</value>
+ <display-name>Seatunnel-web Keystore Key Alias</display-name>
+ <description>Alias for the key in the keystore</description>
+ <depends-on>
+ <property>
+ <name>seatunnel.web.ssl.enabled</name>
+ <value>true</value>
+ </property>
+ </depends-on>
+ </property>
+ <property>
+ <name>seatunnel_web_config_content</name>
+ <display-name>Seatunnel-web Configuration</display-name>
+ <description>Seatunnel-web configuration template to provide unlimited
flexibility</description>
+ <property-type>VALUE_FROM_PROPERTY_FILE</property-type>
+ <value/>
+ <value-attributes>
+ <type>content</type>
+ <property-file-name>application.yaml</property-file-name>
+ <property-file-type>text</property-file-type>
+ </value-attributes>
+ </property>
+ <property>
+ <name>seatunnel_web_log_config_content</name>
+ <display-name>Seatunnel-web Log Config</display-name>
+ <description>Seatunnel-web log config</description>
+ <property-type>VALUE_FROM_PROPERTY_FILE</property-type>
+ <value/>
+ <value-attributes>
+ <type>content</type>
+ <property-file-name>logback-spring.xml</property-file-name>
+ <property-file-type>xml</property-file-type>
+ </value-attributes>
+ </property>
+ <property>
+ <name>seatunnel_web_env</name>
+ <display-name>Seatunnel-web Environment Configuration</display-name>
+ <description>Configure JVM related configuration</description>
+ <property-type>VALUE_FROM_PROPERTY_FILE</property-type>
+ <value/>
+ <value-attributes>
+ <type>content</type>
+ <property-file-name>seatunnel-web-env.sh</property-file-name>
+ <property-file-type>text</property-file-type>
+ </value-attributes>
+ </property>
+</configuration>
diff --git
a/seatunnel-mpack/src/main/resources/addon-services/SEATUNNEL/2.3.8/configuration/seatunnel.xml
b/seatunnel-mpack/src/main/resources/addon-services/SEATUNNEL/2.3.8/configuration/seatunnel.xml
new file mode 100644
index 00000000..8461fc15
--- /dev/null
+++
b/seatunnel-mpack/src/main/resources/addon-services/SEATUNNEL/2.3.8/configuration/seatunnel.xml
@@ -0,0 +1,105 @@
+<?xml version="1.0"?>
+<!--
+/**
+ * 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.
+ */
+-->
+<configuration>
+ <property>
+ <name>backup_count</name>
+ <value>1</value>
+ <display-name>Backup Count</display-name>
+ <description>Backup count is a parameter that defines the number of
synchronous backups. Backup count should be min(1, max(5, N/2)), where N is the
number of cluster nodes.</description>
+ <value-attributes>
+ <type>int</type>
+ </value-attributes>
+ </property>
+ <property>
+ <name>seatunnel_config_content</name>
+ <display-name>Seatunnel Configuration</display-name>
+ <description>Seatunnel configuration template to provide unlimited
flexibility</description>
+ <property-type>VALUE_FROM_PROPERTY_FILE</property-type>
+ <value/>
+ <value-attributes>
+ <type>content</type>
+ <property-file-name>seatunnel.yaml</property-file-name>
+ <property-file-type>text</property-file-type>
+ </value-attributes>
+ </property>
+ <property>
+ <name>jvm_options</name>
+ <display-name>Seatunnel JVM Options</display-name>
+ <description>Configuration settings for Seatunnel process, including
heap size, heap dump, metaspace, and
+ garbage collection.
+ </description>
+ <property-type>VALUE_FROM_PROPERTY_FILE</property-type>
+ <value/>
+ <value-attributes>
+ <type>content</type>
+ <property-file-name>jvm_options</property-file-name>
+ <property-file-type>text</property-file-type>
+ </value-attributes>
+ </property>
+ <property>
+ <name>jvm_client_options</name>
+ <display-name>Seatunnel-client JVM Options</display-name>
+ <description>Seatunnel-client JVM options including head size, heap
dump etc.</description>
+ <property-type>VALUE_FROM_PROPERTY_FILE</property-type>
+ <value/>
+ <value-attributes>
+ <type>content</type>
+ <property-file-name>jvm_client_options</property-file-name>
+ <property-file-type>text</property-file-type>
+ </value-attributes>
+ </property>
+ <property>
+ <name>log4j2_properties</name>
+ <display-name>Log4j2 Configuration</display-name>
+ <description>Seatunnel log4j configuration</description>
+ <property-type>VALUE_FROM_PROPERTY_FILE</property-type>
+ <value/>
+ <value-attributes>
+ <type>content</type>
+ <property-file-name>log4j2.properties</property-file-name>
+ <property-file-type>text</property-file-type>
+ </value-attributes>
+ </property>
+ <property>
+ <name>log4j2_client_properties</name>
+ <display-name>Client Log4j2 Configuration</display-name>
+ <description>Seatunnel-client log4j2 configuration</description>
+ <property-type>VALUE_FROM_PROPERTY_FILE</property-type>
+ <value/>
+ <value-attributes>
+ <type>content</type>
+ <property-file-name>log4j2_client.properties</property-file-name>
+ <property-file-type>text</property-file-type>
+ </value-attributes>
+ </property>
+ <property>
+ <name>seatunnel_env</name>
+ <display-name>Seatunnel Environment Configuration</display-name>
+ <description>Configure Spark and Flink Home</description>
+ <property-type>VALUE_FROM_PROPERTY_FILE</property-type>
+ <value/>
+ <value-attributes>
+ <type>content</type>
+ <property-file-name>seatunnel-env.sh</property-file-name>
+ <property-file-type>text</property-file-type>
+ </value-attributes>
+ </property>
+</configuration>
diff --git
a/seatunnel-mpack/src/main/resources/addon-services/SEATUNNEL/2.3.8/metainfo.xml
b/seatunnel-mpack/src/main/resources/addon-services/SEATUNNEL/2.3.8/metainfo.xml
new file mode 100644
index 00000000..c4cd40af
--- /dev/null
+++
b/seatunnel-mpack/src/main/resources/addon-services/SEATUNNEL/2.3.8/metainfo.xml
@@ -0,0 +1,111 @@
+<?xml version="1.0"?>
+<!--
+ 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.
+-->
+<metainfo>
+ <schemaVersion>2.0</schemaVersion>
+ <services>
+ <service>
+ <name>SEATUNNEL</name>
+ <displayName>Seatunnel</displayName>
+ <comment>SeaTunnel is a next-generation super high-performance,
distributed, massive data integration tool.</comment>
+ <version>2.3.8</version>
+ <components>
+ <component>
+ <name>SEATUNNEL</name>
+ <timelineAppid>seatunnel</timelineAppid>
+ <displayName>Seatunnel</displayName>
+ <category>SLAVE</category>
+ <cardinality>1+</cardinality>
+ <versionAdvertised>false</versionAdvertised>
+ <commandScript>
+ <script>scripts/seatunnel.py</script>
+ <scriptType>PYTHON</scriptType>
+ </commandScript>
+ <logs>
+ <log>
+ <logId>seatunnel</logId>
+ <primary>true</primary>
+ </log>
+ </logs>
+ <configuration-dependencies>
+ <config-type>seatunnel-common</config-type>
+ <config-type>seatunnel</config-type>
+ <config-type>seatunnel-hazelcast</config-type>
+ </configuration-dependencies>
+ </component>
+ <component>
+ <name>SEATUNNEL-WEB</name>
+ <timelineAppid>seatunnel-web</timelineAppid>
+ <displayName>Seatunnel-web</displayName>
+ <category>SLAVE</category>
+ <cardinality>0-1</cardinality>
+ <versionAdvertised>false</versionAdvertised>
+ <commandScript>
+ <script>scripts/seatunnel_web.py</script>
+ <scriptType>PYTHON</scriptType>
+ </commandScript>
+ <logs>
+ <log>
+ <logId>seatunnel-web</logId>
+ <primary>true</primary>
+ </log>
+ </logs>
+ <configuration-dependencies>
+ <config-type>seatunnel-common</config-type>
+ <config-type>seatunnel-web-application</config-type>
+ <config-type>ranger-seatunnel-plugin-properties</config-type>
+ <config-type>ranger-seatunnel-audit</config-type>
+ <config-type>ranger-seatunnel-policymgr-ssl</config-type>
+ <config-type>ranger-seatunnel-security</config-type>
+ </configuration-dependencies>
+ </component>
+
+ </components>
+
+ <osSpecifics>
+ <osSpecific>
+ <osFamily>redhat8</osFamily>
+ <packages>
+ <package>
+ <name>seatunnel</name>
+ </package>
+ <package>
+ <name>seatunnel-web</name>
+ </package>
+ </packages>
+ </osSpecific>
+ </osSpecifics>
+
+ <commandScript>
+ <script>scripts/service_check.py</script>
+ <scriptType>PYTHON</scriptType>
+ <timeout>300</timeout>
+ </commandScript>
+
+ <requiredServices>
+ </requiredServices>
+
+ <quickLinksConfigurations>
+ <quickLinksConfiguration>
+ <fileName>quicklinks.json</fileName>
+ <default>true</default>
+ </quickLinksConfiguration>
+ </quickLinksConfigurations>
+
+ </service>
+ </services>
+</metainfo>
\ No newline at end of file
diff --git
a/seatunnel-mpack/src/main/resources/addon-services/SEATUNNEL/2.3.8/package/scripts/config_seatunnel.py
b/seatunnel-mpack/src/main/resources/addon-services/SEATUNNEL/2.3.8/package/scripts/config_seatunnel.py
new file mode 100644
index 00000000..7d1b5b25
--- /dev/null
+++
b/seatunnel-mpack/src/main/resources/addon-services/SEATUNNEL/2.3.8/package/scripts/config_seatunnel.py
@@ -0,0 +1,89 @@
+"""
+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.
+
+"""
+from resource_management.core.resources.system import File
+from resource_management.core.source import InlineTemplate
+
+
+def configure_seatunnel():
+ import params
+ File(params.seatunnel_yaml,
+ mode=0o644,
+ owner=params.seatunnel_user,
+ group=params.seatunnel_group,
+ content=InlineTemplate(params.seatunnel_content_template)
+ )
+
+ File(params.seatunnel_jvm_options,
+ mode=0o644,
+ owner=params.seatunnel_user,
+ group=params.seatunnel_group,
+ content=InlineTemplate(params.jvm_options_template)
+ )
+
+ File(params.seatunnel_jvm_client_options,
+ mode=0o644,
+ owner=params.seatunnel_user,
+ group=params.seatunnel_group,
+ content=InlineTemplate(params.jvm_client_options_template)
+ )
+
+ File(params.seatunnel_log4j2,
+ mode=0o644,
+ owner=params.seatunnel_user,
+ group=params.seatunnel_group,
+ content=InlineTemplate(params.log4j2_properties_template)
+ )
+
+ File(params.seatunnel_log4j2_client,
+ mode=0o644,
+ owner=params.seatunnel_user,
+ group=params.seatunnel_group,
+ content=InlineTemplate(params.log4j2_client_properties_template)
+ )
+
+ # Write content to hazelcast.yaml
+ File(params.seatunnel_hazelcast,
+ mode=0o644,
+ owner=params.seatunnel_user,
+ group=params.seatunnel_group,
+ content=InlineTemplate(params.hazelcast_content_template)
+ )
+
+ # Write content to hazelcast-client.yaml
+ File(params.seatunnel_hazelcast_client,
+ mode=0o644,
+ owner=params.seatunnel_user,
+ group=params.seatunnel_group,
+ content=InlineTemplate(params.hazelcast_client_content_template)
+ )
+
+ File(params.seatunnel_env_file,
+ mode=0o644,
+ owner=params.seatunnel_user,
+ group=params.seatunnel_group,
+ content=InlineTemplate(params.seatunnel_env_template)
+ )
+
+ File(params.seatunnel_home_config_file,
+ mode=0o755,
+ owner=params.seatunnel_user,
+ group=params.seatunnel_group,
+ content=f'''export SEATUNNEL_HOME={params.seatunnel_home}
+ export PATH=$PATH:$SEATUNNEL_HOME/bin'''
+ )
diff --git
a/seatunnel-mpack/src/main/resources/addon-services/SEATUNNEL/2.3.8/package/scripts/config_seatunnel_web.py
b/seatunnel-mpack/src/main/resources/addon-services/SEATUNNEL/2.3.8/package/scripts/config_seatunnel_web.py
new file mode 100644
index 00000000..0658a0db
--- /dev/null
+++
b/seatunnel-mpack/src/main/resources/addon-services/SEATUNNEL/2.3.8/package/scripts/config_seatunnel_web.py
@@ -0,0 +1,55 @@
+"""
+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.
+
+"""
+
+from resource_management.core.resources.system import File
+from resource_management.core.source import InlineTemplate
+
+
+def configure_seatunnel_web():
+ import params
+ File(params.seatunnel_web_application,
+ mode=0o644,
+ owner=params.seatunnel_user,
+ group=params.seatunnel_group,
+ content=InlineTemplate(params.seatunnel_web_config_content)
+ )
+
+ # Write content to hazelcast-client.yaml
+ File(params.seatunnel_web_hazelcast_client,
+ mode=0o644,
+ owner=params.seatunnel_user,
+ group=params.seatunnel_group,
+ content=InlineTemplate(params.hazelcast_client_content_template)
+ )
+
+ # Write content to hazelcast-client.yaml
+ File(params.seatunnel_web_logback,
+ mode=0o644,
+ owner=params.seatunnel_user,
+ group=params.seatunnel_group,
+ content=InlineTemplate(params.seatunnel_web_log_config_content)
+ )
+
+ # Write content to hazelcast-client.yaml
+ File(params.seatunnel_web_env_file,
+ mode=0o755,
+ owner=params.seatunnel_user,
+ group=params.seatunnel_group,
+ content=InlineTemplate(params.seatunnel_web_env_content)
+ )
diff --git
a/seatunnel-mpack/src/main/resources/addon-services/SEATUNNEL/2.3.8/package/scripts/params.py
b/seatunnel-mpack/src/main/resources/addon-services/SEATUNNEL/2.3.8/package/scripts/params.py
new file mode 100644
index 00000000..e6503bf3
--- /dev/null
+++
b/seatunnel-mpack/src/main/resources/addon-services/SEATUNNEL/2.3.8/package/scripts/params.py
@@ -0,0 +1,327 @@
+"""
+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.
+
+"""
+
+from ambari_commons.constants import AMBARI_SUDO_BINARY
+from resource_management.libraries.functions import StackFeature
+from resource_management.libraries.functions import conf_select
+from resource_management.libraries.functions import get_kinit_path
+from resource_management.libraries.functions import stack_select
+from resource_management.libraries.functions.default import default
+from resource_management.libraries.functions.format import format
+from resource_management.libraries.functions.get_not_managed_resources import
get_not_managed_resources
+from resource_management.libraries.functions.is_empty import is_empty
+from resource_management.libraries.functions.setup_ranger_plugin_xml import
get_audit_configs, \
+ generate_ranger_service_config
+from resource_management.libraries.functions.stack_features import
check_stack_feature
+from resource_management.libraries.functions.stack_features import
get_stack_feature_version
+from resource_management.libraries.resources.hdfs_resource import HdfsResource
+from resource_management.libraries.script.script import Script
+
+# shared configs
+sudo = AMBARI_SUDO_BINARY
+config = Script.get_config()
+stack_root = Script.get_stack_root()
+java64_home = config['ambariLevelParams']['java_home']
+# get the correct version to use for checking stack features
+version_for_stack_feature_checks = get_stack_feature_version(config)
+stack_supports_ranger_kerberos =
check_stack_feature(StackFeature.RANGER_KERBEROS_SUPPORT,
version_for_stack_feature_checks)
+stack_supports_ranger_audit_db =
check_stack_feature(StackFeature.RANGER_AUDIT_DB_SUPPORT,
version_for_stack_feature_checks)
+
+security_enabled = config['configurations']['cluster-env']['security_enabled']
+hdfs_user = config['configurations']['hadoop-env']['hdfs_user']
+retryAble = default("/commandParams/command_retry_enabled", False)
+version = default("/commandParams/version", None)
+
+
+hadoop_bin_dir = stack_select.get_hadoop_dir("bin")
+hadoop_conf_dir = conf_select.get_hadoop_conf_dir()
+kinit_path_local =
get_kinit_path(default('/configurations/kerberos-env/executable_search_paths',
None))
+# ToDo - check how to run seatunnel kerberos via mpack configurations instead
+kinit_cmd = ""
+kinit_cmd_master = ""
+master_security_config = ""
+hbase_decommission_auth_config = ""
+
+#for create_hdfs_directory
+hostname = config['agentLevelParams']['hostname']
+hdfs_user_keytab = config['configurations']['hadoop-env']['hdfs_user_keytab']
+hdfs_user = config['configurations']['hadoop-env']['hdfs_user']
+hdfs_principal_name =
config['configurations']['hadoop-env']['hdfs_principal_name']
+
+hdfs_site = config['configurations']['hdfs-site']
+default_fs = config['configurations']['core-site']['fs.defaultFS']
+
+dfs_type = default("/clusterLevelParams/dfs_type", "")
+
+import functools
+#create partial functions with common arguments for every HdfsResource call
+#to create/delete hdfs directory/file/copyfromlocal we need to call
params.HdfsResource in code
+HdfsResource = functools.partial(
+ HdfsResource,
+ user=hdfs_user,
+ hdfs_resource_ignore_file =
"/var/lib/ambari-agent/data/.hdfs_resource_ignore",
+ security_enabled = security_enabled,
+ keytab = hdfs_user_keytab,
+ kinit_path_local = kinit_path_local,
+ hadoop_bin_dir = hadoop_bin_dir,
+ hadoop_conf_dir = hadoop_conf_dir,
+ principal_name = hdfs_principal_name,
+ hdfs_site = hdfs_site,
+ default_fs = default_fs,
+ immutable_paths = get_not_managed_resources(),
+ dfs_type = dfs_type
+)
+
+#####################################
+# Seatunnel configs
+#####################################
+
+seatunnel_home = stack_root + "/current/seatunnel"
+seatunnel_conf_dir = '/etc/seatunnel/conf'
+seatunnel_web_home = stack_root + "/current/seatunnel-web"
+seatunnel_web_conf_dir = '/etc/seatunnel-web/conf'
+seatunnel_lib = seatunnel_web_home + '/libs'
+seatunnel_log_dir = '/var/log/seatunnel'
+seatunnel_web_log_dir = "/var/log/seatunnel-web"
+seatunnel_web_profile_dir = seatunnel_web_home+ "/profile"
+ranger_seatunnel_plugin_home = seatunnel_web_home + '/ranger-seatunnel-plugin'
+
+cred_lib_path = ranger_seatunnel_plugin_home+ "/install/lib/*"
+cred_setup_prefix = (
+ 'ambari-python-wrap',
+ f"{ranger_seatunnel_plugin_home}/ranger_credential_helper.py",
+ '-l',
+ f"{cred_lib_path}"
+)
+
+seatunnel_user = "root"
+seatunnel_group = "root"
+
+# Seatunnel config file paths
+seatunnel_yaml = seatunnel_conf_dir + '/seatunnel.yaml'
+seatunnel_hazelcast = seatunnel_conf_dir + '/hazelcast.yaml'
+seatunnel_hazelcast_client = seatunnel_conf_dir + '/hazelcast-client.yaml'
+seatunnel_env_file = seatunnel_conf_dir + '/seatunnel-env.sh'
+seatunnel_home_config_file = '/etc/profile.d/seatunnel.sh'
+
+seatunnel_jvm_options = seatunnel_conf_dir + '/jvm_options'
+seatunnel_jvm_client_options = seatunnel_conf_dir + '/jvm_client_options'
+seatunnel_log4j2 = seatunnel_conf_dir + '/log4j2.properties'
+seatunnel_log4j2_client = seatunnel_conf_dir + '/log4j2_client.properties'
+
+# Seatunnel-web config file paths
+seatunnel_web_application = seatunnel_web_conf_dir + '/application.yml' #
NOTE: Currently, the file extension is .yml instead of .yaml
+seatunnel_web_hazelcast_client = seatunnel_web_conf_dir +
'/hazelcast-client.yaml'
+seatunnel_web_logback = seatunnel_web_conf_dir + '/logback-spring.xml'
+seatunnel_web_env_file = seatunnel_web_conf_dir + '/seatunnel-web-env.sh'
+
+# Seatunnel and Seatunnel-web common configurations
+seatunnel_cluster_name =
config['configurations']['seatunnel-common']['seatunnel_cluster_name']
+hazelcast_port = default('configurations/seatunnel-common/hazelcast_port',
'5801')
+hazelcast_client_content_template =
config['configurations']['seatunnel-common']['hazelcast_client_config_content']
+
+
+# Read content for seatunnel.yaml
+backup_count = config['configurations']['seatunnel']["backup_count"]
+seatunnel_content_template =
config['configurations']['seatunnel']['seatunnel_config_content']
+jvm_options_template = config['configurations']['seatunnel']['jvm_options']
+jvm_client_options_template =
config['configurations']['seatunnel']['jvm_client_options']
+log4j2_properties_template =
config['configurations']['seatunnel']['log4j2_properties']
+log4j2_client_properties_template =
config['configurations']['seatunnel']['log4j2_client_properties']
+seatunnel_env_template = config['configurations']['seatunnel']['seatunnel_env']
+
+
+
+# Read content for hazelcast.yaml
+enable_rest_api =
default('configurations/seatunnel-hazelcast/enable_rest_api', False)
+hazelcast_content_template =
config['configurations']['seatunnel-hazelcast']['hazelcast_config_content']
+
+seatunnel_hosts_list = config['clusterHostInfo']['seatunnel_hosts']
+seatunnel_hosts_list.sort()
+hazelcast_cluster_members = "\n".join(
+ [f" - {host}:{hazelcast_port}" if i != 0 else f"-
{host}:{hazelcast_port}" for i, host in
+ enumerate(seatunnel_hosts_list)])
+
+hazelcast_client_cluster_members = "\n".join(
+ [f" - {host}:{hazelcast_port}" if i != 0 else f"-
{host}:{hazelcast_port}" for i, host in
+ enumerate(seatunnel_hosts_list)])
+# Read content for seatunnel-web-application.yml
+seatunnel_web_hosts_list = config['clusterHostInfo']['seatunnel-web_hosts']
+seatunnel_web_hosts_list.sort()
+web_server_port =
config['configurations']['seatunnel-web-application']['http_port']
+seatunnel_web_ssl_enabled =
config['configurations']['seatunnel-web-application']['seatunnel.web.ssl.enabled']
+if (seatunnel_web_ssl_enabled):
+ web_server_port =
config['configurations']['seatunnel-web-application']['https_port']
+ seatunnel_web_ssl_keystore =
config['configurations']['seatunnel-web-application']['seatunnel.web.ssl.keystore']
+ seatunnel_web_ssl_keystore_password =
config['configurations']['seatunnel-web-application']['seatunnel.web.ssl.keystore.password']
+ seatunnel_web_ssl_keystore_type =
config['configurations']['seatunnel-web-application']['seatunnel.web.ssl.keystore.type']
+ seatunnel_web_ssl_keystore_key_alias =
config['configurations']['seatunnel-web-application']['seatunnel.web.ssl.keystore.key.alias']
+
+db_driver_class =
config['configurations']['seatunnel-web-application']['db_driver_class']
+db_url = config['configurations']['seatunnel-web-application']['db_url']
+db_username =
config['configurations']['seatunnel-web-application']['db_username']
+db_password =
config['configurations']['seatunnel-web-application']['db_password']
+
+
+write_job_definition_to_file =
config['configurations']['seatunnel-web-application']['write_job_definition_to_file']
+datasource_encryption_type =
config['configurations']['seatunnel-web-application']['datasource_encryption_type']
+jwt_expire_time =
config['configurations']['seatunnel-web-application']['jwt_expire_time']
+jwt_secret_key =
config['configurations']['seatunnel-web-application']['jwt_secret_key']
+jwt_algorithm =
config['configurations']['seatunnel-web-application']['jwt_algorithm']
+
+seatunnel_web_config_content =
config['configurations']['seatunnel-web-application']['seatunnel_web_config_content']
+seatunnel_web_log_config_content =
config['configurations']['seatunnel-web-application']['seatunnel_web_log_config_content']
+seatunnel_web_env_content =
config['configurations']['seatunnel-web-application']['seatunnel_web_env']
+
+
+
+# ranger hive plugin section start
+
+# ranger host
+ranger_admin_hosts = default("/clusterHostInfo/ranger_admin_hosts", [])
+has_ranger_admin = not len(ranger_admin_hosts) == 0
+
+# ranger support xml_configuration flag, instead of depending on ranger
xml_configurations_supported/ranger-env, using stack feature
+xml_configurations_supported =
check_stack_feature(StackFeature.RANGER_XML_CONFIGURATION,
version_for_stack_feature_checks)
+
+# ranger seatunnel plugin enabled property
+enable_ranger_seatunnel =
default("/configurations/ranger-seatunnel-plugin-properties/ranger-seatunnel-plugin-enabled",
"No")
+enable_ranger_seatunnel = True if enable_ranger_seatunnel.lower() == 'yes'
else False
+
+access_controller_class =
"org.apache.seatunnel.app.permission.SeatunnelAccessControllerDefaultImpl"
+# get ranger seatunnel properties if enable_ranger_seatunnel is True
+if enable_ranger_seatunnel:
+ access_controller_class =
"org.apache.ranger.authorization.seatunnel.authorizer.RangerSeatunnelAuthorizer"
+ # get ranger policy url
+ policymgr_mgr_url =
config['configurations']['admin-properties']['policymgr_external_url']
+ if xml_configurations_supported:
+ policymgr_mgr_url =
config['configurations']['ranger-seatunnel-security']['ranger.plugin.seatunnel.policy.rest.url']
+
+ if not is_empty(policymgr_mgr_url) and policymgr_mgr_url.endswith('/'):
+ policymgr_mgr_url = policymgr_mgr_url.rstrip('/')
+
+ # ranger audit db user
+ xa_audit_db_user = default('/configurations/admin-properties/audit_db_user',
'rangerlogger')
+
+ # ranger seatunnel service name
+ repo_name = str(config['clusterName']) + '_seatunnel'
+ repo_name_value =
config['configurations']['ranger-seatunnel-security']['ranger.plugin.seatunnel.service.name']
+ if not is_empty(repo_name_value) and repo_name_value != "{{repo_name}}":
+ repo_name = repo_name_value
+
+ jdbc_driver_class_name =
config['configurations']['ranger-seatunnel-plugin-properties']['jdbc.driverClassName']
+ common_name_for_certificate =
config['configurations']['ranger-seatunnel-plugin-properties']['common.name.for.certificate']
+ repo_config_username =
config['configurations']['ranger-seatunnel-plugin-properties']['REPOSITORY_CONFIG_USERNAME']
+
+ # ranger-env config
+ ranger_env = config['configurations']['ranger-env']
+
+ # create ranger-env config having external ranger credential properties
+ if not has_ranger_admin and enable_ranger_seatunnel:
+ external_admin_username =
default('/configurations/ranger-seatunnel-plugin-properties/external_admin_username',
'admin')
+ external_admin_password =
default('/configurations/ranger-seatunnel-plugin-properties/external_admin_password',
'admin')
+ external_ranger_admin_username =
default('/configurations/ranger-seatunnel-plugin-properties/external_ranger_admin_username',
'amb_ranger_admin')
+ external_ranger_admin_password =
default('/configurations/ranger-seatunnel-plugin-properties/external_ranger_admin_password',
'amb_ranger_admin')
+ ranger_env = {}
+ ranger_env['admin_username'] = external_admin_username
+ ranger_env['admin_password'] = external_admin_password
+ ranger_env['ranger_admin_username'] = external_ranger_admin_username
+ ranger_env['ranger_admin_password'] = external_ranger_admin_password
+
+ ranger_plugin_properties =
config['configurations']['ranger-seatunnel-plugin-properties']
+ policy_user =
config['configurations']['ranger-seatunnel-plugin-properties']['policy_user']
+ repo_config_password =
config['configurations']['ranger-seatunnel-plugin-properties']['REPOSITORY_CONFIG_PASSWORD']
+
+ ranger_downloaded_custom_connector = None
+ ranger_previous_jdbc_jar_name = None
+ ranger_driver_curl_source = None
+ ranger_driver_curl_target = None
+ ranger_previous_jdbc_jar = None
+
+ if has_ranger_admin and stack_supports_ranger_audit_db:
+ # to get db connector related properties
+ xa_audit_db_flavor =
config['configurations']['admin-properties']['DB_FLAVOR']
+ ranger_jdbc_jar_name, ranger_previous_jdbc_jar_name, audit_jdbc_url,
jdbc_driver = get_audit_configs(config)
+
+ ranger_downloaded_custom_connector =
format("{tmp_dir}/{ranger_jdbc_jar_name}")
+ ranger_driver_curl_source = format("{jdk_location}/{ranger_jdbc_jar_name}")
+ ranger_driver_curl_target =
format("{seatunnel_lib}/{ranger_jdbc_jar_name}")
+ ranger_previous_jdbc_jar =
format("{seatunnel_lib}/{ranger_previous_jdbc_jar_name}")
+ sql_connector_jar = ''
+
+ protocol = "https" if seatunnel_web_ssl_enabled else "http"
+ # Extract host information
+ host = config['clusterHostInfo']['seatunnel-web_hosts'][0]
+ # Construct the URL
+ seatunnel_url = f"{protocol}://{host}:{web_server_port}/seatunnel/api/v1/"
+
+ seatunnel_ranger_plugin_config = {
+ 'username': repo_config_username,
+ 'password': repo_config_password,
+ 'seatunnel.web.url': seatunnel_url,
+ 'commonNameForCertificate': common_name_for_certificate
+ }
+
+ if seatunnel_web_ssl_enabled:
+ seatunnel_ranger_plugin_config.update({
+ 'seatunnel.web.ssl.truststore': seatunnel_web_ssl_keystore,
+ 'seatunnel.web.ssl.truststore.password':
seatunnel_web_ssl_keystore_password,
+ 'seatunnel.web.ssl.truststore.type': seatunnel_web_ssl_keystore_type
+ })
+
+ if security_enabled:
+ seatunnel_ranger_plugin_config['policy.download.auth.users'] =
seatunnel_user
+ seatunnel_ranger_plugin_config['tag.download.auth.users'] = seatunnel_user
+ seatunnel_ranger_plugin_config['policy.grantrevoke.auth.users'] =
seatunnel_user
+
+ custom_ranger_service_config =
generate_ranger_service_config(ranger_plugin_properties)
+ if len(custom_ranger_service_config) > 0:
+ seatunnel_ranger_plugin_config.update(custom_ranger_service_config)
+
+ seatunnel_ranger_plugin_repo = {
+ 'isEnabled': 'true',
+ 'configs': seatunnel_ranger_plugin_config,
+ 'description': 'Seatunnel repo',
+ 'name': repo_name,
+ 'type': 'seatunnel'
+ }
+
+ xa_audit_db_password = ''
+ if not
is_empty(config['configurations']['admin-properties']['audit_db_password']) and
stack_supports_ranger_audit_db and has_ranger_admin:
+ xa_audit_db_password =
config['configurations']['admin-properties']['audit_db_password']
+
+ xa_audit_db_is_enabled = False
+ if xml_configurations_supported and stack_supports_ranger_audit_db:
+ xa_audit_db_is_enabled =
config['configurations']['ranger-seatunnel-audit']['xasecure.audit.destination.db']
+
+ xa_audit_hdfs_is_enabled =
config['configurations']['ranger-seatunnel-audit']['xasecure.audit.destination.hdfs']
if xml_configurations_supported else False
+ ssl_keystore_password =
config['configurations']['ranger-seatunnel-policymgr-ssl']['xasecure.policymgr.clientssl.keystore.password']
if xml_configurations_supported else None
+ ssl_truststore_password =
config['configurations']['ranger-seatunnel-policymgr-ssl']['xasecure.policymgr.clientssl.truststore.password']
if xml_configurations_supported else None
+ credential_file = format('/etc/ranger/{repo_name}/cred.jceks')
+
+ # for SQLA explicitly disable audit to DB for Ranger
+ if has_ranger_admin and stack_supports_ranger_audit_db and
xa_audit_db_flavor.lower() == 'sqla':
+ xa_audit_db_is_enabled = False
+
+cluster_name = config['clusterName']
+# ranger hive plugin section end
+
+
+
+
diff --git
a/seatunnel-mpack/src/main/resources/addon-services/SEATUNNEL/2.3.8/package/scripts/seatunnel.py
b/seatunnel-mpack/src/main/resources/addon-services/SEATUNNEL/2.3.8/package/scripts/seatunnel.py
new file mode 100644
index 00000000..0bc14893
--- /dev/null
+++
b/seatunnel-mpack/src/main/resources/addon-services/SEATUNNEL/2.3.8/package/scripts/seatunnel.py
@@ -0,0 +1,66 @@
+"""
+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.
+
+"""
+import subprocess
+
+from config_seatunnel import configure_seatunnel
+from resource_management import ComponentIsNotRunning, Fail
+from resource_management.core import shell
+from resource_management.core.resources.system import Execute
+from resource_management.libraries.functions.format import format
+from resource_management.libraries.script.script import Script
+
+
+class Seatunnel(Script):
+ def install(self, env):
+ import params
+ env.set_params(params)
+ self.install_packages(env)
+
+ def configure(self, env, upgrade_type=None, config_dir=None):
+ import params
+ env.set_params(params)
+ configure_seatunnel()
+
+ def start(self, env, upgrade_type=None):
+ import params
+ env.set_params(params)
+ configure_seatunnel()
+ start_cmd = format('/usr/sbin/seatunnel start')
+ Execute(start_cmd, user=params.seatunnel_user)
+
+ def stop(self, env, upgrade_type=None):
+ import params
+ env.set_params(params)
+ stop_cmd = format('/usr/sbin/seatunnel stop')
+ Execute(stop_cmd, user=params.seatunnel_user)
+
+ def status(self, env):
+ import params
+ env.set_params(params)
+ status_cmd = format('/usr/sbin/seatunnel status')
+ code, output, error = shell.call(status_cmd, user=params.seatunnel_user,
stderr=subprocess.PIPE, logoutput=True)
+ if code != 0:
+ raise Fail(format("Failed to execute command {status_cmd},
error={error}"))
+
+ if output and "is not running" in output:
+ raise ComponentIsNotRunning("Seatunnel is not running")
+
+
+if __name__ == "__main__":
+ Seatunnel().execute()
diff --git
a/seatunnel-mpack/src/main/resources/addon-services/SEATUNNEL/2.3.8/package/scripts/seatunnel_web.py
b/seatunnel-mpack/src/main/resources/addon-services/SEATUNNEL/2.3.8/package/scripts/seatunnel_web.py
new file mode 100644
index 00000000..144445c9
--- /dev/null
+++
b/seatunnel-mpack/src/main/resources/addon-services/SEATUNNEL/2.3.8/package/scripts/seatunnel_web.py
@@ -0,0 +1,69 @@
+"""
+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.
+
+"""
+import subprocess
+
+from config_seatunnel_web import configure_seatunnel_web
+from resource_management.core import shell
+from resource_management.core.exceptions import ComponentIsNotRunning, Fail
+from resource_management.core.resources.system import Execute
+from resource_management.libraries.functions.format import format
+from resource_management.libraries.script.script import Script
+from setup_ranger_seatunnel import setup_ranger_seatunnel
+
+class Seatunnel_web(Script):
+ def install(self, env):
+ import params
+ env.set_params(params)
+ self.install_packages(env)
+
+
+ def configure(self, env, upgrade_type=None):
+ import params
+ env.set_params(params)
+ configure_seatunnel_web()
+
+ def start(self, env, upgrade_type=None):
+ import params
+ env.set_params(params)
+ configure_seatunnel_web()
+ setup_ranger_seatunnel(upgrade_type=upgrade_type)
+
+ start_cmd = format('/usr/sbin/seatunnel-web start')
+ Execute(start_cmd, user=params.seatunnel_user)
+
+ def stop(self, env, upgrade_type=None):
+ import params
+ env.set_params(params)
+ stop_cmd = format('/usr/sbin/seatunnel-web stop')
+ Execute(stop_cmd, user=params.seatunnel_user)
+
+ def status(self, env):
+ import params
+ env.set_params(params)
+ status_cmd = format('/usr/sbin/seatunnel-web status')
+ code, output, error = shell.call(status_cmd,
user=params.seatunnel_user, stderr=subprocess.PIPE, logoutput=True)
+ if code != 0:
+ raise Fail(format("Failed to execute command {status_cmd},
error={error}"))
+
+ if output and "is not running" in output:
+ raise ComponentIsNotRunning("Seatunnel-web is not running")
+
+
+if __name__ == "__main__":
+ Seatunnel_web().execute()
diff --git
a/seatunnel-mpack/src/main/resources/addon-services/SEATUNNEL/2.3.8/package/scripts/service_check.py
b/seatunnel-mpack/src/main/resources/addon-services/SEATUNNEL/2.3.8/package/scripts/service_check.py
new file mode 100644
index 00000000..e9e9817d
--- /dev/null
+++
b/seatunnel-mpack/src/main/resources/addon-services/SEATUNNEL/2.3.8/package/scripts/service_check.py
@@ -0,0 +1,52 @@
+"""
+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.
+
+"""
+import socket
+
+from resource_management import Fail
+from resource_management.core.logger import Logger
+from resource_management.libraries.functions.format import format
+from resource_management.libraries.script.script import Script
+from seatunnel import Seatunnel
+from seatunnel_web import Seatunnel_web
+
+
+class ServiceCheck(Script):
+ def service_check(self, env):
+ import params
+ env.set_params(params)
+ hostname = socket.gethostname()
+ if hostname in params.seatunnel_hosts_list:
+ Logger.info('Checking Seatunnel service')
+ try:
+ Seatunnel().status(env)
+ except Exception as e:
+ Logger.error(f'Seatunnel service check failed error: {e}')
+ raise Fail(format("Seatunnel on host {hostname} is not
running, error={e}"))
+
+ if hostname in params.seatunnel_web_hosts_list:
+ Logger.info('Checking Seatunnel-web status')
+ try:
+ Seatunnel_web().status(env)
+ except Exception as e:
+ Logger.error(f'Seatunnel-web service check failed error: {e}')
+ raise Fail(format("Seatunnel-web on host {hostname} is not
running, error={e}"))
+
+
+if __name__ == "__main__":
+ ServiceCheck().execute()
diff --git
a/seatunnel-mpack/src/main/resources/addon-services/SEATUNNEL/2.3.8/package/scripts/setup_ranger_seatunnel.py
b/seatunnel-mpack/src/main/resources/addon-services/SEATUNNEL/2.3.8/package/scripts/setup_ranger_seatunnel.py
new file mode 100755
index 00000000..32f5c3ce
--- /dev/null
+++
b/seatunnel-mpack/src/main/resources/addon-services/SEATUNNEL/2.3.8/package/scripts/setup_ranger_seatunnel.py
@@ -0,0 +1,80 @@
+#!/usr/bin/env python
+"""
+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.
+
+"""
+
+# Ambari Commons & Resource Management Imports
+from resource_management.core.logger import Logger
+from resource_management.libraries.functions.setup_ranger_plugin_xml import
setup_ranger_plugin
+
+def setup_ranger_seatunnel(upgrade_type = None):
+ import params
+
+ if params.enable_ranger_seatunnel:
+ stack_version = params.version
+
+ if params.retryAble:
+ Logger.info("Seatunnel: Setup ranger: command retry enables thus
retrying if ranger admin is down !")
+ else:
+ Logger.info("Seatunnel: Setup ranger: command retry not enabled thus
skipping if ranger admin is down !")
+
+ if params.xa_audit_hdfs_is_enabled:
+ try:
+ params.HdfsResource("/ranger/audit",
+ type="directory",
+ action="create_on_execute",
+ owner=params.hdfs_user,
+ group=params.hdfs_user,
+ mode=0o755,
+ recursive_chmod=True
+ )
+ params.HdfsResource("/ranger/audit/seatunnel",
+ type="directory",
+ action="create_on_execute",
+ owner=params.seatunnel_user,
+ group=params.seatunnel_group,
+ mode=0o700,
+ recursive_chmod=True
+ )
+ params.HdfsResource(None, action="execute")
+ except Exception as err:
+ Logger.exception("Audit directory creation in HDFS for HIVE Ranger
plugin failed with error:\n{0}".format(err))
+
+ api_version='v2'
+
+ setup_ranger_plugin('seatunnel-web', 'seatunnel',
params.ranger_previous_jdbc_jar,
+ params.ranger_downloaded_custom_connector,
params.ranger_driver_curl_source,
+ params.ranger_driver_curl_target, params.java64_home,
+ params.repo_name, params.seatunnel_ranger_plugin_repo,
+ params.ranger_env, params.ranger_plugin_properties,
+ params.policy_user, params.policymgr_mgr_url,
+ params.enable_ranger_seatunnel,
conf_dict=params.seatunnel_web_conf_dir,
+ component_user=params.seatunnel_user,
component_group=params.seatunnel_group, cache_service_list=['seatunnel-web'],
+
plugin_audit_properties=params.config['configurations']['ranger-seatunnel-audit'],
plugin_audit_attributes=params.config['configurationAttributes']['ranger-seatunnel-audit'],
+
plugin_security_properties=params.config['configurations']['ranger-seatunnel-security'],
plugin_security_attributes=params.config['configurationAttributes']['ranger-seatunnel-security'],
+
plugin_policymgr_ssl_properties=params.config['configurations']['ranger-seatunnel-policymgr-ssl'],
plugin_policymgr_ssl_attributes=params.config['configurationAttributes']['ranger-seatunnel-policymgr-ssl'],
+ component_list=['seatunnel', 'seatunnel-web'],
audit_db_is_enabled=params.xa_audit_db_is_enabled,
+ credential_file=params.credential_file,
xa_audit_db_password=params.xa_audit_db_password,
+
ssl_truststore_password=params.ssl_truststore_password,
ssl_keystore_password=params.ssl_keystore_password,
+ stack_version_override = stack_version,
skip_if_rangeradmin_down= not params.retryAble, api_version=api_version,
+ is_security_enabled = params.security_enabled,
+ is_stack_supports_ranger_kerberos =
params.stack_supports_ranger_kerberos,
+ component_user_principal= None,
+ component_user_keytab=None,
cred_lib_path_override=params.cred_lib_path,
cred_setup_prefix_override=params.cred_setup_prefix)
+ else:
+ Logger.info('Ranger Seatunnel plugin is not enabled')
diff --git
a/seatunnel-mpack/src/main/resources/addon-services/SEATUNNEL/2.3.8/properties/application.yaml
b/seatunnel-mpack/src/main/resources/addon-services/SEATUNNEL/2.3.8/properties/application.yaml
new file mode 100644
index 00000000..87c1394c
--- /dev/null
+++
b/seatunnel-mpack/src/main/resources/addon-services/SEATUNNEL/2.3.8/properties/application.yaml
@@ -0,0 +1,87 @@
+#
+# 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.
+#
+
+server:
+ port: {{web_server_port}}
+ ssl:
+ enabled: {{seatunnel_web_ssl_enabled}}
+ key-store: {{seatunnel_web_ssl_keystore}}
+ key-store-password: {{seatunnel_web_ssl_keystore_password}}
+ key-store-type: {{seatunnel_web_ssl_keystore_type}}
+ key-alias: {{seatunnel_web_ssl_keystore_key_alias}}
+spring:
+ application:
+ name: seatunnel-web
+ jackson:
+ date-format: yyyy-MM-dd HH:mm:ss
+ datasource:
+ driver-class-name: {{db_driver_class}}
+ url: {{db_url}}
+ username: {{db_username}}
+ password: {{db_password}}
+ mvc:
+ pathmatch:
+ matching-strategy: ant_path_matcher
+ ldap:
+ url: ldap://localhost:389
+ search:
+ base: ou=people,dc=example,dc=com
+ filter: (uid={0})
+ domain: example.com
+ authentication:
+ providers:
+ - DB
+ #- LDAP # LDAP authentication is disabled by default
+ async-config:
+ core-pool-size: 10
+ max-pool-size: 20
+ queue-capacity: 100
+seatunnel-web:
+ job-definition:
+ write-to-file : {{write_job_definition_to_file}}
+ datasource:
+ encryption:
+ type: {{datasource_encryption_type}}
+ keys-to-encrypt:
+ - password
+ - auth
+ access-controller-class: {{access_controller_class}}
+jwt:
+ expireTime: {{jwt_expire_time}}
+ secretKey: {{jwt_secret_key}}
+ algorithm: {{jwt_algorithm}}
+
+---
+spring:
+ config:
+ activate:
+ on-profile: h2
+ sql:
+ init:
+ schema-locations: classpath*:script/seatunnel_server_h2.sql
+ datasource:
+ driver-class-name: org.h2.Driver
+ url:
jdbc:h2:mem:seatunnel;MODE=MySQL;DB_CLOSE_DELAY=-1;DATABASE_TO_LOWER=true
+ username: sa
+ password: sa
+ h2:
+ console:
+ enabled: true
+ path: /h2
+ settings:
+ trace: false
+ web-allow-others: false
\ No newline at end of file
diff --git
a/seatunnel-mpack/src/main/resources/addon-services/SEATUNNEL/2.3.8/properties/hazelcast-client.yaml
b/seatunnel-mpack/src/main/resources/addon-services/SEATUNNEL/2.3.8/properties/hazelcast-client.yaml
new file mode 100644
index 00000000..afe2e00e
--- /dev/null
+++
b/seatunnel-mpack/src/main/resources/addon-services/SEATUNNEL/2.3.8/properties/hazelcast-client.yaml
@@ -0,0 +1,28 @@
+#
+# 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.
+#
+
+hazelcast-client:
+ cluster-name: {{seatunnel_cluster_name}}
+ properties:
+ hazelcast.logging.type: log4j2
+ connection-strategy:
+ connection-retry:
+ cluster-connect-timeout-millis: 3000
+ network:
+ cluster-members:
+ {{hazelcast_client_cluster_members}}
+
diff --git
a/seatunnel-mpack/src/main/resources/addon-services/SEATUNNEL/2.3.8/properties/hazelcast.yaml
b/seatunnel-mpack/src/main/resources/addon-services/SEATUNNEL/2.3.8/properties/hazelcast.yaml
new file mode 100644
index 00000000..8fa90178
--- /dev/null
+++
b/seatunnel-mpack/src/main/resources/addon-services/SEATUNNEL/2.3.8/properties/hazelcast.yaml
@@ -0,0 +1,48 @@
+#
+# 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.
+#
+
+hazelcast:
+ cluster-name: {{seatunnel_cluster_name}}
+ network:
+ rest-api:
+ enabled: {{enable_rest_api}}
+ endpoint-groups:
+ CLUSTER_WRITE:
+ enabled: true
+ DATA:
+ enabled: true
+ join:
+ tcp-ip:
+ enabled: true
+ member-list:
+ {{hazelcast_cluster_members}}
+
+ port:
+ auto-increment: false
+ port: {{hazelcast_port}}
+ properties:
+ hazelcast.invocation.max.retry.count: 20
+ hazelcast.tcp.join.port.try.count: 30
+ hazelcast.logging.type: log4j2
+ hazelcast.operation.generic.thread.count: 50
+ hazelcast.heartbeat.failuredetector.type: phi-accrual
+ hazelcast.heartbeat.interval.seconds: 2
+ hazelcast.max.no.heartbeat.seconds: 180
+ hazelcast.heartbeat.phiaccrual.failuredetector.threshold: 10
+ hazelcast.heartbeat.phiaccrual.failuredetector.sample.size: 200
+ hazelcast.heartbeat.phiaccrual.failuredetector.min.std.dev.millis: 100
+
diff --git
a/seatunnel-mpack/src/main/resources/addon-services/SEATUNNEL/2.3.8/properties/jvm_client_options
b/seatunnel-mpack/src/main/resources/addon-services/SEATUNNEL/2.3.8/properties/jvm_client_options
new file mode 100644
index 00000000..462e1374
--- /dev/null
+++
b/seatunnel-mpack/src/main/resources/addon-services/SEATUNNEL/2.3.8/properties/jvm_client_options
@@ -0,0 +1,24 @@
+#
+# 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.
+#
+
+# JVM Heap
+-Xms256m
+-Xmx512m
+
+# JVM Dump
+-XX:+HeapDumpOnOutOfMemoryError
+-XX:HeapDumpPath=/tmp/seatunnel/dump/zeta-client
\ No newline at end of file
diff --git
a/seatunnel-mpack/src/main/resources/addon-services/SEATUNNEL/2.3.8/properties/jvm_options
b/seatunnel-mpack/src/main/resources/addon-services/SEATUNNEL/2.3.8/properties/jvm_options
new file mode 100644
index 00000000..c8a7218d
--- /dev/null
+++
b/seatunnel-mpack/src/main/resources/addon-services/SEATUNNEL/2.3.8/properties/jvm_options
@@ -0,0 +1,30 @@
+#
+# 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.
+#
+
+# JVM Heap
+-Xms2g
+-Xmx2g
+
+# JVM Dump
+-XX:+HeapDumpOnOutOfMemoryError
+-XX:HeapDumpPath=/tmp/seatunnel/dump/zeta-server
+
+# Metaspace
+-XX:MaxMetaspaceSize=2g
+
+# G1GC
+-XX:+UseG1GC
diff --git
a/seatunnel-mpack/src/main/resources/addon-services/SEATUNNEL/2.3.8/properties/log4j2.properties
b/seatunnel-mpack/src/main/resources/addon-services/SEATUNNEL/2.3.8/properties/log4j2.properties
new file mode 100644
index 00000000..256a2a8c
--- /dev/null
+++
b/seatunnel-mpack/src/main/resources/addon-services/SEATUNNEL/2.3.8/properties/log4j2.properties
@@ -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.
+################################################################################
+
+# The minimum amount of time, in seconds, that must elapse before the file
configuration is checked for changes.
+monitorInterval = 60
+
+property.file_path = ${sys:seatunnel.logs.path:-/tmp/seatunnel/logs}
+property.file_name = ${sys:seatunnel.logs.file_name:-seatunnel}
+property.file_split_size = 100MB
+property.file_count = 100
+property.file_ttl = 7d
+
+rootLogger.level = INFO
+
+logger.zeta.name=org.apache.seatunnel.engine
+logger.zeta.level=INFO
+
+logger.debezium.name=io.debezium.connector
+logger.debezium.level=WARN
+
+############################ log output to console
#############################
+#rootLogger.appenderRef.consoleStdout.ref = consoleStdoutAppender
+#rootLogger.appenderRef.consoleStderr.ref = consoleStderrAppender
+############################ log output to console
#############################
+############################ log output to file
#############################
+rootLogger.appenderRef.file.ref = fileAppender
+############################ log output to file
#############################
+
+appender.consoleStdout.name = consoleStdoutAppender
+appender.consoleStdout.type = CONSOLE
+appender.consoleStdout.target = SYSTEM_OUT
+appender.consoleStdout.layout.type = PatternLayout
+appender.consoleStdout.layout.pattern = [%X{ST-JID}] %d{yyyy-MM-dd
HH:mm:ss,SSS} %-5p [%-30.30c{1.}] [%t] - %m%n
+appender.consoleStdout.filter.acceptLtWarn.type = ThresholdFilter
+appender.consoleStdout.filter.acceptLtWarn.level = WARN
+appender.consoleStdout.filter.acceptLtWarn.onMatch = DENY
+appender.consoleStdout.filter.acceptLtWarn.onMismatch = ACCEPT
+
+appender.consoleStderr.name = consoleStderrAppender
+appender.consoleStderr.type = CONSOLE
+appender.consoleStderr.target = SYSTEM_ERR
+appender.consoleStderr.layout.type = PatternLayout
+appender.consoleStderr.layout.pattern = [%X{ST-JID}] %d{yyyy-MM-dd
HH:mm:ss,SSS} %-5p [%-30.30c{1.}] [%t] - %m%n
+appender.consoleStderr.filter.acceptGteWarn.type = ThresholdFilter
+appender.consoleStderr.filter.acceptGteWarn.level = WARN
+appender.consoleStderr.filter.acceptGteWarn.onMatch = ACCEPT
+appender.consoleStderr.filter.acceptGteWarn.onMismatch = DENY
+
+appender.routing.name = routingAppender
+appender.routing.type = Routing
+appender.routing.purge.type = IdlePurgePolicy
+appender.routing.purge.timeToLive = 60
+appender.routing.route.type = Routes
+appender.routing.route.pattern = $${ctx:ST-JID}
+appender.routing.route.system.type = Route
+appender.routing.route.system.key = $${ctx:ST-JID}
+appender.routing.route.system.ref = fileAppender
+appender.routing.route.job.type = Route
+appender.routing.route.job.appender.type = File
+appender.routing.route.job.appender.name = job-${ctx:ST-JID}
+appender.routing.route.job.appender.fileName =
${file_path}/job-${ctx:ST-JID}.log
+appender.routing.route.job.appender.layout.type = PatternLayout
+appender.routing.route.job.appender.layout.pattern = %d{yyyy-MM-dd
HH:mm:ss,SSS} %-5p [%-30.30c{1.}] [%t] - %m%n
+
+appender.file.name = fileAppender
+appender.file.type = RollingFile
+appender.file.fileName = ${file_path}/${file_name}.log
+appender.file.filePattern = ${file_path}/${file_name}.log.%d{yyyy-MM-dd}-%i
+appender.file.append = true
+appender.file.layout.type = PatternLayout
+appender.file.layout.pattern = [%X{ST-JID}] %d{yyyy-MM-dd HH:mm:ss,SSS} %-5p
[%-30.30c{1.}] [%t] - %m%n
+appender.file.policies.type = Policies
+appender.file.policies.time.type = TimeBasedTriggeringPolicy
+appender.file.policies.time.modulate = true
+appender.file.policies.size.type = SizeBasedTriggeringPolicy
+appender.file.policies.size.size = ${file_split_size}
+appender.file.strategy.type = DefaultRolloverStrategy
+appender.file.strategy.fileIndex = nomax
+appender.file.strategy.action.type = Delete
+appender.file.strategy.action.basepath = ${file_path}
+appender.file.strategy.action.maxDepth = 1
+appender.file.strategy.action.condition.type = IfFileName
+appender.file.strategy.action.condition.glob = ${file_name}.log*
+appender.file.strategy.action.condition.nested_condition.type = IfAny
+appender.file.strategy.action.condition.nested_condition.lastModify.type =
IfLastModified
+appender.file.strategy.action.condition.nested_condition.lastModify.age =
${file_ttl}
+appender.file.strategy.action.condition.nested_condition.fileCount.type =
IfAccumulatedFileCount
+appender.file.strategy.action.condition.nested_condition.fileCount.exceeds =
${file_count}
\ No newline at end of file
diff --git
a/seatunnel-mpack/src/main/resources/addon-services/SEATUNNEL/2.3.8/properties/log4j2_client.properties
b/seatunnel-mpack/src/main/resources/addon-services/SEATUNNEL/2.3.8/properties/log4j2_client.properties
new file mode 100644
index 00000000..0c751b15
--- /dev/null
+++
b/seatunnel-mpack/src/main/resources/addon-services/SEATUNNEL/2.3.8/properties/log4j2_client.properties
@@ -0,0 +1,81 @@
+################################################################################
+# 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.
+################################################################################
+
+# The minimum amount of time, in seconds, that must elapse before the file
configuration is checked for changes.
+monitorInterval = 60
+
+property.file_path = ${sys:seatunnel.logs.path:-/tmp/seatunnel/logs}
+property.file_name = ${sys:seatunnel.logs.file_name:-seatunnel}
+property.file_split_size = 100MB
+property.file_count = 100
+property.file_ttl = 7d
+
+rootLogger.level = INFO
+
+############################ log output to console
#############################
+rootLogger.appenderRef.consoleStdout.ref = consoleStdoutAppender
+rootLogger.appenderRef.consoleStderr.ref = consoleStderrAppender
+############################ log output to console
#############################
+############################ log output to file
#############################
+#rootLogger.appenderRef.file.ref = fileAppender
+############################ log output to file
#############################
+
+appender.consoleStdout.name = consoleStdoutAppender
+appender.consoleStdout.type = CONSOLE
+appender.consoleStdout.target = SYSTEM_OUT
+appender.consoleStdout.layout.type = PatternLayout
+appender.consoleStdout.layout.pattern = %d{yyyy-MM-dd HH:mm:ss,SSS} %-5p
[%-30.30c{1.}] [%t] - %m%n
+appender.consoleStdout.filter.acceptLtWarn.type = ThresholdFilter
+appender.consoleStdout.filter.acceptLtWarn.level = WARN
+appender.consoleStdout.filter.acceptLtWarn.onMatch = DENY
+appender.consoleStdout.filter.acceptLtWarn.onMismatch = ACCEPT
+
+appender.consoleStderr.name = consoleStderrAppender
+appender.consoleStderr.type = CONSOLE
+appender.consoleStderr.target = SYSTEM_ERR
+appender.consoleStderr.layout.type = PatternLayout
+appender.consoleStderr.layout.pattern = %d{yyyy-MM-dd HH:mm:ss,SSS} %-5p
[%-30.30c{1.}] [%t] - %m%n
+appender.consoleStderr.filter.acceptGteWarn.type = ThresholdFilter
+appender.consoleStderr.filter.acceptGteWarn.level = WARN
+appender.consoleStderr.filter.acceptGteWarn.onMatch = ACCEPT
+appender.consoleStderr.filter.acceptGteWarn.onMismatch = DENY
+
+#appender.file.name = fileAppender
+#appender.file.type = RollingFile
+#appender.file.fileName = ${file_path}/${file_name}.log
+#appender.file.filePattern = ${file_path}/${file_name}.log.%d{yyyy-MM-dd}-%i
+#appender.file.append = true
+#appender.file.layout.type = PatternLayout
+#appender.file.layout.pattern = %d{yyyy-MM-dd HH:mm:ss,SSS} %-5p
[%-30.30c{1.}] [%t] - %m%n
+#appender.file.policies.type = Policies
+#appender.file.policies.time.type = TimeBasedTriggeringPolicy
+#appender.file.policies.time.modulate = true
+#appender.file.policies.size.type = SizeBasedTriggeringPolicy
+#appender.file.policies.size.size = ${file_split_size}
+#appender.file.strategy.type = DefaultRolloverStrategy
+#appender.file.strategy.fileIndex = nomax
+#appender.file.strategy.action.type = Delete
+#appender.file.strategy.action.basepath = ${file_path}
+#appender.file.strategy.action.maxDepth = 1
+#appender.file.strategy.action.condition.type = IfFileName
+#appender.file.strategy.action.condition.glob = ${file_name}.log*
+#appender.file.strategy.action.condition.nested_condition.type = IfAny
+#appender.file.strategy.action.condition.nested_condition.lastModify.type =
IfLastModified
+#appender.file.strategy.action.condition.nested_condition.lastModify.age =
${file_ttl}
+#appender.file.strategy.action.condition.nested_condition.fileCount.type =
IfAccumulatedFileCount
+#appender.file.strategy.action.condition.nested_condition.fileCount.exceeds =
${file_count}
\ No newline at end of file
diff --git
a/seatunnel-mpack/src/main/resources/addon-services/SEATUNNEL/2.3.8/properties/logback-spring.xml
b/seatunnel-mpack/src/main/resources/addon-services/SEATUNNEL/2.3.8/properties/logback-spring.xml
new file mode 100644
index 00000000..b1883c9d
--- /dev/null
+++
b/seatunnel-mpack/src/main/resources/addon-services/SEATUNNEL/2.3.8/properties/logback-spring.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!--
+ 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.
+-->
+<configuration scan="true" scanPeriod="10 seconds">
+ <springProperty scope="context" name="APP_NAME"
source="spring.application.name"/>
+ <property name="APP_LOG_PATH" value="${seatunnel-web.logs.path}/" />
+ <property name="HOST_NAME" value="${HOSTNAME:-UNKNOWN}"/>
+ <property name="TRACE"
value="[tr:%X{X-B3-TraceId:-},sp:%X{X-B3-SpanId:-}]"/>
+ <include resource="org/springframework/boot/logging/logback/defaults.xml"
/>
+
+ <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
+ <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+ <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} ${APP_NAME} ${HOST_NAME} %p
${TRACE} [%thread] [%C{0}.%M\(\):%L] - %m%n</pattern>
+ <charset>UTF-8</charset>
+ </encoder>
+ </appender>
+
+ <appender name="seatunnel-web"
class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <file>${APP_LOG_PATH}/seatunnel-web.log</file>
+ <append>true</append>
+ <rollingPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
+
<FileNamePattern>${APP_LOG_PATH}/seatunnel-web.log.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
+ <MaxHistory>30</MaxHistory>
+ <MaxFileSize>100MB</MaxFileSize>
+ </rollingPolicy>
+ <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+ <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} ${APP_NAME} ${HOST_NAME} %p
[%thread] [%C{0}.%M\(\):%L] - %m%n</pattern>
+ <charset>UTF-8</charset>
+ </encoder>
+ </appender>
+
+ <root level="INFO">
+ <appender-ref ref="seatunnel-web" />
+ </root>
+</configuration>
diff --git
a/seatunnel-mpack/src/main/resources/addon-services/SEATUNNEL/2.3.8/properties/seatunnel-env.sh
b/seatunnel-mpack/src/main/resources/addon-services/SEATUNNEL/2.3.8/properties/seatunnel-env.sh
new file mode 100644
index 00000000..ca54f467
--- /dev/null
+++
b/seatunnel-mpack/src/main/resources/addon-services/SEATUNNEL/2.3.8/properties/seatunnel-env.sh
@@ -0,0 +1,27 @@
+#!/usr/bin/env bash
+#
+# 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.
+#
+
+# Home directory of spark distribution.
+SPARK_HOME=${SPARK_HOME:-/opt/spark}
+# Home directory of flink distribution.
+FLINK_HOME=${FLINK_HOME:-/opt/flink}
+# Below variables are used in seatunnel-cluster.sh, seatunnel.sh,
seatunnel-connector.sh etc scripts
+STACK_ROOT=${STACK_ROOT:-"/usr/bigtop"}
+export APP_DIR="$STACK_ROOT/current/seatunnel"
+export CONF_DIR="/etc/seatunnel/conf"
+export LOG_DIR="/var/log/seatunnel"
diff --git
a/seatunnel-mpack/src/main/resources/addon-services/SEATUNNEL/2.3.8/properties/seatunnel-web-env.sh
b/seatunnel-mpack/src/main/resources/addon-services/SEATUNNEL/2.3.8/properties/seatunnel-web-env.sh
new file mode 100755
index 00000000..4e5795bf
--- /dev/null
+++
b/seatunnel-mpack/src/main/resources/addon-services/SEATUNNEL/2.3.8/properties/seatunnel-web-env.sh
@@ -0,0 +1,37 @@
+#!/bin/sh
+#
+# 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.
+#
+
+# Default directories
+STACK_ROOT=${STACK_ROOT:-"/usr/bigtop"}
+export LOGDIR=${LOGDIR:-"/var/log/seatunnel-web"}
+export CONFDIR=${CONFDIR:-"/etc/seatunnel-web/conf"}
+export
SEATUNNEL_WEB_HOME=${SEATUNNEL_WEB_HOME:-"$STACK_ROOT/current/seatunnel-web"}
+export SEATUNNEL_HOME="${STACK_ROOT}/current/seatunnel"
+
+# JVM options
+export JAVA_MEMORY_OPTS=${JAVA_MEMORY_OPTS:-"-Xms2g -Xmx4g -Xmn1g"}
+export JAVA_GC_OPTS=${JAVA_GC_OPTS:-"-XX:+PrintGCDetails
-Xloggc:${LOGDIR}/gc.log"}
+export JAVA_ERROR_OPTS=${JAVA_ERROR_OPTS:-"-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=${LOGDIR}/dump.hprof"}
+
+#JDK17_OPTS="--add-opens java.base/java.lang.invoke=ALL-UNNAMED --add-opens
java.base/java.net=ALL-UNNAMED --add-opens
java.security.jgss/sun.security.krb5=ALL-UNNAMED"
+#JAVA_OPTS="$JAVA_OPTS $JDK17_OPTS"
+
+#DEBUG_OPTS="-Xdebug
-Xrunjdwp:server=y,transport=dt_socket,address=*:8476,suspend=n"
+#DEBUG_OPTS="$DEBUG_OPTS -verbose:class"
+#export JAVA_OPTS="$JAVA_OPTS $DEBUG_OPTS"
+
diff --git
a/seatunnel-mpack/src/main/resources/addon-services/SEATUNNEL/2.3.8/properties/seatunnel.yaml
b/seatunnel-mpack/src/main/resources/addon-services/SEATUNNEL/2.3.8/properties/seatunnel.yaml
new file mode 100644
index 00000000..7dbcdfa9
--- /dev/null
+++
b/seatunnel-mpack/src/main/resources/addon-services/SEATUNNEL/2.3.8/properties/seatunnel.yaml
@@ -0,0 +1,39 @@
+#
+# 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.
+#
+
+seatunnel:
+ engine:
+ history-job-expire-minutes: 1440
+ backup-count: {{backup_count}}
+ queue-type: blockingqueue
+ print-execution-info-interval: 60
+ print-job-metrics-info-interval: 60
+ slot-service:
+ dynamic-slot: true
+ checkpoint:
+ interval: 10000
+ timeout: 60000
+ storage:
+ type: hdfs
+ max-retained: 3
+ plugin-config:
+ namespace: /var/lib/seatunnel/checkpoint_snapshot/
+ storage.type: hdfs
+ fs.defaultFS: file:///var/lib/seatunnel/filesystem # Ensure that the
directory has written permission
+ telemetry:
+ metric:
+ enabled: false
diff --git
a/seatunnel-mpack/src/main/resources/addon-services/SEATUNNEL/2.3.8/quicklinks/quicklinks.json
b/seatunnel-mpack/src/main/resources/addon-services/SEATUNNEL/2.3.8/quicklinks/quicklinks.json
new file mode 100644
index 00000000..e13c4338
--- /dev/null
+++
b/seatunnel-mpack/src/main/resources/addon-services/SEATUNNEL/2.3.8/quicklinks/quicklinks.json
@@ -0,0 +1,49 @@
+{
+ "name": "default",
+ "description": "default quick links configuration",
+ "configuration": {
+ "protocol": {
+ "type":"https",
+ "checks":[
+ {
+ "property":"seatunnel.web.ssl.enabled",
+ "desired":"true",
+ "site":"seatunnel-web-application"
+ }
+ ]
+ },
+ "links": [
+ {
+ "name": "seatunnel_web_ui",
+ "label": "Seatunnel-web UI",
+ "component_name": "SEATUNNEL-WEB",
+ "url": "%@://%@:%@/",
+ "requires_user_name": "false",
+ "port": {
+ "http_property": "http_port",
+ "http_default_port": "8801",
+ "https_property": "https_port",
+ "https_default_port": "8443",
+ "regex": "^(\\d+)$",
+ "site": "seatunnel-web-application"
+ }
+ },
+ {
+ "name": "seatunnel_web_ui",
+ "label": "Seatunnel-web API Doc",
+ "component_name": "SEATUNNEL-WEB",
+ "url": "%@://%@:%@/swagger-ui.html",
+ "requires_user_name": "false",
+ "port": {
+ "http_property": "http_port",
+ "http_default_port": "8801",
+ "https_property": "https_port",
+ "https_default_port": "8443",
+ "regex": "^(\\d+)$",
+ "site": "seatunnel-web-application"
+ }
+ }
+ ]
+ }
+}
+
diff --git
a/seatunnel-mpack/src/main/resources/addon-services/SEATUNNEL/2.3.8/role_command_order.json
b/seatunnel-mpack/src/main/resources/addon-services/SEATUNNEL/2.3.8/role_command_order.json
new file mode 100644
index 00000000..2170153e
--- /dev/null
+++
b/seatunnel-mpack/src/main/resources/addon-services/SEATUNNEL/2.3.8/role_command_order.json
@@ -0,0 +1,11 @@
+{
+ "general_deps": {
+ "_comment": "dependencies for Seatunnel"
+ },
+ "commandParams": {
+ "roleCommandOrder": {
+ "SEATUNNEL-START": ["SEATUNNEL-WEB-START"],
+ "SEATUNNEL-WEB-STOP": ["SEATUNNEL-STOP"]
+ }
+ }
+}
\ No newline at end of file
diff --git
a/seatunnel-mpack/src/main/resources/extensions/SEATUNNEL/2.3.8/metainfo.xml
b/seatunnel-mpack/src/main/resources/extensions/SEATUNNEL/2.3.8/metainfo.xml
new file mode 100644
index 00000000..c641b035
--- /dev/null
+++ b/seatunnel-mpack/src/main/resources/extensions/SEATUNNEL/2.3.8/metainfo.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0"?>
+<!--
+ 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.
+-->
+<metainfo>
+ <stacks>
+ <stack>
+ <name>BIGTOP</name>
+ <version>3.3.0</version>
+ </stack>
+ </stacks>
+</metainfo>
diff --git a/seatunnel-mpack/src/main/resources/mpack.json
b/seatunnel-mpack/src/main/resources/mpack.json
new file mode 100644
index 00000000..f3fda67a
--- /dev/null
+++ b/seatunnel-mpack/src/main/resources/mpack.json
@@ -0,0 +1,37 @@
+{
+ "type": "full-release",
+ "name": "seatunnel-mpack",
+ "version": "1.0.0.0",
+ "description": "Seatunnel Management Pack",
+ "prerequisites": {
+ "min_ambari_version": "3.0.0",
+ "min-stack-versions" : [
+ {
+ "stack_name" : "BIGTOP", "stack_version" : "3.3.0"
+ } ]
+ },
+ "artifacts": [
+ {
+ "name" : "seatunnel-extension-definitions",
+ "type" : "extension-definitions",
+ "source_dir": "extensions"
+ },
+ {
+ "name": "seatunnel-stack-addon-service-definitions",
+ "type": "stack-addon-service-definitions",
+ "source_dir": "addon-services",
+ "service_versions_map": [
+ {
+ "service_name" : "SEATUNNEL",
+ "service_version" : "2.3.8",
+ "applicable_stacks" : [
+ {
+ "stack_name" : "BIGTOP",
+ "stack_version" : "3.3.0"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+}