[E2E] [Resource] add file manage case (#7906)
parent
8cac0d8f94
commit
5be8e0531c
|
|
@ -46,6 +46,8 @@ jobs:
|
|||
class: org.apache.dolphinscheduler.e2e.cases.QueueE2ETest
|
||||
- name: Workflow
|
||||
class: org.apache.dolphinscheduler.e2e.cases.WorkflowE2ETest
|
||||
- name: FileManage
|
||||
class: org.apache.dolphinscheduler.e2e.cases.FileManageE2ETest
|
||||
env:
|
||||
RECORDING_PATH: /tmp/recording-${{ matrix.case.name }}
|
||||
steps:
|
||||
|
|
|
|||
|
|
@ -0,0 +1,119 @@
|
|||
/*
|
||||
* 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.e2e.cases;
|
||||
|
||||
|
||||
import org.apache.dolphinscheduler.e2e.core.DolphinScheduler;
|
||||
import org.apache.dolphinscheduler.e2e.pages.LoginPage;
|
||||
import org.apache.dolphinscheduler.e2e.pages.resource.FileManagePage;
|
||||
import org.apache.dolphinscheduler.e2e.pages.resource.ResourcePage;
|
||||
import org.apache.dolphinscheduler.e2e.pages.security.SecurityPage;
|
||||
import org.apache.dolphinscheduler.e2e.pages.security.TenantPage;
|
||||
import org.apache.dolphinscheduler.e2e.pages.security.UserPage;
|
||||
|
||||
import org.junit.jupiter.api.BeforeAll;
|
||||
import org.junit.jupiter.api.Order;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.openqa.selenium.By;
|
||||
import org.openqa.selenium.WebElement;
|
||||
import org.openqa.selenium.remote.RemoteWebDriver;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.awaitility.Awaitility.await;
|
||||
|
||||
@DolphinScheduler(composeFiles = "docker/file-manage/docker-compose.yaml")
|
||||
public class FileManageE2ETest {
|
||||
private static RemoteWebDriver browser;
|
||||
|
||||
private static final String tenant = System.getProperty("user.name");
|
||||
|
||||
private static final String user = "admin";
|
||||
|
||||
private static final String password = "dolphinscheduler123";
|
||||
|
||||
private static final String email = "admin@gmail.com";
|
||||
|
||||
private static final String phone = "15800000000";
|
||||
|
||||
private static final String testDiretoryName = "test_directory";
|
||||
|
||||
@BeforeAll
|
||||
public static void setup() {
|
||||
TenantPage tenantPage = new LoginPage(browser)
|
||||
.login(user, password)
|
||||
.create(tenant);
|
||||
|
||||
await().untilAsserted(() -> assertThat(tenantPage.tenantList())
|
||||
.as("Tenant list should contain newly-created tenant")
|
||||
.extracting(WebElement::getText)
|
||||
.anyMatch(it -> it.contains(tenant)));
|
||||
|
||||
tenantPage.goToNav(SecurityPage.class)
|
||||
.goToTab(UserPage.class)
|
||||
.update(user, user, password, email, phone)
|
||||
.goToNav(ResourcePage.class)
|
||||
.goToTab(FileManagePage.class);
|
||||
}
|
||||
|
||||
@Test
|
||||
@Order(10)
|
||||
void testCreateDirectory() {
|
||||
final FileManagePage page = new FileManagePage(browser);
|
||||
|
||||
page.createDirectory(testDiretoryName, "test_desc");
|
||||
|
||||
await().untilAsserted(() -> assertThat(page.fileList())
|
||||
.as("File list should contain newly-created file")
|
||||
.extracting(WebElement::getText)
|
||||
.anyMatch(it -> it.contains(testDiretoryName)));
|
||||
}
|
||||
|
||||
@Test
|
||||
@Order(20)
|
||||
void testCreateDuplicateDirectory() {
|
||||
final FileManagePage page = new FileManagePage(browser);
|
||||
|
||||
page.createDirectory(testDiretoryName, "test_desc");
|
||||
|
||||
await().untilAsserted(() -> assertThat(browser.findElement(By.tagName("body")).getText())
|
||||
.contains("resource already exists")
|
||||
);
|
||||
|
||||
page.createDirectoryBox().buttonCancel().click();
|
||||
}
|
||||
|
||||
@Test
|
||||
@Order(30)
|
||||
void testDeleteDirectory() {
|
||||
final FileManagePage page = new FileManagePage(browser);
|
||||
|
||||
page.delete(testDiretoryName);
|
||||
|
||||
await().untilAsserted(() -> {
|
||||
browser.navigate().refresh();
|
||||
|
||||
assertThat(
|
||||
page.fileList()
|
||||
).noneMatch(
|
||||
it -> it.getText().contains(testDiretoryName)
|
||||
);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
@ -55,13 +55,19 @@ class UserE2ETest {
|
|||
|
||||
@BeforeAll
|
||||
public static void setup() {
|
||||
new LoginPage(browser)
|
||||
.login("admin", "dolphinscheduler123")
|
||||
.goToNav(SecurityPage.class)
|
||||
.goToTab(TenantPage.class)
|
||||
.create(tenant)
|
||||
.goToNav(SecurityPage.class)
|
||||
.goToTab(UserPage.class);
|
||||
TenantPage tenantPage = new LoginPage(browser)
|
||||
.login("admin", "dolphinscheduler123")
|
||||
.goToNav(SecurityPage.class)
|
||||
.goToTab(TenantPage.class)
|
||||
.create(tenant);
|
||||
|
||||
await().untilAsserted(() -> assertThat(tenantPage.tenantList())
|
||||
.as("Tenant list should contain newly-created tenant")
|
||||
.extracting(WebElement::getText)
|
||||
.anyMatch(it -> it.contains(tenant)));
|
||||
|
||||
tenantPage.goToNav(SecurityPage.class)
|
||||
.goToTab(UserPage.class);
|
||||
}
|
||||
|
||||
@AfterAll
|
||||
|
|
|
|||
|
|
@ -52,7 +52,7 @@ public final class LoginPage extends NavBarPage {
|
|||
inputPassword().sendKeys(password);
|
||||
buttonLogin().click();
|
||||
|
||||
new WebDriverWait(driver(), 10)
|
||||
new WebDriverWait(driver, 10)
|
||||
.until(ExpectedConditions.urlContains("/#/security"));
|
||||
|
||||
return new TenantPage(driver);
|
||||
|
|
|
|||
|
|
@ -20,12 +20,16 @@
|
|||
package org.apache.dolphinscheduler.e2e.pages.common;
|
||||
|
||||
import org.apache.dolphinscheduler.e2e.pages.project.ProjectPage;
|
||||
import org.apache.dolphinscheduler.e2e.pages.resource.ResourcePage;
|
||||
import org.apache.dolphinscheduler.e2e.pages.security.SecurityPage;
|
||||
|
||||
import org.openqa.selenium.JavascriptExecutor;
|
||||
import org.openqa.selenium.WebElement;
|
||||
import org.openqa.selenium.remote.RemoteWebDriver;
|
||||
import org.openqa.selenium.support.FindBy;
|
||||
import org.openqa.selenium.support.PageFactory;
|
||||
import org.openqa.selenium.support.ui.ExpectedConditions;
|
||||
import org.openqa.selenium.support.ui.WebDriverWait;
|
||||
|
||||
import lombok.Getter;
|
||||
|
||||
|
|
@ -35,9 +39,13 @@ public class NavBarPage {
|
|||
|
||||
@FindBy(id = "tabProject")
|
||||
private WebElement projectTab;
|
||||
|
||||
@FindBy(id = "tabSecurity")
|
||||
private WebElement securityTab;
|
||||
|
||||
@FindBy(id = "tabResource")
|
||||
private WebElement resourceTab;
|
||||
|
||||
public NavBarPage(RemoteWebDriver driver) {
|
||||
this.driver = driver;
|
||||
|
||||
|
|
@ -46,14 +54,26 @@ public class NavBarPage {
|
|||
|
||||
public <T extends NavBarItem> T goToNav(Class<T> nav) {
|
||||
if (nav == ProjectPage.class) {
|
||||
projectTab().click();
|
||||
WebElement projectTabElement = new WebDriverWait(driver, 60)
|
||||
.until(ExpectedConditions.elementToBeClickable(projectTab));
|
||||
((JavascriptExecutor)driver).executeScript("arguments[0].click();", projectTabElement);
|
||||
return nav.cast(new ProjectPage(driver));
|
||||
}
|
||||
|
||||
if (nav == SecurityPage.class) {
|
||||
securityTab().click();
|
||||
WebElement securityTabElement = new WebDriverWait(driver, 60)
|
||||
.until(ExpectedConditions.elementToBeClickable(securityTab));
|
||||
((JavascriptExecutor)driver).executeScript("arguments[0].click();", securityTabElement);
|
||||
return nav.cast(new SecurityPage(driver));
|
||||
}
|
||||
|
||||
if (nav == ResourcePage.class) {
|
||||
WebElement resourceTabElement = new WebDriverWait(driver, 60)
|
||||
.until(ExpectedConditions.elementToBeClickable(resourceTab));
|
||||
((JavascriptExecutor)driver).executeScript("arguments[0].click();", resourceTabElement);
|
||||
return nav.cast(new ResourcePage(driver));
|
||||
}
|
||||
|
||||
throw new UnsupportedOperationException("Unknown nav bar");
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,111 @@
|
|||
/*
|
||||
* 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.e2e.pages.resource;
|
||||
|
||||
import lombok.Getter;
|
||||
|
||||
import org.apache.dolphinscheduler.e2e.pages.common.NavBarPage;
|
||||
import org.apache.dolphinscheduler.e2e.pages.security.TenantPage;
|
||||
|
||||
import org.openqa.selenium.By;
|
||||
import org.openqa.selenium.WebElement;
|
||||
import org.openqa.selenium.remote.RemoteWebDriver;
|
||||
import org.openqa.selenium.support.FindBy;
|
||||
import org.openqa.selenium.support.FindBys;
|
||||
import org.openqa.selenium.support.PageFactory;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
|
||||
@Getter
|
||||
public class FileManagePage extends NavBarPage implements ResourcePage.Tab {
|
||||
@FindBy(id = "btnCreateDirectory")
|
||||
private WebElement buttonCreateDirectory;
|
||||
|
||||
private final CreateDirectoryBox createDirectoryBox;
|
||||
|
||||
@FindBy(className = "items")
|
||||
private List<WebElement> fileList;
|
||||
|
||||
@FindBy(id = "delete")
|
||||
private WebElement buttonDelete;
|
||||
|
||||
@FindBys({
|
||||
@FindBy(className = "el-popconfirm"),
|
||||
@FindBy(className = "el-button--primary"),
|
||||
})
|
||||
private List<WebElement> buttonConfirm;
|
||||
|
||||
public FileManagePage(RemoteWebDriver driver) {
|
||||
super(driver);
|
||||
|
||||
createDirectoryBox = new CreateDirectoryBox();
|
||||
}
|
||||
|
||||
public FileManagePage createDirectory(String name, String description) {
|
||||
buttonCreateDirectory().click();
|
||||
|
||||
createDirectoryBox().inputDirectoryName().sendKeys(name);
|
||||
createDirectoryBox().inputDescription().sendKeys(description);
|
||||
createDirectoryBox().buttonSubmit().click();
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
public FileManagePage delete(String name) {
|
||||
fileList()
|
||||
.stream()
|
||||
.filter(it -> it.getText().contains(name))
|
||||
.flatMap(it -> it.findElements(By.id("delete")).stream())
|
||||
.filter(WebElement::isDisplayed)
|
||||
.findFirst()
|
||||
.orElseThrow(() -> new RuntimeException("No delete button in file manage list"))
|
||||
.click();
|
||||
|
||||
buttonConfirm()
|
||||
.stream()
|
||||
.filter(WebElement::isDisplayed)
|
||||
.findFirst()
|
||||
.orElseThrow(() -> new RuntimeException("No confirm button when deleting"))
|
||||
.click();
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
@Getter
|
||||
public class CreateDirectoryBox {
|
||||
CreateDirectoryBox() {
|
||||
PageFactory.initElements(driver, this);
|
||||
}
|
||||
|
||||
@FindBy(id = "inputDirectoryName")
|
||||
private WebElement inputDirectoryName;
|
||||
|
||||
@FindBy(id = "inputDescription")
|
||||
private WebElement inputDescription;
|
||||
|
||||
@FindBy(id = "btnSubmit")
|
||||
private WebElement buttonSubmit;
|
||||
|
||||
@FindBy(id = "btnCancel")
|
||||
private WebElement buttonCancel;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,53 @@
|
|||
/*
|
||||
* 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.e2e.pages.resource;
|
||||
|
||||
import lombok.Getter;
|
||||
import org.apache.dolphinscheduler.e2e.pages.common.NavBarPage;
|
||||
import org.apache.dolphinscheduler.e2e.pages.security.TenantPage;
|
||||
import org.openqa.selenium.JavascriptExecutor;
|
||||
import org.openqa.selenium.WebElement;
|
||||
import org.openqa.selenium.remote.RemoteWebDriver;
|
||||
import org.openqa.selenium.support.FindBy;
|
||||
import org.openqa.selenium.support.ui.ExpectedConditions;
|
||||
import org.openqa.selenium.support.ui.WebDriverWait;
|
||||
|
||||
|
||||
@Getter
|
||||
public class ResourcePage extends NavBarPage implements NavBarPage.NavBarItem {
|
||||
@FindBy(className = "tab-file-manage")
|
||||
private WebElement fileMagageManage;
|
||||
|
||||
public ResourcePage(RemoteWebDriver driver) {
|
||||
super(driver);
|
||||
}
|
||||
|
||||
public <T extends ResourcePage.Tab> T goToTab(Class<T> tab) {
|
||||
if (tab == FileManagePage.class) {
|
||||
WebElement fileMagageManageElement = new WebDriverWait(driver, 10).until(ExpectedConditions.elementToBeClickable(fileMagageManage));
|
||||
fileMagageManageElement.click();
|
||||
return tab.cast(new FileManagePage(driver));
|
||||
}
|
||||
throw new UnsupportedOperationException("Unknown tab: " + tab.getName());
|
||||
}
|
||||
|
||||
public interface Tab {
|
||||
}
|
||||
}
|
||||
|
|
@ -22,11 +22,14 @@ package org.apache.dolphinscheduler.e2e.pages.security;
|
|||
import org.apache.dolphinscheduler.e2e.pages.common.NavBarPage;
|
||||
import org.apache.dolphinscheduler.e2e.pages.common.NavBarPage.NavBarItem;
|
||||
|
||||
import org.openqa.selenium.JavascriptExecutor;
|
||||
import org.openqa.selenium.WebElement;
|
||||
import org.openqa.selenium.remote.RemoteWebDriver;
|
||||
import org.openqa.selenium.support.FindBy;
|
||||
|
||||
import lombok.Getter;
|
||||
import org.openqa.selenium.support.ui.ExpectedConditions;
|
||||
import org.openqa.selenium.support.ui.WebDriverWait;
|
||||
|
||||
@Getter
|
||||
public class SecurityPage extends NavBarPage implements NavBarItem {
|
||||
|
|
@ -48,15 +51,21 @@ public class SecurityPage extends NavBarPage implements NavBarItem {
|
|||
|
||||
public <T extends SecurityPage.Tab> T goToTab(Class<T> tab) {
|
||||
if (tab == TenantPage.class) {
|
||||
menuTenantManage().click();
|
||||
WebElement menuTenantManageElement = new WebDriverWait(driver, 60)
|
||||
.until(ExpectedConditions.elementToBeClickable(menuTenantManage));
|
||||
((JavascriptExecutor)driver).executeScript("arguments[0].click();", menuTenantManageElement);
|
||||
return tab.cast(new TenantPage(driver));
|
||||
}
|
||||
if (tab == UserPage.class) {
|
||||
menUserManage().click();
|
||||
WebElement menUserManageElement = new WebDriverWait(driver, 60)
|
||||
.until(ExpectedConditions.elementToBeClickable(menUserManage));
|
||||
((JavascriptExecutor)driver).executeScript("arguments[0].click();", menUserManageElement);
|
||||
return tab.cast(new UserPage(driver));
|
||||
}
|
||||
if (tab == WorkerGroupPage.class) {
|
||||
menWorkerGroupManage().click();
|
||||
WebElement menWorkerGroupManageElement = new WebDriverWait(driver, 60)
|
||||
.until(ExpectedConditions.elementToBeClickable(menWorkerGroupManage));
|
||||
((JavascriptExecutor)driver).executeScript("arguments[0].click();", menWorkerGroupManageElement);
|
||||
return tab.cast(new WorkerGroupPage(driver));
|
||||
}
|
||||
if (tab == QueuePage.class) {
|
||||
|
|
|
|||
|
|
@ -67,8 +67,8 @@ public final class UserPage extends NavBarPage implements SecurityPage.Tab {
|
|||
}
|
||||
|
||||
public UserPage update(String user, String editUser, String editPassword, String editEmail, String editPhone) {
|
||||
userList()
|
||||
.stream()
|
||||
List<WebElement> userList = driver.findElementsByClassName("items");
|
||||
userList.stream()
|
||||
.filter(it -> it.findElement(By.className("name")).getAttribute("innerHTML").contains(user))
|
||||
.flatMap(it -> it.findElements(By.className("edit")).stream())
|
||||
.filter(WebElement::isDisplayed)
|
||||
|
|
@ -76,15 +76,17 @@ public final class UserPage extends NavBarPage implements SecurityPage.Tab {
|
|||
.orElseThrow(() -> new RuntimeException("No edit button in user list"))
|
||||
.click();
|
||||
|
||||
editUserForm().inputUserName().clear();
|
||||
editUserForm().inputUserName().sendKeys(editUser);
|
||||
editUserForm().inputUserPassword().clear();
|
||||
editUserForm().inputUserPassword().sendKeys(editPassword);
|
||||
editUserForm().inputEmail().clear();
|
||||
editUserForm().inputEmail().sendKeys(editEmail);
|
||||
editUserForm().inputPhone().clear();
|
||||
editUserForm().inputPhone().sendKeys(editPhone);
|
||||
editUserForm().buttonSubmit().click();
|
||||
UserForm editUserForm = new UserForm();
|
||||
|
||||
editUserForm.inputUserName().clear();
|
||||
editUserForm.inputUserName().sendKeys(editUser);
|
||||
editUserForm.inputUserPassword().clear();
|
||||
editUserForm.inputUserPassword().sendKeys(editPassword);
|
||||
editUserForm.inputEmail().clear();
|
||||
editUserForm.inputEmail().sendKeys(editEmail);
|
||||
editUserForm.inputPhone().clear();
|
||||
editUserForm.inputPhone().sendKeys(editPhone);
|
||||
editUserForm.buttonSubmit().click();
|
||||
|
||||
return this;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,94 @@
|
|||
#
|
||||
# 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.
|
||||
#
|
||||
|
||||
# user data local directory path, please make sure the directory exists and have read write permissions
|
||||
data.basedir.path=/tmp/dolphinscheduler
|
||||
|
||||
# resource storage type: HDFS, S3, NONE
|
||||
resource.storage.type=HDFS
|
||||
|
||||
# resource store on HDFS/S3 path, resource file will store to this hadoop hdfs path, self configuration, please make sure the directory exists on hdfs and have read write permissions. "/dolphinscheduler" is recommended
|
||||
resource.upload.path=/dolphinscheduler
|
||||
|
||||
# whether to startup kerberos
|
||||
hadoop.security.authentication.startup.state=false
|
||||
|
||||
# java.security.krb5.conf path
|
||||
java.security.krb5.conf.path=/opt/krb5.conf
|
||||
|
||||
# login user from keytab username
|
||||
login.user.keytab.username=hdfs-mycluster@ESZ.COM
|
||||
|
||||
# login user from keytab path
|
||||
login.user.keytab.path=/opt/hdfs.headless.keytab
|
||||
|
||||
# kerberos expire time, the unit is hour
|
||||
kerberos.expire.time=2
|
||||
|
||||
# resource view suffixs
|
||||
#resource.view.suffixs=txt,log,sh,bat,conf,cfg,py,java,sql,xml,hql,properties,json,yml,yaml,ini,js
|
||||
|
||||
# if resource.storage.type=HDFS, the user must have the permission to create directories under the HDFS root path
|
||||
hdfs.root.user=hdfs
|
||||
|
||||
# if resource.storage.type=S3, the value like: s3a://dolphinscheduler; if resource.storage.type=HDFS and namenode HA is enabled, you need to copy core-site.xml and hdfs-site.xml to conf dir
|
||||
fs.defaultFS=hdfs://hdfs:8020
|
||||
|
||||
# if resource.storage.type=S3, s3 endpoint
|
||||
fs.s3a.endpoint=http://192.168.xx.xx:9010
|
||||
|
||||
# if resource.storage.type=S3, s3 access key
|
||||
fs.s3a.access.key=A3DXS30FO22544RE
|
||||
|
||||
# if resource.storage.type=S3, s3 secret key
|
||||
fs.s3a.secret.key=OloCLq3n+8+sdPHUhJ21XrSxTC+JK
|
||||
|
||||
# resourcemanager port, the default value is 8088 if not specified
|
||||
resource.manager.httpaddress.port=8088
|
||||
|
||||
# if resourcemanager HA is enabled, please set the HA IPs; if resourcemanager is single, keep this value empty
|
||||
yarn.resourcemanager.ha.rm.ids=192.168.xx.xx,192.168.xx.xx
|
||||
|
||||
# if resourcemanager HA is enabled or not use resourcemanager, please keep the default value; If resourcemanager is single, you only need to replace ds1 to actual resourcemanager hostname
|
||||
yarn.application.status.address=http://ds1:%s/ws/v1/cluster/apps/%s
|
||||
|
||||
# job history status url when application number threshold is reached(default 10000, maybe it was set to 1000)
|
||||
yarn.job.history.status.address=http://ds1:19888/ws/v1/history/mapreduce/jobs/%s
|
||||
|
||||
# datasource encryption enable
|
||||
datasource.encryption.enable=false
|
||||
|
||||
# datasource encryption salt
|
||||
datasource.encryption.salt=!@#$%^&*
|
||||
|
||||
# use sudo or not, if set true, executing user is tenant user and deploy user needs sudo permissions; if set false, executing user is the deploy user and doesn't need sudo permissions
|
||||
sudo.enable=true
|
||||
|
||||
# network interface preferred like eth0, default: empty
|
||||
#dolphin.scheduler.network.interface.preferred=
|
||||
|
||||
# network IP gets priority, default: inner outer
|
||||
#dolphin.scheduler.network.priority.strategy=default
|
||||
|
||||
# system env path
|
||||
#dolphinscheduler.env.path=env/dolphinscheduler_env.sh
|
||||
|
||||
# development state
|
||||
development.state=false
|
||||
|
||||
# rpc port
|
||||
alert.rpc.port=50052
|
||||
|
|
@ -0,0 +1,56 @@
|
|||
#
|
||||
# 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.
|
||||
#
|
||||
|
||||
version: "2.1"
|
||||
|
||||
services:
|
||||
dolphinscheduler:
|
||||
image: apache/dolphinscheduler-standalone-server:ci
|
||||
environment:
|
||||
MASTER_MAX_CPU_LOAD_AVG: 100
|
||||
WORKER_TENANT_AUTO_CREATE: 'true'
|
||||
expose:
|
||||
- 12345
|
||||
networks:
|
||||
- e2e
|
||||
healthcheck:
|
||||
test: [ "CMD", "curl", "http://localhost:12345/actuator/health" ]
|
||||
interval: 5s
|
||||
timeout: 60s
|
||||
retries: 120
|
||||
volumes:
|
||||
- ./common.properties:/opt/dolphinscheduler/conf/common.properties
|
||||
depends_on:
|
||||
hdfs:
|
||||
condition: service_healthy
|
||||
hdfs:
|
||||
image: mdouchement/hdfs:latest
|
||||
hostname: hdfs
|
||||
tty: true
|
||||
stdin_open: true
|
||||
expose:
|
||||
- 8020
|
||||
networks:
|
||||
- e2e
|
||||
healthcheck:
|
||||
test: [ "CMD", "curl", "http://localhost:50070" ]
|
||||
interval: 5s
|
||||
timeout: 120s
|
||||
retries: 120
|
||||
|
||||
networks:
|
||||
e2e:
|
||||
|
|
@ -193,7 +193,7 @@ final class DolphinSchedulerExtension
|
|||
.withPull(true)
|
||||
.withTailChildContainers(true)
|
||||
.withLogConsumer("dolphinscheduler_1", outputFrame -> LOGGER.info(outputFrame.getUtf8String()))
|
||||
.waitingFor("dolphinscheduler_1", Wait.forHealthcheck());
|
||||
.waitingFor("dolphinscheduler_1", Wait.forHealthcheck().withStartupTimeout(Duration.ofSeconds(180)));
|
||||
|
||||
return compose;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -22,6 +22,7 @@
|
|||
<template slot="name"><strong>*</strong>{{$t('Folder Name')}}</template>
|
||||
<template slot="content">
|
||||
<el-input
|
||||
id="inputDirectoryName"
|
||||
type="input"
|
||||
v-model="name"
|
||||
maxlength="60"
|
||||
|
|
@ -35,6 +36,7 @@
|
|||
<template slot="name">{{$t('Description')}}</template>
|
||||
<template slot="content">
|
||||
<el-input
|
||||
id="inputDescription"
|
||||
type="textarea"
|
||||
v-model="description"
|
||||
style="width: 430px;"
|
||||
|
|
@ -47,8 +49,8 @@
|
|||
<template slot="name"> </template>
|
||||
<template slot="content">
|
||||
<div class="submit">
|
||||
<el-button type="primary" size="mini" round :loading="spinnerLoading" @click="ok()">{{spinnerLoading ? $t('Loading...') : $t('Create')}} </el-button>
|
||||
<el-button type="text" size="mini" @click="() => $router.push({name: 'file'})"> {{$t('Cancel')}} </el-button>
|
||||
<el-button id="btnSubmit" type="primary" size="mini" round :loading="spinnerLoading" @click="ok()">{{spinnerLoading ? $t('Loading...') : $t('Create')}} </el-button>
|
||||
<el-button id="btnCancel" type="text" size="mini" @click="() => $router.push({name: 'file'})"> {{$t('Cancel')}} </el-button>
|
||||
</div>
|
||||
</template>
|
||||
</m-list-box-f>
|
||||
|
|
|
|||
|
|
@ -17,7 +17,7 @@
|
|||
<template>
|
||||
<div class="list-model">
|
||||
<div class="table-box">
|
||||
<el-table :data="list" size="mini" style="width: 100%">
|
||||
<el-table :data="list" size="mini" style="width: 100%" row-class-name="items">
|
||||
<el-table-column type="index" :label="$t('#')" width="50"></el-table-column>
|
||||
<el-table-column :label="$t('Name')">
|
||||
<template slot-scope="scope">
|
||||
|
|
@ -71,7 +71,7 @@
|
|||
:title="$t('Delete?')"
|
||||
@onConfirm="_delete(scope.row,scope.row.id)"
|
||||
>
|
||||
<el-button type="danger" size="mini" icon="el-icon-delete" circle slot="reference"></el-button>
|
||||
<el-button id="delete" type="danger" size="mini" icon="el-icon-delete" circle slot="reference"></el-button>
|
||||
</el-popconfirm>
|
||||
</el-tooltip>
|
||||
</template>
|
||||
|
|
|
|||
|
|
@ -20,16 +20,19 @@
|
|||
<m-conditions @on-conditions="_onConditions">
|
||||
<template slot="button-group">
|
||||
<el-button-group size="small" >
|
||||
<el-button size="mini" @click="() => $router.push({name: 'resource-file-createFolder'})">{{$t('Create folder')}}</el-button>
|
||||
<el-button size="mini" @click="() => $router.push({name: 'resource-file-create'})">{{$t('Create File')}}</el-button>
|
||||
<el-button size="mini" @click="_uploading">{{$t('Upload Files')}}</el-button>
|
||||
<el-button id="btnCreateDirectory" size="mini" @click="() => $router.push({name: 'resource-file-createFolder'})">{{$t('Create folder')}}</el-button>
|
||||
<el-button id="btnCreateFile" size="mini" @click="() => $router.push({name: 'resource-file-create'})">{{$t('Create File')}}</el-button>
|
||||
<el-button id="btnUploadFile" size="mini" @click="_uploading">{{$t('Upload Files')}}</el-button>
|
||||
</el-button-group>
|
||||
</template>
|
||||
</m-conditions>
|
||||
</template>
|
||||
<template slot="content">
|
||||
<template v-if="fileResourcesList.length || total>0">
|
||||
<m-list @on-update="_onUpdate" :file-resources-list="fileResourcesList" :page-no="searchParams.pageNo" :page-size="searchParams.pageSize">
|
||||
<m-list @on-update="_onUpdate"
|
||||
:file-resources-list="fileResourcesList"
|
||||
:page-no="searchParams.pageNo"
|
||||
:page-size="searchParams.pageSize">
|
||||
</m-list>
|
||||
<div class="page-box">
|
||||
<el-pagination
|
||||
|
|
|
|||
|
|
@ -36,7 +36,7 @@
|
|||
</div>
|
||||
<div class="clearfix list">
|
||||
<div class="nav-links">
|
||||
<router-link :to="{ path: '/resource'}" tag="a" active-class="active">
|
||||
<router-link :to="{ path: '/resource'}" tag="a" active-class="active" id="tabResource">
|
||||
<span><em class="ansiconfont el-icon-folder"></em>{{$t('Resources manage')}}</span><strong></strong>
|
||||
</router-link>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -174,7 +174,8 @@ const menu = {
|
|||
isOpen: true,
|
||||
icon: 'el-icon-document-copy',
|
||||
children: [],
|
||||
enabled: true
|
||||
enabled: true,
|
||||
classNames: 'tab-file-manage'
|
||||
},
|
||||
{
|
||||
name: `${i18n.$t('UDF manage')}`,
|
||||
|
|
@ -188,13 +189,15 @@ const menu = {
|
|||
name: `${i18n.$t('Resource manage')}`,
|
||||
path: 'resource-udf',
|
||||
id: 0,
|
||||
enabled: true
|
||||
enabled: true,
|
||||
classNames: 'tab-udf-resource-manage'
|
||||
},
|
||||
{
|
||||
name: `${i18n.$t('Function manage')}`,
|
||||
path: 'resource-func',
|
||||
id: 1,
|
||||
enabled: true
|
||||
enabled: true,
|
||||
classNames: 'tab-function-resource-manage'
|
||||
}
|
||||
]
|
||||
},
|
||||
|
|
@ -210,13 +213,15 @@ const menu = {
|
|||
name: `${i18n.$t('Task group option')}`,
|
||||
path: 'task-group-option',
|
||||
id: 0,
|
||||
enabled: true
|
||||
enabled: true,
|
||||
classNames: 'tab-task-group-option-manage'
|
||||
},
|
||||
{
|
||||
name: `${i18n.$t('Task group queue')}`,
|
||||
path: 'task-group-queue',
|
||||
id: 1,
|
||||
enabled: true
|
||||
enabled: true,
|
||||
classNames: 'tab-task-group-queue-manage'
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue