+
+
+
+
\ No newline at end of file
diff --git a/dolphinscheduler-ui/src/js/conf/home/pages/dag/_source/formModel/tasks/conditions.vue b/dolphinscheduler-ui/src/js/conf/home/pages/dag/_source/formModel/tasks/conditions.vue
new file mode 100644
index 0000000000..4ac04d91a6
--- /dev/null
+++ b/dolphinscheduler-ui/src/js/conf/home/pages/dag/_source/formModel/tasks/conditions.vue
@@ -0,0 +1,265 @@
+/*
+ * 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.
+ */
+
+
+
+
+
+
\ No newline at end of file
diff --git a/dolphinscheduler-ui/src/js/conf/home/pages/dag/_source/formModel/tasks/sqoop.vue b/dolphinscheduler-ui/src/js/conf/home/pages/dag/_source/formModel/tasks/sqoop.vue
new file mode 100644
index 0000000000..eead745a06
--- /dev/null
+++ b/dolphinscheduler-ui/src/js/conf/home/pages/dag/_source/formModel/tasks/sqoop.vue
@@ -0,0 +1,981 @@
+/*
+ * 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.
+ */
+
+
diff --git a/dolphinscheduler-ui/src/js/conf/home/pages/projects/pages/taskInstance/index.vue b/dolphinscheduler-ui/src/js/conf/home/pages/projects/pages/taskInstance/index.vue
index a23eee5fa0..4cb166647e 100644
--- a/dolphinscheduler-ui/src/js/conf/home/pages/projects/pages/taskInstance/index.vue
+++ b/dolphinscheduler-ui/src/js/conf/home/pages/projects/pages/taskInstance/index.vue
@@ -68,7 +68,9 @@
// start date
startDate: '',
// end date
- endDate: ''
+ endDate: '',
+ // Exectuor Name
+ executorName: ''
}
}
},
@@ -147,4 +149,4 @@
},
components: { mList, mInstanceConditions, mSpin, mListConstruction, mSecondaryMenu, mNoData }
}
-
\ No newline at end of file
+
diff --git a/dolphinscheduler-ui/src/js/conf/home/store/dag/mutations.js b/dolphinscheduler-ui/src/js/conf/home/store/dag/mutations.js
old mode 100644
new mode 100755
index 6ceabed8c1..b914b86740
--- a/dolphinscheduler-ui/src/js/conf/home/store/dag/mutations.js
+++ b/dolphinscheduler-ui/src/js/conf/home/store/dag/mutations.js
@@ -134,6 +134,7 @@ export default {
state.locations[payload.id] = _.assign(state.locations[payload.id], {
name: dom.find('.name-p').text(),
targetarr: dom.attr('data-targetarr'),
+ nodenumber: dom.attr('data-nodenumber'),
x: parseInt(dom.css('left'), 10),
y: parseInt(dom.css('top'), 10)
})
diff --git a/dolphinscheduler-ui/src/js/module/i18n/locale/en_US.js b/dolphinscheduler-ui/src/js/module/i18n/locale/en_US.js
old mode 100644
new mode 100755
index 0402d7e398..e8ac57adc0
--- a/dolphinscheduler-ui/src/js/module/i18n/locale/en_US.js
+++ b/dolphinscheduler-ui/src/js/module/i18n/locale/en_US.js
@@ -240,6 +240,7 @@ export default {
'Service-Master': 'Service-Master',
'Service-Worker': 'Service-Worker',
'Process Name': 'Process Name',
+ 'Executor': 'Executor',
'Run Type': 'Run Type',
'Scheduling Time': 'Scheduling Time',
'Run Times': 'Run Times',
@@ -518,5 +519,54 @@ export default {
'SpeedRecord': 'speed(record count)',
'0 means unlimited by byte': '0 means unlimited',
'0 means unlimited by count': '0 means unlimited',
- 'Modify User': 'Modify User'
+ 'Modify User': 'Modify User',
+ 'Please enter Mysql Database(required)': 'Please enter Mysql Database(required)',
+ 'Please enter Mysql Table(required)': 'Please enter Mysql Table(required)',
+ 'Please enter Columns (Comma separated)': 'Please enter Columns (Comma separated)',
+ 'Please enter Target Dir(required)': 'Please enter Target Dir(required)',
+ 'Please enter Export Dir(required)': 'Please enter Export Dir(required)',
+ 'Please enter Hive Database(required)': 'Please enter Hive Databasec(required)',
+ 'Please enter Hive Table(required)': 'Please enter Hive Table(required)',
+ 'Please enter Hive Partition Keys': 'Please enter Hive Partition Key',
+ 'Please enter Hive Partition Values': 'Please enter Partition Value',
+ 'Please enter Replace Delimiter': 'Please enter Replace Delimiter',
+ 'Please enter Fields Terminated': 'Please enter Fields Terminated',
+ 'Please enter Lines Terminated': 'Please enter Lines Terminated',
+ 'Please enter Concurrency': 'Please enter Concurrency',
+ 'Please enter Update Key': 'Please enter Update Key',
+ 'Direct': 'Direct',
+ 'Type': 'Type',
+ 'ModelType': 'ModelType',
+ 'ColumnType': 'ColumnType',
+ 'Database': 'Database',
+ 'Column': 'Column',
+ 'Map Column Hive': 'Map Column Hive',
+ 'Map Column Java': 'Map Column Java',
+ 'Export Dir': 'Export Dir',
+ 'Hive partition Keys': 'Hive partition Keys',
+ 'Hive partition Values': 'Hive partition Values',
+ 'FieldsTerminated': 'FieldsTerminated',
+ 'LinesTerminated': 'LinesTerminated',
+ 'IsUpdate': 'IsUpdate',
+ 'UpdateKey': 'UpdateKey',
+ 'UpdateMode': 'UpdateMode',
+ 'Target Dir': 'Target Dir',
+ 'DeleteTargetDir': 'DeleteTargetDir',
+ 'FileType': 'FileType',
+ 'CompressionCodec': 'CompressionCodec',
+ 'CreateHiveTable': 'CreateHiveTable',
+ 'DropDelimiter': 'DropDelimiter',
+ 'OverWriteSrc': 'OverWriteSrc',
+ 'ReplaceDelimiter': 'ReplaceDelimiter',
+ 'Concurrency': 'Concurrency',
+ 'Form': 'Form',
+ 'OnlyUpdate': 'OnlyUpdate',
+ 'AllowInsert': 'AllowInsert',
+ 'Data Source': 'Data Source',
+ 'Data Target': 'Data Target',
+ 'All Columns': 'All Columns',
+ 'Some Columns': 'Some Columns',
+ 'Modify User': 'Modify User',
+ 'Branch flow': 'Branch flow',
+ 'Cannot select the same node for successful branch flow and failed branch flow': 'Cannot select the same node for successful branch flow and failed branch flow'
}
diff --git a/dolphinscheduler-ui/src/js/module/i18n/locale/zh_CN.js b/dolphinscheduler-ui/src/js/module/i18n/locale/zh_CN.js
old mode 100644
new mode 100755
index 95eb4a1081..c72090657b
--- a/dolphinscheduler-ui/src/js/module/i18n/locale/zh_CN.js
+++ b/dolphinscheduler-ui/src/js/module/i18n/locale/zh_CN.js
@@ -239,6 +239,7 @@ export default {
'Service-Master': '服务管理-Master',
'Service-Worker': '服务管理-Worker',
'Process Name': '工作流名称',
+ 'Executor': '执行用户',
'Run Type': '运行类型',
'Scheduling Time': '调度时间',
'Run Times': '运行次数',
@@ -518,5 +519,54 @@ export default {
'SpeedRecord': '限流(记录数)',
'0 means unlimited by byte': 'KB,0代表不限制',
'0 means unlimited by count': '0代表不限制',
- 'Modify User': '修改用户'
+ 'Modify User': '修改用户',
+ 'Please enter Mysql Database(required)': '请输入Mysql数据库(必填)',
+ 'Please enter Mysql Table(required)': '请输入Mysql表名(必填)',
+ 'Please enter Columns (Comma separated)': '请输入列名,用 , 隔开',
+ 'Please enter Target Dir(required)': '请输入目标路径(必填)',
+ 'Please enter Export Dir(required)': '请输入数据源路径(必填)',
+ 'Please enter Hive Database(required)': '请输入Hive数据库(必填)',
+ 'Please enter Hive Table(required)': '请输入Hive表名(必填)',
+ 'Please enter Hive Partition Keys': '请输入分区键',
+ 'Please enter Hive Partition Values': '请输入分区值',
+ 'Please enter Replace Delimiter': '请输入替换分隔符',
+ 'Please enter Fields Terminated': '请输入列分隔符',
+ 'Please enter Lines Terminated': '请输入行分隔符',
+ 'Please enter Concurrency': '请输入并发度',
+ 'Please enter Update Key': '请输入更新列',
+ 'Direct': '流向',
+ 'Type': '类型',
+ 'ModelType': '模式',
+ 'ColumnType': '列类型',
+ 'Database': '数据库',
+ 'Column': '列',
+ 'Map Column Hive': 'Hive类型映射',
+ 'Map Column Java': 'Java类型映射',
+ 'Export Dir': '数据源路径',
+ 'Hive partition Keys': 'Hive 分区键',
+ 'Hive partition Values': 'Hive 分区值',
+ 'FieldsTerminated': '列分隔符',
+ 'LinesTerminated': '行分隔符',
+ 'IsUpdate': '是否更新',
+ 'UpdateKey': '更新列',
+ 'UpdateMode': '更新类型',
+ 'Target Dir': '目标路径',
+ 'DeleteTargetDir': '是否删除目录',
+ 'FileType': '保存格式',
+ 'CompressionCodec': '压缩类型',
+ 'CreateHiveTable': '是否创建新表',
+ 'DropDelimiter': '是否删除分隔符',
+ 'OverWriteSrc': '是否覆盖数据源',
+ 'ReplaceDelimiter': '替换分隔符',
+ 'Concurrency': '并发度',
+ 'Form': '表单',
+ 'OnlyUpdate': '只更新',
+ 'AllowInsert': '无更新便插入',
+ 'Data Source': '数据来源',
+ 'Data Target': '数据目的',
+ 'All Columns': '全表导入',
+ 'Some Columns': '选择列',
+ 'Modify User': '修改用户',
+ 'Branch flow': '分支流转',
+ 'Cannot select the same node for successful branch flow and failed branch flow': '成功分支流转和失败分支流转不能选择同一个节点'
}
diff --git a/e2e/pom.xml b/e2e/pom.xml
new file mode 100644
index 0000000000..ea67c0ca16
--- /dev/null
+++ b/e2e/pom.xml
@@ -0,0 +1,137 @@
+
+
+ 4.0.0
+ org.apache.dolphinscheduler-e2e
+ dolphinscheduler-e2e
+ 1.0.0
+
+
+ 6.14.3
+ 3.141.59
+ 22.0
+ 2.6
+ 1.1.4
+ 2.8.0
+ 4.2.1
+ testng.xml
+
+
+
+
+
+ org.seleniumhq.selenium
+ selenium-java
+ ${selenium.version}
+
+
+ com.google.guava
+ guava
+ ${guava.version}
+
+
+ com.google.inject
+ guice
+ ${inject.version}
+
+
+
+ org.testng
+ testng
+ ${testng.version}
+
+
+
+ org.uncommons
+ reportng
+ ${reportng.version}
+ test
+
+
+ org.testng
+ testng
+
+
+
+
+
+ commons-io
+ commons-io
+ ${commons-io.version}
+
+
+
+ org.apache.servicemix.bundles
+ org.apache.servicemix.bundles.jedis
+ 2.6.2_1
+
+
+ org.apache.commons
+ commons-pool2
+ ${commons-pool2.version}
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.8.0
+
+
+ 1.8
+ UTF-8
+
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+ 2.20.1
+
+
+ ${xml.file}
+
+ -Dfile.encoding=UTF-8
+
+
+ usedefaultlisteners
+
+ false
+
+
+ listener
+ org.uncommons.reportng.HTMLReporter,org.uncommons.reportng.JUnitXMLReporter
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/e2e/src/main/java/org/apache/dolphinscheduler/constant/TestConstant.java b/e2e/src/main/java/org/apache/dolphinscheduler/constant/TestConstant.java
new file mode 100644
index 0000000000..8a3b8eb6b3
--- /dev/null
+++ b/e2e/src/main/java/org/apache/dolphinscheduler/constant/TestConstant.java
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.dolphinscheduler.constant;
+
+public class TestConstant {
+ /**
+ * 1000
+ */
+ public static final int ONE_THOUSANG = 1000;
+
+
+
+ /**
+ * 3000
+ */
+ public static final int THREE_THOUSANG = 3000;
+
+ /**
+ * 10000
+ */
+ public static final int TEN_THOUSANG = 10000;
+
+}
diff --git a/e2e/src/main/java/org/apache/dolphinscheduler/util/PropertiesReader.java b/e2e/src/main/java/org/apache/dolphinscheduler/util/PropertiesReader.java
new file mode 100644
index 0000000000..cbf7d07bd7
--- /dev/null
+++ b/e2e/src/main/java/org/apache/dolphinscheduler/util/PropertiesReader.java
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.dolphinscheduler.util;
+
+import java.io.*;
+import java.util.Properties;
+
+/**
+ * read properties
+ */
+public class PropertiesReader {
+ private static Properties properties = new Properties();
+
+ /**
+ * @param propertiesPath properties path
+ * @return Properties
+ * @throws IOException IOException
+ */
+ public static Properties readProperties(String propertiesPath) throws IOException {
+ System.out.println("read properties ");
+ InputStream inputStream = new FileInputStream(propertiesPath);
+ InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "UTF-8");
+ BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
+ properties.load(bufferedReader);
+ return properties;
+ }
+
+ /***
+ * @param key key
+ * @return value
+ */
+ public static String getKey(String key) {
+ return properties.getProperty(key);
+ }
+}
diff --git a/e2e/src/main/java/org/apache/dolphinscheduler/util/RedisUtil.java b/e2e/src/main/java/org/apache/dolphinscheduler/util/RedisUtil.java
new file mode 100644
index 0000000000..7f9340f0ca
--- /dev/null
+++ b/e2e/src/main/java/org/apache/dolphinscheduler/util/RedisUtil.java
@@ -0,0 +1,204 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.dolphinscheduler.util;
+
+import org.apache.dolphinscheduler.constant.TestConstant;
+import redis.clients.jedis.Jedis;
+import redis.clients.jedis.JedisPool;
+import redis.clients.jedis.JedisPoolConfig;
+
+/**
+ * redis util
+ */
+public class RedisUtil {
+ /**
+ * redis ip
+ */
+ private static String redisIp;
+
+ /**
+ * redis port
+ */
+ private static int redisPort;
+
+ /**
+ * redis password
+ */
+ private static String redisPwd;
+
+ /**
+ * redis pool config
+ */
+ private static JedisPoolConfig jedisPoolConfig;
+
+ /**
+ * redis pool
+ */
+ private static JedisPool jedisPool;
+
+ /**
+ * jedis connection
+ */
+ private Jedis jedis;
+
+ /**
+ * jedis expire time
+ */
+ private int jedisExpireTime;
+
+ /**
+ * jedis max total
+ */
+ private static int jedisPoolMaxTotal;
+
+ /**
+ * jedis max idle
+ */
+ private static int jedisPoolMaxIdle;
+
+ /**
+ * jedis max wait time
+ */
+ private static int jedisPoolMaxWaitMillis;
+
+ /**
+ * Whether to perform a valid check when calling the borrowObject method
+ */
+ private static boolean jedisPoolTestOnBorrow;
+
+ /**
+ * Whether to perform a valid check when calling the returnObject method
+ */
+ private static boolean jedisPoolTestOnReturn;
+
+ /**
+ * storage local thread
+ */
+ public static ThreadLocal threadLocal = new ThreadLocal<>();
+
+ /*
+ * redis init
+ */
+ static {
+ // redis properties
+ redisIp = PropertiesReader.getKey("redis.ip");
+ redisPort = Integer.valueOf(PropertiesReader.getKey("redis.port"));
+ redisPwd = PropertiesReader.getKey("redis.pwd");
+ //redis pool properties
+ jedisPoolMaxTotal = Integer.valueOf(PropertiesReader.getKey("jedis.pool.maxTotal"));
+ jedisPoolMaxIdle = Integer.valueOf(PropertiesReader.getKey("jedis.pool.maxIdle"));
+ jedisPoolMaxWaitMillis = Integer.valueOf(PropertiesReader.getKey("jedis.pool.maxWaitMillis"));
+ jedisPoolTestOnBorrow = Boolean.valueOf(PropertiesReader.getKey("jedis.pool.testOnBorrow"));
+ jedisPoolTestOnReturn = Boolean.valueOf(PropertiesReader.getKey("jedis.pool.testOnReturn"));
+ // redis pool start properties
+ jedisPoolConfig = new JedisPoolConfig();
+ jedisPoolConfig.setMaxTotal(jedisPoolMaxTotal);
+ jedisPoolConfig.setMaxIdle(jedisPoolMaxIdle);
+ jedisPoolConfig.setMaxWaitMillis(jedisPoolMaxWaitMillis);
+ jedisPoolConfig.setTestOnBorrow(jedisPoolTestOnBorrow);
+ jedisPoolConfig.setTestOnReturn(jedisPoolTestOnReturn);
+ // connect redis
+ try {
+ System.out.println("redis init");
+ if (redisPwd.isEmpty())
+ jedisPool = new JedisPool(jedisPoolConfig, redisIp, redisPort, TestConstant.THREE_THOUSANG);
+ else {
+ jedisPool = new JedisPool(jedisPoolConfig, redisIp, redisPort, TestConstant.TEN_THOUSANG, redisPwd);
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ System.out.println("redis connect fail");
+ }
+ }
+
+ /**
+ * get redis pool
+ *
+ * @return redis pool
+ */
+ public static JedisPool getJedisPool() {
+ return jedisPool;
+ }
+
+ /**
+ * get jedis connection
+ *
+ * @return jedis connection
+ */
+ public Jedis getNewJedis() {
+ Jedis newJedis = null;
+ try {
+ newJedis = jedisPool.getResource();
+ } catch (Exception e) {
+ e.printStackTrace();
+ System.out.println("redis connection fail");
+ }
+ System.out.println("redis connection success");
+ return newJedis;
+ }
+
+ /**
+ * get jedis connection
+ *
+ * @return jedis connection
+ */
+ public Jedis getJedis() {
+ return jedis;
+ }
+
+ public void setJedisAndExpire(Jedis jedis) {
+ this.jedis = jedis;
+ threadLocal.set(jedis);
+ // jedis expire time(s)
+ jedisExpireTime = Integer.valueOf(PropertiesReader.getKey("jedis.expireTime"));
+ System.out.println("redisUtil sets up a redis connection");
+ }
+
+ /**
+ * set key
+ *
+ * @param key key
+ * @param value value
+ *
+ */
+
+ public void setKey(String key, String value) {
+ jedis.set(key, value);
+ // set expire time 1h
+ jedis.expire(key, jedisExpireTime);
+ }
+
+ /**
+ * get key
+ *
+ * @param key key
+ * @return value
+ */
+ public String getKey(String key) {
+ return jedis.get(key);
+ }
+
+ /**
+ * Return jedis connection
+ */
+ public void returnJedis() {
+ if (jedis != null) {
+ jedis.close();
+ }
+ System.out.println("jedis has been returned");
+ }
+}
diff --git a/e2e/src/test/java/org/apache/dolphinscheduler/base/BaseDriver.java b/e2e/src/test/java/org/apache/dolphinscheduler/base/BaseDriver.java
new file mode 100644
index 0000000000..7d3ab9b837
--- /dev/null
+++ b/e2e/src/test/java/org/apache/dolphinscheduler/base/BaseDriver.java
@@ -0,0 +1,150 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.dolphinscheduler.base;
+
+
+import org.apache.dolphinscheduler.constant.TestConstant;
+import org.apache.dolphinscheduler.util.PropertiesReader;
+import org.openqa.selenium.JavascriptExecutor;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.chrome.ChromeDriver;
+import org.openqa.selenium.chrome.ChromeOptions;
+import java.io.IOException;
+import java.util.concurrent.TimeUnit;
+import org.openqa.selenium.PageLoadStrategy;
+
+
+/**
+ * base driver class
+ */
+public class BaseDriver {
+ /**
+ * driver
+ */
+ private WebDriver driver;
+
+ /**
+ * chrome driver path
+ */
+ private String chromeDriverPath;
+
+
+ /**
+ * implicitly wait time(s)
+ */
+ private long implicitlyWait;
+
+ /**
+ * page load timeout(s)
+ */
+ private long pageLoadTimeout;
+
+ /**
+ * script Timeout(s)
+ */
+ private long setScriptTimeout;
+
+
+ /**
+ * Local thread storage is used to store the driver
+ */
+ public static ThreadLocal threadLocal = new ThreadLocal<>();
+
+ /**
+ *Initialization parameters
+ */
+ public BaseDriver() throws IOException {
+ /* driver test class path */
+ chromeDriverPath = PropertiesReader.getKey("driver.chromeDriver");
+
+ /* wait time */
+ implicitlyWait = Long.valueOf(PropertiesReader.getKey("driver.timeouts.implicitlyWait"));
+ pageLoadTimeout = Long.valueOf(PropertiesReader.getKey("driver.timeouts.pageLoadTimeout"));
+ setScriptTimeout = Long.valueOf(PropertiesReader.getKey("driver.timeouts.setScriptTimeout"));
+ }
+
+
+ /**
+ * start chrome browser
+ */
+ public void startBrowser() throws Exception {
+ // set chrome driver
+ System.setProperty("webdriver.chrome.driver", chromeDriverPath);
+ ChromeOptions chromeOptions = new ChromeOptions();
+ chromeOptions.setPageLoadStrategy(PageLoadStrategy.NONE);
+ chromeOptions.addArguments("--no-sandbox");
+ chromeOptions.addArguments("--disable-dev-shm-usage");
+ chromeOptions.addArguments("--headless");
+ chromeOptions.addArguments("--disable-gpu");
+ chromeOptions.addArguments("--whitelisted-ips");
+ chromeOptions.addArguments("--disable-infobars");
+ chromeOptions.addArguments("--disable-browser-side-navigation");
+ driver = new ChromeDriver(chromeOptions);
+
+ /* driver setting wait time */
+ // implicitly wait time
+ driver.manage().timeouts().implicitlyWait(implicitlyWait, TimeUnit.SECONDS);
+
+ // page load timeout
+ driver.manage().timeouts().pageLoadTimeout(pageLoadTimeout, TimeUnit.SECONDS);
+
+ // page load timeout
+ driver.manage().timeouts().pageLoadTimeout(pageLoadTimeout, TimeUnit.SECONDS);
+
+ // script timeout
+ driver.manage().timeouts().setScriptTimeout(setScriptTimeout, TimeUnit.SECONDS);
+
+ // window maximize
+ driver.manage().window().maximize();
+
+ // set threadLocal
+ threadLocal.set(driver);
+ }
+
+ /**
+ * get webDriver
+ *
+ * @return driver
+ */
+ public WebDriver getDriver() {
+ return driver;
+ }
+
+ /**
+ * set webDriver
+ *
+ * @param driver driver
+ */
+ public void setDriver(WebDriver driver) {
+ this.driver = driver;
+ // Thread local storage
+ threadLocal.set(driver);
+ }
+
+ /**
+ * close browser
+ */
+ public void closeBrowser() throws InterruptedException {
+ // JS Show a pop-up box to indicate the end of the test
+ Thread.sleep(TestConstant.ONE_THOUSANG);
+ ((JavascriptExecutor) driver).executeScript("alert('Test completed, browser closes after 3s')");
+ Thread.sleep(TestConstant.THREE_THOUSANG);
+ if (driver != null) {
+ driver.quit();
+ }
+ }
+}
diff --git a/e2e/src/test/java/org/apache/dolphinscheduler/base/BaseTest.java b/e2e/src/test/java/org/apache/dolphinscheduler/base/BaseTest.java
new file mode 100644
index 0000000000..c12c19fc1d
--- /dev/null
+++ b/e2e/src/test/java/org/apache/dolphinscheduler/base/BaseTest.java
@@ -0,0 +1,107 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.dolphinscheduler.base;
+
+
+import org.apache.dolphinscheduler.page.LoginPage;
+import org.apache.dolphinscheduler.util.PropertiesReader;
+import org.openqa.selenium.WebDriver;
+import org.testng.annotations.*;
+
+import java.io.IOException;
+import java.util.Properties;
+
+/**
+ * base test class
+ */
+public class BaseTest {
+ /**
+ * properties
+ */
+ private static Properties properties;
+
+
+ /**
+ * baseDriver
+ */
+ private BaseDriver baseDriver;
+
+ /**
+ * driver
+ */
+ public WebDriver driver;
+
+ /**
+ * Executed before executing a test suite
+ * Read the test configuration file
+ *
+ * @param propertiesPath properties path
+ * @throws IOException IOException
+ */
+ @BeforeSuite(alwaysRun = true)
+ @Parameters({"propertiesPath"})
+ public void beforeSuite(@Optional("src/test/resources/config/config.properties") String propertiesPath) throws IOException {
+ // read properties
+ properties = PropertiesReader.readProperties(propertiesPath);
+ }
+
+ /**
+ * Executed before executing a testcase
+ */
+ @BeforeTest(alwaysRun = true)
+ public void beforeTest() throws Exception {
+ //base driver
+ baseDriver = new BaseDriver();
+ baseDriver.startBrowser();
+ driver = baseDriver.getDriver();
+ }
+
+ /**
+ * Executed before executing a class method in a test case
+ */
+ @BeforeClass(alwaysRun = true)
+ public void setUp() throws IOException, InterruptedException {
+ LoginPage loginPage = new LoginPage(driver);
+ loginPage.jumpPage();
+ loginPage.login();
+ }
+
+
+ /**
+ * Execute after executing a class method in a test case
+ */
+ @AfterClass(alwaysRun = true)
+ public void afterClass() {
+ // logout
+ }
+
+ /**
+ * Execute after executing a testcase
+ */
+ @AfterTest(alwaysRun = true)
+ public void afterTest() throws InterruptedException {
+ // close browser
+ baseDriver.closeBrowser();
+ }
+
+ /**
+ * Execute after executing a testsuite
+ */
+ @AfterSuite(alwaysRun = true)
+ public void afterSuite() {
+ }
+}
\ No newline at end of file
diff --git a/e2e/src/test/java/org/apache/dolphinscheduler/common/BrowserCommon.java b/e2e/src/test/java/org/apache/dolphinscheduler/common/BrowserCommon.java
new file mode 100644
index 0000000000..072ccb652e
--- /dev/null
+++ b/e2e/src/test/java/org/apache/dolphinscheduler/common/BrowserCommon.java
@@ -0,0 +1,374 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.dolphinscheduler.common;
+
+import org.apache.dolphinscheduler.util.PropertiesReader;
+import org.apache.dolphinscheduler.util.RedisUtil;
+import org.openqa.selenium.*;
+import org.openqa.selenium.interactions.Actions;
+import org.openqa.selenium.support.ui.ExpectedConditions;
+import org.openqa.selenium.support.ui.WebDriverWait;
+import redis.clients.jedis.Jedis;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * Encapsulate the most basic operations on the interface in the browser
+ */
+public class BrowserCommon {
+ /**
+ * driver
+ */
+ protected WebDriver driver;
+
+ /**
+ * actions
+ */
+ protected Actions actions;
+
+ /**
+ * Javascript
+ */
+ protected JavascriptExecutor je;
+
+ /**
+ * Show wait
+ */
+ protected WebDriverWait wait;
+
+ /**
+ * Jedis
+ */
+ protected Jedis jedis;
+
+ /**
+ * redis util
+ */
+ protected RedisUtil redisUtil;
+
+ /**
+ * @param driver driver
+ */
+ public BrowserCommon(WebDriver driver) {
+ this.driver = driver;
+ this.actions = new Actions(driver);
+ this.je = ((JavascriptExecutor) driver);
+ // show wait timeout
+ long timeout = Long.valueOf(PropertiesReader.getKey("driver.timeouts.webDriverWait"));
+ wait = new WebDriverWait(driver, timeout);
+ }
+
+ /**
+ * @param driver driver
+ * @param jedis jedis
+ */
+ public BrowserCommon(WebDriver driver, Jedis jedis) {
+ this.driver = driver;
+ this.actions = new Actions(driver);
+ this.je = ((JavascriptExecutor) driver);
+ // show wait timeout
+ long timeout = Long.valueOf(PropertiesReader.getKey("driver.timeouts.webDriverWait"));
+ wait = new WebDriverWait(driver, timeout);
+ this.jedis = jedis;
+ }
+
+ /**
+ * @param driver driver
+ * @param redisUtil redisUtil
+ */
+ public BrowserCommon(WebDriver driver, RedisUtil redisUtil) {
+ this.driver = driver;
+ this.actions = new Actions(driver);
+ this.je = ((JavascriptExecutor) driver);
+ // show wait timeout
+ long timeout = Long.valueOf(PropertiesReader.getKey("driver.timeouts.webDriverWait"));
+ wait = new WebDriverWait(driver, timeout);
+ }
+
+
+ /**
+ * Get WebElement element object through element positioning
+ *
+ * @param locator By
+ * @return WebElement
+ */
+
+ public WebElement locateElement(By locator) {
+ return wait.until(ExpectedConditions.presenceOfElementLocated(locator));
+ }
+
+ /**
+ * Click button element
+ * @param locator By
+ * @return clickButton
+ */
+ public WebElement clickButton(By locator) {
+ WebElement buttonElement = locateElement(locator);
+ wait.until(ExpectedConditions.elementToBeClickable(locator));
+ ExpectedConditions.elementToBeClickable(locator);
+ buttonElement.click();
+ return buttonElement;
+ }
+
+ /**
+ * Click element
+ *
+ * @param locator By
+ * @return inputElement
+ */
+ public WebElement clickElement(By locator) {
+ WebElement clickElement = locateElement(locator);
+ clickElement.click();
+ return clickElement;
+ }
+
+ /**
+ * input element
+ *
+ * @param locator By
+ * @param content Input content
+ * @return inputElement
+ */
+ public WebElement sendInput(By locator, String content) {
+ WebElement inputElement = locateElement(locator);
+ inputElement.clear();
+ inputElement.sendKeys(content);
+ return inputElement;
+ }
+ /**
+ * clear element
+ *
+ * @param locator By
+ */
+ public WebElement clearInput(By locator) {
+ WebElement clearElement = locateElement(locator);
+ clearElement.click();
+ clearElement.sendKeys(Keys.chord(Keys.CONTROL, "a"));
+ clearElement.sendKeys(Keys.BACK_SPACE);
+ return clearElement;
+ }
+
+ /**
+ * input codeMirror
+ *
+ * @param codeMirrorLocator By codeMirror
+ * @param codeMirrorLineLocator By codeMirrorLine
+
+ */
+ public void inputCodeMirror(By codeMirrorLocator,By codeMirrorLineLocator,String content) {
+ WebElement codeMirrorElement = locateElement(codeMirrorLocator);
+ WebElement codeMirrorLineElement = locateElement(codeMirrorLineLocator);
+ codeMirrorElement.click();
+ codeMirrorLineElement.sendKeys(content);
+ }
+
+ /**
+ * move to element
+ * @param locator BY
+ * @return actions
+ */
+ public Actions moveToElement(By locator){
+ return actions.moveToElement(locateElement(locator));
+ }
+
+ /**
+ * mouse drag element
+ *
+ * @param source_locator BY
+ * @param target_locator BY
+ */
+ public void dragAndDrop(By source_locator, By target_locator){
+ WebElement sourceElement = locateElement(source_locator);
+ WebElement targetElement = locateElement(target_locator);
+ actions.dragAndDrop(sourceElement, targetElement).perform();
+ actions.release();
+ }
+
+ public void moveToDragElement(By target_locator, int X, int Y){
+ WebElement targetElement = locateElement(target_locator);
+ actions.dragAndDropBy(targetElement, X, Y).perform();
+ actions.release();
+ }
+
+
+ /**
+ * jump page
+ *
+ * @param url url
+ */
+ public void jumpPage(String url) {
+ driver.get(url);
+ }
+
+
+ /**
+ * Find the next handle, recommended for two windows
+ *
+ * @return driver
+ */
+ public WebDriver switchNextHandle() {
+ // Current window handle
+ String currentHandle = driver.getWindowHandle();
+ // All window handle
+ Set allHandles = driver.getWindowHandles();
+ // Finding the next handle
+ for (String handle : allHandles) {
+ if (!handle.equals(currentHandle)) {
+ return driver.switchTo().window(handle);
+ }
+ }
+ return driver;
+ }
+
+ /**
+ * Multi-window switch handle, according to the handle number passed in
+ *
+ * @param num Number starts from 1
+ * @return driver
+ */
+ public WebDriver switchHandle(int num) {
+ // current handle
+ String currentHandle = driver.getWindowHandle();
+ // all handle
+ Set allHandlesSet = driver.getWindowHandles();
+ List allHandlesList = new ArrayList<>(allHandlesSet);
+ // switch handle
+ return driver.switchTo().window(allHandlesList.get(num - 1));
+ }
+
+ /**
+ * Switch frame structure
+ *
+ * @param locator frame
+ * @return driver
+ */
+ public WebDriver switchFrame(By locator) {
+ return driver.switchTo().frame(locateElement(locator));
+ }
+
+ /**
+ * Switch parent frame structure
+ *
+ * @return driver
+ */
+ public WebDriver switchParentFrame() {
+ return driver.switchTo().parentFrame();
+ }
+
+ /**
+ * Switch out of frame structure
+ *
+ * @return driver
+ */
+ public WebDriver switchOutOfFrame() {
+ return driver.switchTo().defaultContent();
+ }
+
+
+ /**
+ * execute JS Script
+ *
+ * @param script JS script
+ */
+ public void executeScript(String script) {
+ je.executeScript(script);
+ }
+
+ /**
+ * execute JS Script
+ *
+ * @param script JS script
+ * @param args Object element array
+ */
+ public void executeScript(String script, Object... args) {
+ je.executeScript(script, args);
+ }
+
+ /**
+ * Page slide to top
+ */
+ public void scrollToTop() {
+ executeScript("window.scrollTo(0, 0)");
+ }
+
+ /**
+ * Page slides to the bottom
+ */
+ public void scrollToBottom() {
+ executeScript("window.scrollTo(0, document.body.scrollHeight)");
+ }
+
+ public void scrollToElementBottom() {
+
+ WebElement webElement = driver.findElement(By.xpath("/html/body/div[4]/div/div[2]/div/div[2]/div/div[7]/div[3]"));
+ ((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView(true);", webElement);
+ }
+
+
+ /**
+ * Page swipe makes the top of the element align with the top of the page
+ *
+ * @param by Elements that need to be aligned with the top of the page
+ */
+ public void scrollElementTopToTop(By by) {
+ executeScript("arguments[0].scrollIntoView(true);", driver.findElement(by));
+ }
+
+ /**
+ * Page sliding makes the bottom of the element aligned with the bottom of the page
+ *
+ * @param by Elements that need to be aligned with the bottom of the page
+ */
+ public void scrollElementBottomToBottom(By by) {
+ executeScript("arguments[0].scrollIntoView(false);", driver.findElement(by));
+ }
+
+
+ /**
+ * Determine if the current page title is the specified title
+ *
+ * @param title title
+ * @return boolean
+ */
+
+ public boolean ifTitleIs(String title) {
+ return wait.until(ExpectedConditions.titleIs(title));
+ }
+
+ /**
+ * Determines whether the current page title contains the specified text
+ *
+ * @param text text
+ * @return boolean
+ */
+ public boolean ifTitleContains(String text) {
+ return wait.until(ExpectedConditions.titleContains(text));
+ }
+
+ /**
+ * Determines whether the text value of an element on the current page is the specified text
+ *
+ * @param locator By
+ * @param text text
+ * @return boolean
+ */
+ public boolean ifTextExists(By locator, String text) {
+ return wait.until(ExpectedConditions.textToBePresentInElementLocated(locator, text));
+ }
+}
diff --git a/e2e/src/test/java/org/apache/dolphinscheduler/common/PageCommon.java b/e2e/src/test/java/org/apache/dolphinscheduler/common/PageCommon.java
new file mode 100644
index 0000000000..72dc03a77c
--- /dev/null
+++ b/e2e/src/test/java/org/apache/dolphinscheduler/common/PageCommon.java
@@ -0,0 +1,50 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.dolphinscheduler.common;
+
+import org.apache.dolphinscheduler.util.RedisUtil;
+import org.openqa.selenium.WebDriver;
+import redis.clients.jedis.Jedis;
+
+
+/**
+ * Encapsulate the operation methods that can be used for each module page
+ */
+public class PageCommon extends BrowserCommon {
+ /**
+ * @param driver driver
+ */
+ public PageCommon(WebDriver driver) {
+ super(driver);
+ }
+
+ /**
+ * @param driver driver
+ * @param jedis jedis
+ */
+ public PageCommon(WebDriver driver, Jedis jedis) {
+ super(driver, jedis);
+ }
+
+ /**
+ * @param driver driver
+ * @param redisUtil redisUtil
+ */
+ public PageCommon(WebDriver driver, RedisUtil redisUtil) {
+ super(driver, redisUtil);
+ }
+}
diff --git a/e2e/src/test/java/org/apache/dolphinscheduler/data/LoginData.java b/e2e/src/test/java/org/apache/dolphinscheduler/data/LoginData.java
new file mode 100644
index 0000000000..532849565c
--- /dev/null
+++ b/e2e/src/test/java/org/apache/dolphinscheduler/data/LoginData.java
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.dolphinscheduler.data;
+
+import org.apache.dolphinscheduler.util.PropertiesReader;
+
+/**
+ * Landing page object: data
+ */
+
+public class LoginData {
+ /**
+ * Login URL
+ */
+ public static final String URL = PropertiesReader.getKey("LOGIN_URL");
+
+
+ /**
+ * Login username
+ */
+ public static final String USER = PropertiesReader.getKey("USER_NAME");
+
+ /**
+ * Login password
+ */
+ public static final String PASSWORD = PropertiesReader.getKey("PASSWORD");
+
+ public static final String TENANT = "Tenant Manage - DolphinScheduler";
+}
diff --git a/e2e/src/test/java/org/apache/dolphinscheduler/data/project/CreatProjectData.java b/e2e/src/test/java/org/apache/dolphinscheduler/data/project/CreatProjectData.java
new file mode 100644
index 0000000000..8f6c9c8e97
--- /dev/null
+++ b/e2e/src/test/java/org/apache/dolphinscheduler/data/project/CreatProjectData.java
@@ -0,0 +1,26 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.dolphinscheduler.data.project;
+
+public class CreatProjectData {
+ // create project name
+ public static final String PROJECT_NAME = "selenium_project";
+ // create project description
+ public static final String DESCRIPTION = "test create project description";
+ // project page title
+ public static final String PROJECT_TITLE = "项目 - DolphinScheduler";
+}
diff --git a/e2e/src/test/java/org/apache/dolphinscheduler/data/project/CreatWorkflowData.java b/e2e/src/test/java/org/apache/dolphinscheduler/data/project/CreatWorkflowData.java
new file mode 100644
index 0000000000..765a54f406
--- /dev/null
+++ b/e2e/src/test/java/org/apache/dolphinscheduler/data/project/CreatWorkflowData.java
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.dolphinscheduler.data.project;
+
+public class CreatWorkflowData {
+ //input shell task name
+ public static final String SHELL_TASK_NAME = "shell task description test";
+
+ //input shell task description
+ public static final String SHELL_TASK_DESCRIPTION = "shell task description test";
+
+ //input timeout
+ public static final String INPUT_TIMEOUT = "60";
+
+ //input shell script
+ public static final String SHELL_SCRIPT = "echo 1111111";
+
+ //input custom parameters
+ public static final String INPUT_CUSTOM_PARAMETERS = "selenium_parameter";
+
+ //input custom parameters value
+ public static final String INPUT_CUSTOM_PARAMETERS_VALUE = "selenium_parameter_123";
+
+ //input add custom parameters
+ public static final String INPUT_ADD_CUSTOM_PARAMETERS = "selenium_parameter_delete";
+
+ //input add custom parameters value
+ public static final String INPUT_ADD_CUSTOM_PARAMETERS_VALUE = "selenium_parameter_delete_456";
+
+ //create workflow title
+ public static final String WORKFLOW_TITLE = "创建流程定义 - DolphinScheduler";
+}
diff --git a/e2e/src/test/java/org/apache/dolphinscheduler/data/security/TenantManageData.java b/e2e/src/test/java/org/apache/dolphinscheduler/data/security/TenantManageData.java
new file mode 100644
index 0000000000..e6f6ee6b86
--- /dev/null
+++ b/e2e/src/test/java/org/apache/dolphinscheduler/data/security/TenantManageData.java
@@ -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.
+ */
+
+/**
+ * Tenant page object: data
+ */
+package org.apache.dolphinscheduler.data.security;
+
+import org.apache.dolphinscheduler.data.LoginData;
+
+public class TenantManageData {
+ /**
+ * Tenant URL
+ */
+ public static final String TENANAT_URL = LoginData.URL + "/ui/#/security/tenant";
+
+ /**
+ * Tenant Code
+ */
+ public static final String TENANAT_CODE = "dolphinscheduler_tenant_code2";
+
+ /**
+ * Tenant Name
+ */
+ public static final String TENANAT_NAME = "dolphinscheduler_tenant_Name";
+
+ /**
+ * Queue
+ */
+ public static final String QUEUE = "default";
+
+ /**
+ * Description
+ */
+ public static final String DESCRIPTION = "creat tenant test";
+
+ public static final String TENANAT_MANAGE = "Tenant Manage - DolphinScheduler";
+
+
+
+}
diff --git a/e2e/src/test/java/org/apache/dolphinscheduler/data/security/UserManageData.java b/e2e/src/test/java/org/apache/dolphinscheduler/data/security/UserManageData.java
new file mode 100644
index 0000000000..03c985fd81
--- /dev/null
+++ b/e2e/src/test/java/org/apache/dolphinscheduler/data/security/UserManageData.java
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.dolphinscheduler.data.security;
+
+import org.apache.dolphinscheduler.data.LoginData;
+
+public class UserManageData {
+ public static final String USER_URL = LoginData.URL + "/ui/#/security/users";
+
+ public static final String USERNAME = "selenium111";
+
+ public static final String PASSWORD = "123456qwe";
+
+ public static final String EMAIL = "123456789@qq.com";
+
+ public static final String PHONE = "15811112222";
+
+ public static final String USER_MANAGE = "用户管理 - DolphinScheduler";
+
+}
diff --git a/e2e/src/test/java/org/apache/dolphinscheduler/locator/LoginLocator.java b/e2e/src/test/java/org/apache/dolphinscheduler/locator/LoginLocator.java
new file mode 100644
index 0000000000..32a82bbbc8
--- /dev/null
+++ b/e2e/src/test/java/org/apache/dolphinscheduler/locator/LoginLocator.java
@@ -0,0 +1,33 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.dolphinscheduler.locator;
+
+import org.openqa.selenium.By;
+
+/**
+ * Page object: element positioning
+ */
+
+public class LoginLocator {
+ public static final By LOGIN_INPUT_USER = By.xpath("//input[@class='input-element suffix']");
+
+ public static final By LOGIN_INPUT_PASSWORD = By.xpath("//input[@class='input-element suffix']");
+
+ public static final By LOGIN_BUTTON = By.xpath("//button");
+
+ public static final By LOGIN_BUTTON_MOVE = By.xpath("//button[contains(.,' Loading...')]");
+}
diff --git a/e2e/src/test/java/org/apache/dolphinscheduler/locator/project/CreateProjectLocator.java b/e2e/src/test/java/org/apache/dolphinscheduler/locator/project/CreateProjectLocator.java
new file mode 100644
index 0000000000..d2c0d8412c
--- /dev/null
+++ b/e2e/src/test/java/org/apache/dolphinscheduler/locator/project/CreateProjectLocator.java
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.dolphinscheduler.locator.project;
+
+import org.openqa.selenium.By;
+
+public class CreateProjectLocator {
+ //click project manage
+ public static final By PROJECT_MANAGE = By.xpath("//div[2]/div/a/span");
+
+ //click create project button
+ public static final By CREATE_PROJECT_BUTTON = By.xpath("//button/span");
+
+ //input project name
+ public static final By PROJECT_NAME = By.xpath("//div[2]/div/div/div[2]/div/input");
+
+ //input project description
+ public static final By PROJECT_DESCRIPTION = By.xpath("//textarea");
+
+ //submit button
+ public static final By SUBMIT_BUTTON = By.xpath("//div[3]/button[2]/span");
+}
diff --git a/e2e/src/test/java/org/apache/dolphinscheduler/locator/project/CreateWorkflowLocator.java b/e2e/src/test/java/org/apache/dolphinscheduler/locator/project/CreateWorkflowLocator.java
new file mode 100644
index 0000000000..f063d6ef61
--- /dev/null
+++ b/e2e/src/test/java/org/apache/dolphinscheduler/locator/project/CreateWorkflowLocator.java
@@ -0,0 +1,115 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.dolphinscheduler.locator.project;
+
+import org.openqa.selenium.By;
+
+public class CreateWorkflowLocator {
+ // click project name
+ public static final By CLICK_PROJECT_NAME = By.xpath("//span/a");
+
+ // click workflow define
+ public static final By CLICK_WORKFLOW_DEFINE = By.xpath("//li/span");
+
+ // click create workflow button
+ public static final By CLICK_CREATE_WORKFLOW_BUTTON = By.xpath("//button/span");
+
+ //mouse down at shell
+ public static final By MOUSE_DOWN_AT_SHELL = By.xpath("//div[@id='SHELL']/div/div");
+
+ //mouse down at spark
+ public static final By MOUSE_DOWN_AT_SPARK = By.xpath("//div[5]/div/div");
+
+ //mouse move at DAG
+ public static final By MOUSE_MOVE_SHELL_AT_DAG = By.xpath("//div[@id='canvas']");
+
+ //input shell task _name
+ public static final By INPUT_SHELL_TASK_NAME = By.xpath("//input");
+
+ //click stop run type
+ public static final By CLICK_STOP_RUN_TYPE = By.xpath("//label[2]/span/input");
+
+ //click normal run type
+ public static final By CLICK_NORMAL_RUN_TYPE = By.xpath("//span/input");
+
+ //input shell task description
+ public static final By INPUT_SHELL_TASK_DESCRIPTION = By.xpath("//label/div/textarea");
+
+ //click task priority
+ public static final By CLICK_TASK_PRIORITY = By.xpath("//span/div/div/div/div/div");
+
+ //select task priority
+ public static final By SELECT_TASK_PRIORITY = By.xpath("//li[2]/li/span");
+
+ //click work group
+ public static final By CLICK_WORK_GROUP = By.xpath("//div/div/input");
+
+ //select work group
+ public static final By SELECT_WORK_GROUP = By.xpath("//div[4]/div[2]/div/div[1]/div/input");
+
+ //select number of failed retries
+ public static final By SELECT_FAIL_RETRIES_NUMBER = By.xpath("//div[5]/div[2]/div[1]/div[1]/div/input");
+
+ //select failed retry interval
+ public static final By SELECT_FAIL_RETRIES_INTERVAL = By.xpath("//div[5]/div[2]/div[2]/div[1]/div/input");
+
+ //click timeout alarm
+ public static final By CLICK_TIMEOUT_ALARM = By.xpath("//label/div/span/span");
+
+ //select timeout fail
+ public static final By SELECT_TIMEOUT_FAIL = By.xpath("//div/div/label[2]/span/input");
+
+ //cancel timeout alarm
+ public static final By CANCEL_TIMEOUT_ALARM = By.xpath("//div/div/label/span/input");
+
+ //select timeout alarm
+ public static final By SELECT_TIMEOUT_ALARM = By.xpath("//div/div/label/span/input");
+
+ //input timeout
+ public static final By SELECT_TIMEOUT = By.xpath("//div[3]/div[2]/label/div/input");
+
+ //click codeMirror
+ public static final By CLICK_CODE_MIRROR = By.xpath("//div[5]/div/pre");
+
+ //input script
+ public static final By INPUT_SCRIPT = By.xpath("//div[2]/div/div/div/div/div/textarea");
+
+ //click custom parameters
+ public static final By CLICK_CUSTOM_PARAMETERS = By.xpath("//span/a/em");
+
+ //input custom parameters
+ public static final By INPUT_CUSTOM_PARAMETERS = By.xpath("//div[2]/div/div/div/div/div/input");
+
+ //input custom parameters value
+ public static final By INPUT_CUSTOM_PARAMETERS_VALUE = By.xpath("//div[2]/input");
+
+ //click add custom parameters
+ public static final By CLICK_ADD_CUSTOM_PARAMETERS = By.xpath("//span[2]/a/em");
+
+ //input add custom parameters
+ public static final By INPUT_ADD_CUSTOM_PARAMETERS = By.xpath("//div[2]/div/div/div/div[2]/div/input");
+
+ //input add custom parameters value
+ public static final By INPUT_ADD_CUSTOM_PARAMETERS_VALUE = By.xpath("//div[2]/div[2]/input");
+
+ //delete custom parameters
+ public static final By CLICK_DELETE_CUSTOM_PARAMETERS = By.xpath("//div[2]/span/a/em");
+
+ //click submit button
+ public static final By CLICK_SUBMIT_BUTTON = By.xpath("//button[2]/span");
+}
diff --git a/e2e/src/test/java/org/apache/dolphinscheduler/locator/security/TenantManageLocator.java b/e2e/src/test/java/org/apache/dolphinscheduler/locator/security/TenantManageLocator.java
new file mode 100644
index 0000000000..7d9c8a57ce
--- /dev/null
+++ b/e2e/src/test/java/org/apache/dolphinscheduler/locator/security/TenantManageLocator.java
@@ -0,0 +1,33 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.dolphinscheduler.locator.security;
+
+import org.openqa.selenium.By;
+
+public class TenantManageLocator{
+ public static final By CREATE_TENANT_BUTTON = By.xpath("//button[@class='ans-btn ans-btn-ghost ans-btn-small']");
+
+ public static final By TENANT_INPUT_CODE = By.xpath("//div[2]/div/div/div[2]/div/input");
+
+ public static final By TENANT_INPUT_NAME = By.xpath("//div[2]/div[2]/div/input");
+
+ public static final By QUEUE = By.xpath("//textarea");
+
+ public static final By DESCRIPTION = By.xpath("//textarea");
+
+ public static final By SUBMIT_BUTTON = By.xpath("//div[3]/button[2]/span");
+}
diff --git a/e2e/src/test/java/org/apache/dolphinscheduler/locator/security/UserManageLocator.java b/e2e/src/test/java/org/apache/dolphinscheduler/locator/security/UserManageLocator.java
new file mode 100644
index 0000000000..0d84692cb2
--- /dev/null
+++ b/e2e/src/test/java/org/apache/dolphinscheduler/locator/security/UserManageLocator.java
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.dolphinscheduler.locator.security;
+
+import org.openqa.selenium.By;
+
+public class UserManageLocator {
+
+ public static final By CLICK_USER_MANAGE = By.xpath("//div[3]/div/a/div/a/span");
+
+ public static final By CLICK_CREATE_USER_BUTTON = By.xpath("//span[contains(.,'创建用户')]");
+
+ public static final By INPUT_USERNAME = By.xpath("//div[2]/div/div/div[2]/div/input");
+
+ public static final By INPUT_PASSWORD = By.xpath("//div[2]/div[2]/div/input");
+
+ public static final By CLICK_TENANT = By.xpath("//div[3]/div[2]/div/div/div/input");
+
+ public static final By SELECT_TENANT = By.xpath("//div[3]/div[2]/div/div[2]/div/div/div/ul/li/span");
+
+ public static final By CLICK_QUEUE = By.xpath("//div[4]/div[2]/div/div/div/input");
+
+ public static final By SELECT_QUEUE = By.xpath("//div[4]/div[2]/div/div[2]/div/div/div/ul/li/span");
+
+ public static final By TENANT_INPUT_EMAIL = By.xpath("//div[5]/div[2]/div/input");
+
+ public static final By TENANT_INPUT_PHONE = By.xpath("//div[6]/div[2]/div/input");
+
+ public static final By SUBMIT = By.xpath("//div[3]/button[2]/span");
+
+}
diff --git a/e2e/src/test/java/org/apache/dolphinscheduler/page/LoginPage.java b/e2e/src/test/java/org/apache/dolphinscheduler/page/LoginPage.java
new file mode 100644
index 0000000000..cd6b318651
--- /dev/null
+++ b/e2e/src/test/java/org/apache/dolphinscheduler/page/LoginPage.java
@@ -0,0 +1,65 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.dolphinscheduler.page;
+
+import org.apache.dolphinscheduler.common.PageCommon;
+import org.apache.dolphinscheduler.constant.TestConstant;
+import org.apache.dolphinscheduler.data.LoginData;
+import org.apache.dolphinscheduler.locator.LoginLocator;
+import org.apache.dolphinscheduler.util.RedisUtil;
+import org.openqa.selenium.WebDriver;
+
+
+
+public class LoginPage extends PageCommon {
+ /**
+ * Unique constructor
+ * @param driver driver
+ */
+ public LoginPage(WebDriver driver) {
+ super(driver);
+ }
+
+
+ /**
+ * jump page
+ */
+ public void jumpPage() {
+ System.out.println("jump login page");
+ super.jumpPage(LoginData.URL);
+ }
+
+ /**
+ * login
+ *
+ * @return Whether to enter the specified page after searching
+ */
+ public boolean login() throws InterruptedException {
+ System.out.println("LoginPage");
+ // login data
+ sendInput(LoginLocator.LOGIN_INPUT_USER, LoginData.USER);
+ sendInput(LoginLocator.LOGIN_INPUT_PASSWORD, LoginData.PASSWORD);
+
+ // click login button
+ clickButton(LoginLocator.LOGIN_BUTTON);
+
+ moveToElement(LoginLocator.LOGIN_BUTTON_MOVE);
+
+ // Whether to enter the specified page after login
+ return ifTitleContains(LoginData.TENANT);
+ }
+}
diff --git a/e2e/src/test/java/org/apache/dolphinscheduler/page/project/CreateProjectPage.java b/e2e/src/test/java/org/apache/dolphinscheduler/page/project/CreateProjectPage.java
new file mode 100644
index 0000000000..8dd1010a82
--- /dev/null
+++ b/e2e/src/test/java/org/apache/dolphinscheduler/page/project/CreateProjectPage.java
@@ -0,0 +1,58 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.dolphinscheduler.page.project;
+
+import org.apache.dolphinscheduler.common.PageCommon;
+import org.apache.dolphinscheduler.constant.TestConstant;
+import org.apache.dolphinscheduler.data.project.CreatProjectData;
+import org.apache.dolphinscheduler.locator.project.CreateProjectLocator;
+import org.openqa.selenium.WebDriver;
+
+public class CreateProjectPage extends PageCommon {
+ public CreateProjectPage(WebDriver driver) {
+ super(driver);
+ }
+ /**
+ * jump page
+ */
+ public void jumpProjectManagePage() throws InterruptedException {
+ Thread.sleep(TestConstant.ONE_THOUSANG);
+ clickElement(CreateProjectLocator.PROJECT_MANAGE);
+ Thread.sleep(TestConstant.ONE_THOUSANG);
+ }
+
+ /**
+ * creatTenant
+ *
+ * @return Whether to enter the specified page after creat tenant
+ */
+ public boolean createProject() throws InterruptedException {
+ //click create project
+ clickElement(CreateProjectLocator.CREATE_PROJECT_BUTTON);
+ Thread.sleep(TestConstant.ONE_THOUSANG);
+
+ // input create project data
+ sendInput(CreateProjectLocator.PROJECT_NAME, CreatProjectData.PROJECT_NAME);
+ sendInput(CreateProjectLocator.PROJECT_DESCRIPTION, CreatProjectData.DESCRIPTION);
+
+ // click submit button
+ clickButton(CreateProjectLocator.SUBMIT_BUTTON);
+
+ // Whether to enter the specified page after submit
+ return ifTitleContains(CreatProjectData.PROJECT_TITLE);
+ }
+}
diff --git a/e2e/src/test/java/org/apache/dolphinscheduler/page/project/CreateWorkflowPage.java b/e2e/src/test/java/org/apache/dolphinscheduler/page/project/CreateWorkflowPage.java
new file mode 100644
index 0000000000..aeec83cd19
--- /dev/null
+++ b/e2e/src/test/java/org/apache/dolphinscheduler/page/project/CreateWorkflowPage.java
@@ -0,0 +1,137 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.dolphinscheduler.page.project;
+
+import org.apache.dolphinscheduler.common.PageCommon;
+import org.apache.dolphinscheduler.constant.TestConstant;
+import org.apache.dolphinscheduler.data.project.CreatWorkflowData;
+import org.apache.dolphinscheduler.locator.project.CreateWorkflowLocator;
+import org.openqa.selenium.WebDriver;
+
+public class CreateWorkflowPage extends PageCommon {
+ public CreateWorkflowPage(WebDriver driver) {
+ super(driver);
+ }
+ /**
+ * jump page
+ */
+
+ public boolean createWorkflow() throws InterruptedException {
+ // click project name
+ clickElement(CreateWorkflowLocator.CLICK_PROJECT_NAME);
+ Thread.sleep(TestConstant.ONE_THOUSANG);
+
+
+ // click workflow define
+ clickElement(CreateWorkflowLocator.CLICK_WORKFLOW_DEFINE);
+ Thread.sleep(TestConstant.ONE_THOUSANG);
+
+ // click create workflow button
+ clickElement(CreateWorkflowLocator.CLICK_CREATE_WORKFLOW_BUTTON);
+ Thread.sleep(TestConstant.ONE_THOUSANG);
+
+ //drag shell_task
+ dragAndDrop(CreateWorkflowLocator.MOUSE_DOWN_AT_SHELL,CreateWorkflowLocator.MOUSE_MOVE_SHELL_AT_DAG);
+
+ //input shell task _name
+ sendInput(CreateWorkflowLocator.INPUT_SHELL_TASK_NAME , CreatWorkflowData.SHELL_TASK_NAME);
+
+ //click stop run type
+ clickElement(CreateWorkflowLocator.CLICK_STOP_RUN_TYPE);
+
+ //click normal run type
+ clickElement(CreateWorkflowLocator.CLICK_NORMAL_RUN_TYPE);
+
+ //input shell task description
+ sendInput(CreateWorkflowLocator.INPUT_SHELL_TASK_DESCRIPTION , CreatWorkflowData.SHELL_TASK_DESCRIPTION);
+
+ //select task priority
+ clickElement(CreateWorkflowLocator.CLICK_TASK_PRIORITY);
+ clickElement(CreateWorkflowLocator.SELECT_TASK_PRIORITY);
+
+ //select work group
+ clickElement(CreateWorkflowLocator.CLICK_WORK_GROUP);
+ clickElement(CreateWorkflowLocator.SELECT_WORK_GROUP);
+
+ //select number of failed retries
+ clickElement(CreateWorkflowLocator.SELECT_FAIL_RETRIES_NUMBER);
+
+ //select failed retry interval
+ clickElement(CreateWorkflowLocator.SELECT_FAIL_RETRIES_INTERVAL);
+
+
+ //click timeout alarm
+ clickElement(CreateWorkflowLocator.CLICK_TIMEOUT_ALARM);
+
+
+ //select timeout fail
+ clickElement(CreateWorkflowLocator.SELECT_TIMEOUT_FAIL);
+
+
+ //cancel timeout alarm
+ clickElement(CreateWorkflowLocator.CANCEL_TIMEOUT_ALARM);
+
+
+ //select timeout alarm
+ clickElement(CreateWorkflowLocator.SELECT_TIMEOUT_ALARM);
+
+ //clear timeout
+ clearInput(CreateWorkflowLocator.SELECT_TIMEOUT);
+ clearInput(CreateWorkflowLocator.SELECT_TIMEOUT);
+
+ //input timeout
+ sendInput(CreateWorkflowLocator.SELECT_TIMEOUT,CreatWorkflowData.INPUT_TIMEOUT);
+
+ //click codeMirror and input script
+ inputCodeMirror(CreateWorkflowLocator.CLICK_CODE_MIRROR, CreateWorkflowLocator.INPUT_SCRIPT,CreatWorkflowData.SHELL_SCRIPT);
+ scrollToElementBottom();
+ Thread.sleep(TestConstant.ONE_THOUSANG);
+
+ //click custom parameters
+ clickElement(CreateWorkflowLocator.CLICK_CUSTOM_PARAMETERS);
+
+ //input custom parameters
+ sendInput(CreateWorkflowLocator.INPUT_CUSTOM_PARAMETERS, CreatWorkflowData.INPUT_CUSTOM_PARAMETERS);
+
+ //input custom parameters value
+ sendInput(CreateWorkflowLocator.INPUT_CUSTOM_PARAMETERS_VALUE, CreatWorkflowData.INPUT_CUSTOM_PARAMETERS_VALUE);
+
+ //click add custom parameters
+ clickElement(CreateWorkflowLocator.CLICK_ADD_CUSTOM_PARAMETERS);
+
+ scrollToElementBottom();
+ Thread.sleep(TestConstant.ONE_THOUSANG);
+
+ //input add custom parameters
+ sendInput(CreateWorkflowLocator.INPUT_ADD_CUSTOM_PARAMETERS,CreatWorkflowData.INPUT_ADD_CUSTOM_PARAMETERS);
+
+ //input add custom parameters value
+ sendInput(CreateWorkflowLocator.INPUT_ADD_CUSTOM_PARAMETERS_VALUE,CreatWorkflowData.INPUT_ADD_CUSTOM_PARAMETERS_VALUE);
+
+ //click delete custom parameters
+ clickElement(CreateWorkflowLocator.CLICK_DELETE_CUSTOM_PARAMETERS);
+ Thread.sleep(TestConstant.ONE_THOUSANG);
+
+ //click submit button
+ clickElement(CreateWorkflowLocator.CLICK_SUBMIT_BUTTON);
+ Thread.sleep(TestConstant.ONE_THOUSANG);
+
+ moveToDragElement(CreateWorkflowLocator.MOUSE_MOVE_SHELL_AT_DAG,-300,-100);
+
+ return ifTitleContains(CreatWorkflowData.WORKFLOW_TITLE);
+ }
+}
diff --git a/e2e/src/test/java/org/apache/dolphinscheduler/page/security/TenantManagePage.java b/e2e/src/test/java/org/apache/dolphinscheduler/page/security/TenantManagePage.java
new file mode 100644
index 0000000000..4c88f6575e
--- /dev/null
+++ b/e2e/src/test/java/org/apache/dolphinscheduler/page/security/TenantManagePage.java
@@ -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.
+ */
+package org.apache.dolphinscheduler.page.security;
+
+import org.apache.dolphinscheduler.common.PageCommon;
+import org.apache.dolphinscheduler.constant.TestConstant;
+import org.apache.dolphinscheduler.data.LoginData;
+import org.apache.dolphinscheduler.data.security.TenantManageData;
+import org.apache.dolphinscheduler.locator.LoginLocator;
+import org.apache.dolphinscheduler.locator.security.TenantManageLocator;
+import org.apache.dolphinscheduler.util.RedisUtil;
+import org.openqa.selenium.WebDriver;
+
+public class TenantManagePage extends PageCommon {
+ /**
+ * Unique constructor
+ * @param driver driver
+ */
+ public TenantManagePage(WebDriver driver) {
+ super(driver);
+ }
+
+
+ /**
+ * jump page
+ */
+ public void jumpPage() {
+ System.out.println("jump tenant page");
+ super.jumpPage(TenantManageData.TENANAT_URL);
+ }
+
+ /**
+ * createTenant
+ *
+ * @return Whether to enter the specified page after creat tenant
+ */
+ public boolean createTenant() throws InterruptedException {
+ Thread.sleep(TestConstant.ONE_THOUSANG);
+
+ //create tenant
+ clickButton(TenantManageLocator.CREATE_TENANT_BUTTON);
+
+ // tenant data
+ sendInput(TenantManageLocator.TENANT_INPUT_CODE, TenantManageData.TENANAT_CODE);
+ sendInput(TenantManageLocator.TENANT_INPUT_NAME, TenantManageData.TENANAT_NAME);
+ sendInput(TenantManageLocator.QUEUE, TenantManageData.QUEUE);
+ sendInput(TenantManageLocator.DESCRIPTION, TenantManageData.DESCRIPTION);
+
+ // click button
+ clickButton(TenantManageLocator.SUBMIT_BUTTON);
+
+ // Whether to enter the specified page after submit
+ return ifTitleContains(TenantManageData.TENANAT_MANAGE);
+ }
+}
diff --git a/e2e/src/test/java/org/apache/dolphinscheduler/page/security/UserManagePage.java b/e2e/src/test/java/org/apache/dolphinscheduler/page/security/UserManagePage.java
new file mode 100644
index 0000000000..3e2be2d126
--- /dev/null
+++ b/e2e/src/test/java/org/apache/dolphinscheduler/page/security/UserManagePage.java
@@ -0,0 +1,67 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.dolphinscheduler.page.security;
+
+import org.apache.dolphinscheduler.common.PageCommon;
+import org.apache.dolphinscheduler.constant.TestConstant;
+import org.apache.dolphinscheduler.data.security.UserManageData;
+import org.apache.dolphinscheduler.locator.security.UserManageLocator;
+import org.openqa.selenium.WebDriver;
+
+public class UserManagePage extends PageCommon {
+ public UserManagePage(WebDriver driver) {
+ super(driver);
+ }
+ /**
+ * jump page
+ */
+ public void jumpPage() {
+ System.out.println("jump tenant page");
+ super.jumpPage(UserManageData.USER_URL);
+ }
+
+ /**
+ * creatTenant
+ *
+ * @return Whether to enter the specified page after creat tenant
+ */
+ public boolean createUser() throws InterruptedException {
+ Thread.sleep(TestConstant.ONE_THOUSANG);
+ // click user manage
+ clickElement(UserManageLocator.CLICK_USER_MANAGE);
+ Thread.sleep(TestConstant.ONE_THOUSANG);
+
+ // click create user button
+ clickButton(UserManageLocator.CLICK_CREATE_USER_BUTTON);
+
+ // input user data
+ sendInput(UserManageLocator.INPUT_USERNAME, UserManageData.USERNAME);
+ sendInput(UserManageLocator.INPUT_PASSWORD, UserManageData.PASSWORD);
+ clickButton(UserManageLocator.CLICK_TENANT);
+ clickButton(UserManageLocator.SELECT_TENANT);
+ clickButton(UserManageLocator.CLICK_QUEUE);
+ clickButton(UserManageLocator.SELECT_QUEUE);
+ sendInput(UserManageLocator.TENANT_INPUT_EMAIL, UserManageData.EMAIL);
+ sendInput(UserManageLocator.TENANT_INPUT_PHONE, UserManageData.PHONE);
+
+ // click button
+ clickButton(UserManageLocator.SUBMIT);
+
+ // Whether to enter the specified page after submit
+ return ifTitleContains(UserManageData.USER_MANAGE);
+ }
+}
diff --git a/e2e/src/test/java/org/apache/dolphinscheduler/testcase/LoginTest.java b/e2e/src/test/java/org/apache/dolphinscheduler/testcase/LoginTest.java
new file mode 100644
index 0000000000..bd3c31d38b
--- /dev/null
+++ b/e2e/src/test/java/org/apache/dolphinscheduler/testcase/LoginTest.java
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.dolphinscheduler.testcase;
+
+import org.apache.dolphinscheduler.base.BaseTest;
+import org.apache.dolphinscheduler.page.LoginPage;
+import org.testng.annotations.Test;
+
+
+public class LoginTest extends BaseTest {
+ private LoginPage loginPage;
+ @Test(description = "LoginTest", priority = 1)
+ public void testLogin() throws InterruptedException {
+ // init login page
+ loginPage = new LoginPage(driver);
+
+ // enter login page
+ loginPage.jumpPage();
+
+ //assert login page
+ assert loginPage.login();
+ }
+}
diff --git a/e2e/src/test/java/org/apache/dolphinscheduler/testcase/project/CreateProjectTest.java b/e2e/src/test/java/org/apache/dolphinscheduler/testcase/project/CreateProjectTest.java
new file mode 100644
index 0000000000..8abd09d37c
--- /dev/null
+++ b/e2e/src/test/java/org/apache/dolphinscheduler/testcase/project/CreateProjectTest.java
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.dolphinscheduler.testcase.project;
+
+import org.apache.dolphinscheduler.base.BaseTest;
+import org.apache.dolphinscheduler.page.project.CreateProjectPage;
+import org.testng.annotations.Test;
+
+public class CreateProjectTest extends BaseTest {
+ private CreateProjectPage createProjectPage;
+
+ @Test(description = "TenantTest", priority = 1)
+ public void testUserManage() throws InterruptedException {
+ createProjectPage = new CreateProjectPage(driver);
+ // enter user manage page
+ createProjectPage.jumpProjectManagePage();
+ //assert user manage page
+ assert createProjectPage.createProject();
+ }
+
+}
+
diff --git a/e2e/src/test/java/org/apache/dolphinscheduler/testcase/project/CreateWorkflowTest.java b/e2e/src/test/java/org/apache/dolphinscheduler/testcase/project/CreateWorkflowTest.java
new file mode 100644
index 0000000000..6ac13f8124
--- /dev/null
+++ b/e2e/src/test/java/org/apache/dolphinscheduler/testcase/project/CreateWorkflowTest.java
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.dolphinscheduler.testcase.project;
+
+import org.apache.dolphinscheduler.base.BaseTest;
+import org.apache.dolphinscheduler.page.project.CreateProjectPage;
+import org.apache.dolphinscheduler.page.project.CreateWorkflowPage;
+import org.testng.annotations.Test;
+
+public class CreateWorkflowTest extends BaseTest {
+ private CreateWorkflowPage createWorkflowPage;
+ private CreateProjectPage createProjectPage;
+
+
+ @Test(description = "CreateWorkflowTest", priority = 1)
+ public void CreateWorkflowTest() throws InterruptedException {
+ createProjectPage = new CreateProjectPage(driver);
+ createProjectPage.jumpProjectManagePage();
+ createWorkflowPage = new CreateWorkflowPage(driver);
+ //assert create workflow
+ assert createWorkflowPage.createWorkflow();
+ }
+}
diff --git a/e2e/src/test/java/org/apache/dolphinscheduler/testcase/security/TenantManageTest.java b/e2e/src/test/java/org/apache/dolphinscheduler/testcase/security/TenantManageTest.java
new file mode 100644
index 0000000000..7124b4e094
--- /dev/null
+++ b/e2e/src/test/java/org/apache/dolphinscheduler/testcase/security/TenantManageTest.java
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.dolphinscheduler.testcase.security;
+
+import org.apache.dolphinscheduler.base.BaseTest;
+import org.apache.dolphinscheduler.page.security.TenantManagePage;
+import org.testng.annotations.Test;
+
+public class TenantManageTest extends BaseTest {
+ private TenantManagePage tenantManagePage;
+
+ @Test(description = "TenantTest", priority = 1)
+ public void testTenantManage() throws InterruptedException {
+ tenantManagePage = new TenantManagePage(driver);
+ // enter tenant manage page
+ tenantManagePage.jumpPage();
+ //assert tenant manage page
+ assert tenantManagePage.createTenant();
+ }
+}
diff --git a/e2e/src/test/java/org/apache/dolphinscheduler/testcase/security/UserManageTest.java b/e2e/src/test/java/org/apache/dolphinscheduler/testcase/security/UserManageTest.java
new file mode 100644
index 0000000000..834ebdbbf0
--- /dev/null
+++ b/e2e/src/test/java/org/apache/dolphinscheduler/testcase/security/UserManageTest.java
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.dolphinscheduler.testcase.security;
+
+import org.apache.dolphinscheduler.base.BaseTest;
+import org.apache.dolphinscheduler.page.security.UserManagePage;
+import org.testng.annotations.Test;
+
+public class UserManageTest extends BaseTest {
+ private UserManagePage userManagePage;
+
+ @Test(description = "TenantTest", priority = 1)
+ public void testUserManage() throws InterruptedException {
+ userManagePage = new UserManagePage(driver);
+ // enter user manage page
+ userManagePage.jumpPage();
+ //assert user manage page
+ assert userManagePage.createUser();
+ }
+}
diff --git a/e2e/src/test/resources/config/config.properties b/e2e/src/test/resources/config/config.properties
new file mode 100644
index 0000000000..6a01234d01
--- /dev/null
+++ b/e2e/src/test/resources/config/config.properties
@@ -0,0 +1,58 @@
+#
+# 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 ##############
+# login url
+LOGIN_URL=http://127.0.0.1:8888/dolphinscheduler/
+#login username
+USER_NAME=admin
+#login password
+PASSWORD=dolphinscheduler123
+
+############### web driver ##############
+# driver path
+driver.chromeDriver=/usr/local/bin/chromedriver
+# implicitly wait(s)
+driver.timeouts.implicitlyWait=10
+# show wait(s)
+driver.timeouts.webDriverWait=10
+# page load timeout(s)
+driver.timeouts.pageLoadTimeout=10
+# JS wait timeouts(s)
+driver.timeouts.setScriptTimeout=10
+
+
+############### redis ##############
+# redis ip
+redis.ip=127.0.0.1
+# redis port
+redis.port=6379
+# redis password
+redis.pwd=
+############### redis pool ##############
+# jedis expireTime(s)
+jedis.expireTime=3600
+# jedis maxTotal
+jedis.pool.maxTotal=3000
+# jedis maxIdle
+jedis.pool.maxIdle=1000
+# jedis maxWaitMillis
+jedis.pool.maxWaitMillis=10000
+# jedis Whether to perform a valid check when calling the borrowObject method
+jedis.pool.testOnBorrow=true
+# jedis Whether to perform a valid check when calling the returnObject method
+jedis.pool.testOnReturn=true
diff --git a/e2e/suite.xml b/e2e/suite.xml
new file mode 100644
index 0000000000..d9d7ae6845
--- /dev/null
+++ b/e2e/suite.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/e2e/testng.xml b/e2e/testng.xml
new file mode 100644
index 0000000000..757ffab248
--- /dev/null
+++ b/e2e/testng.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/install.sh b/install.sh
index 354cdd2be3..8735543c47 100644
--- a/install.sh
+++ b/install.sh
@@ -422,17 +422,8 @@ fi
done
-# 3,stop server
-echo "3,stop server"
-sh ${workDir}/script/stop-all.sh
-
-# 4,delete zk node
-echo "4,delete zk node"
-
-sh ${workDir}/script/remove-zk-node.sh $zkRoot
-
-# 5,scp resources
-echo "5,scp resources"
+# 3,scp resources
+echo "3,scp resources"
sh ${workDir}/script/scp-hosts.sh
if [ $? -eq 0 ]
then
@@ -442,6 +433,18 @@ else
exit -1
fi
+
+# 4,stop server
+echo "4,stop server"
+sh ${workDir}/script/stop-all.sh
+
+
+# 5,delete zk node
+echo "5,delete zk node"
+
+sh ${workDir}/script/remove-zk-node.sh $zkRoot
+
+
# 6,startup
echo "6,startup"
sh ${workDir}/script/start-all.sh
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index e23a1625b0..8a1e9b98f2 100644
--- a/pom.xml
+++ b/pom.xml
@@ -242,7 +242,6 @@
dolphinscheduler-alert${project.version}
-
org.apache.curatorcurator-framework
@@ -685,6 +684,7 @@
**/common/threadutils/*.java**/common/graph/*.java**/common/queue/*.java
+ **/common/task/SqoopParameterEntityTest.java**/api/utils/CheckUtilsTest.java**/api/utils/FileUtilsTest.java**/api/utils/FourLetterWordTest.java
@@ -708,6 +708,8 @@
**/api/service/BaseDAGServiceTest.java**/api/service/LoggerServiceTest.java**/api/service/DataAnalysisServiceTest.java
+ **/api/service/ProcessInstanceServiceTest.java
+ **/api/service/TaskInstanceServiceTest.java**/alert/utils/ExcelUtilsTest.java**/alert/utils/FuncUtilsTest.java**/alert/utils/JSONUtilsTest.java
@@ -720,11 +722,13 @@
**/dao/mapper/AlertGroupMapperTest.java**/dao/mapper/AlertMapperTest.java**/dao/mapper/CommandMapperTest.java
+ **/dao/entity/TaskInstanceTest.java**/dao/cron/CronUtilsTest.java**/dao/utils/DagHelperTest.java**/alert/template/AlertTemplateFactoryTest.java**/alert/template/impl/DefaultHTMLTemplateTest.java**/server/worker/task/datax/DataxTaskTest.java
+ **/server/worker/task/sqoop/SqoopTaskTest.java**/server/utils/DataxUtilsTest.java
diff --git a/script/dolphinscheduler-daemon.sh b/script/dolphinscheduler-daemon.sh
index d942bca7d2..3e7f10783a 100644
--- a/script/dolphinscheduler-daemon.sh
+++ b/script/dolphinscheduler-daemon.sh
@@ -44,7 +44,7 @@ export DOLPHINSCHEDULER_LOG_DIR=$DOLPHINSCHEDULER_HOME/logs
export DOLPHINSCHEDULER_CONF_DIR=$DOLPHINSCHEDULER_HOME/conf
export DOLPHINSCHEDULER_LIB_JARS=$DOLPHINSCHEDULER_HOME/lib/*
-export DOLPHINSCHEDULER_OPTS="-server -Xmx16g -Xms4g -Xss512k -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70"
+export DOLPHINSCHEDULER_OPTS="-server -Xmx16g -Xms1g -Xss512k -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70"
export STOP_TIMEOUT=5
if [ ! -d "$DOLPHINSCHEDULER_LOG_DIR" ]; then
@@ -70,9 +70,6 @@ elif [ "$command" = "alert-server" ]; then
CLASS=org.apache.dolphinscheduler.alert.AlertServer
elif [ "$command" = "logger-server" ]; then
CLASS=org.apache.dolphinscheduler.server.log.LoggerServer
-elif [ "$command" = "combined-server" ]; then
- LOG_FILE="-Dlogging.config=classpath:combined_logback.xml -Dspring.profiles.active=api -Dserver.is-combined-server=true"
- CLASS=org.apache.dolphinscheduler.api.CombinedApplicationServer
else
echo "Error: No command named \`$command' was found."
exit 1
diff --git a/sql/dolphinscheduler-postgre.sql b/sql/dolphinscheduler-postgre.sql
index c68fd17be1..88d62737de 100644
--- a/sql/dolphinscheduler-postgre.sql
+++ b/sql/dolphinscheduler-postgre.sql
@@ -574,6 +574,7 @@ CREATE TABLE t_ds_task_instance (
max_retry_times int DEFAULT NULL ,
task_instance_priority int DEFAULT NULL ,
worker_group_id int DEFAULT '-1' ,
+ executor_id int DEFAULT NULL ,
PRIMARY KEY (id)
) ;
diff --git a/sql/dolphinscheduler_mysql.sql b/sql/dolphinscheduler_mysql.sql
index ea0f9cb022..68393702fc 100644
--- a/sql/dolphinscheduler_mysql.sql
+++ b/sql/dolphinscheduler_mysql.sql
@@ -616,6 +616,7 @@ CREATE TABLE `t_ds_task_instance` (
`max_retry_times` int(2) DEFAULT NULL COMMENT 'max retry times',
`task_instance_priority` int(11) DEFAULT NULL COMMENT 'task instance priority:0 Highest,1 High,2 Medium,3 Low,4 Lowest',
`worker_group_id` int(11) DEFAULT '-1' COMMENT 'worker group id',
+ `executor_id` int(11) DEFAULT NULL COMMENT 'executor id',
PRIMARY KEY (`id`),
KEY `process_instance_id` (`process_instance_id`) USING BTREE,
KEY `task_instance_index` (`process_definition_id`,`process_instance_id`) USING BTREE,
diff --git a/sql/upgrade/1.2.2_schema/mysql/dolphinscheduler_ddl.sql b/sql/upgrade/1.2.2_schema/mysql/dolphinscheduler_ddl.sql
index 9fe246a8c2..790a9a8ada 100644
--- a/sql/upgrade/1.2.2_schema/mysql/dolphinscheduler_ddl.sql
+++ b/sql/upgrade/1.2.2_schema/mysql/dolphinscheduler_ddl.sql
@@ -35,3 +35,23 @@ d//
delimiter ;
CALL uc_dolphin_T_t_ds_process_definition_A_modify_by;
DROP PROCEDURE uc_dolphin_T_t_ds_process_definition_A_modify_by;
+
+-- uc_dolphin_T_t_ds_process_definition_A_modify_by
+drop PROCEDURE if EXISTS uc_dolphin_T_t_ds_task_instance_A_executor_id;
+delimiter d//
+CREATE PROCEDURE uc_dolphin_T_t_ds_task_instance_A_executor_id()
+ BEGIN
+ IF NOT EXISTS (SELECT 1 FROM information_schema.COLUMNS
+ WHERE TABLE_NAME='t_ds_task_instance'
+ AND TABLE_SCHEMA=(SELECT DATABASE())
+ AND COLUMN_NAME ='executor_id')
+ THEN
+ ALTER TABLE t_ds_task_instance ADD `executor_id` int(11) DEFAULT NULL COMMENT 'executor id';
+ END IF;
+ END;
+
+d//
+
+delimiter ;
+CALL uc_dolphin_T_t_ds_task_instance_A_executor_id;
+DROP PROCEDURE uc_dolphin_T_t_ds_task_instance_A_executor_id;
\ No newline at end of file
diff --git a/sql/upgrade/1.2.2_schema/postgresql/dolphinscheduler_ddl.sql b/sql/upgrade/1.2.2_schema/postgresql/dolphinscheduler_ddl.sql
index 7fc12900e4..cbe7c22bbe 100644
--- a/sql/upgrade/1.2.2_schema/postgresql/dolphinscheduler_ddl.sql
+++ b/sql/upgrade/1.2.2_schema/postgresql/dolphinscheduler_ddl.sql
@@ -32,3 +32,20 @@ delimiter ;
SELECT uc_dolphin_T_t_ds_process_definition_A_modify_by();
DROP FUNCTION IF EXISTS uc_dolphin_T_t_ds_process_definition_A_modify_by();
+-- uc_dolphin_T_t_ds_process_definition_A_modify_by
+delimiter d//
+CREATE OR REPLACE FUNCTION uc_dolphin_T_t_ds_task_instance_A_executor_id() RETURNS void AS $$
+BEGIN
+ IF NOT EXISTS (SELECT 1 FROM information_schema.COLUMNS
+ WHERE TABLE_NAME='t_ds_task_instance'
+ AND COLUMN_NAME ='executor_id')
+ THEN
+ ALTER TABLE t_ds_task_instance ADD COLUMN executor_id int DEFAULT NULL;
+ END IF;
+END;
+$$ LANGUAGE plpgsql;
+d//
+
+delimiter ;
+SELECT uc_dolphin_T_t_ds_task_instance_A_executor_id();
+DROP FUNCTION IF EXISTS uc_dolphin_T_t_ds_task_instance_A_executor_id();