Browse Source

Merge remote-tracking branch 'upstream/dev' into spilit

pull/3/MERGE
lenboo 4 years ago
parent
commit
bb7106d100
  1. 12
      dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/utils/HadoopUtils.java
  2. 169
      dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/utils/KerberosHttpClient.java
  3. 124
      dolphinscheduler-ui/src/js/conf/home/pages/dag/_source/formModel/formModel.vue
  4. 1
      dolphinscheduler-ui/src/js/conf/home/pages/dag/_source/formModel/tasks/_source/dependItemList.vue
  5. 4
      dolphinscheduler-ui/src/js/conf/home/pages/dag/_source/formModel/tasks/conditions.vue
  6. 18
      dolphinscheduler-ui/src/js/conf/home/pages/dag/_source/formModel/tasks/datax.vue
  7. 10
      dolphinscheduler-ui/src/js/conf/home/pages/dag/_source/formModel/tasks/dependent.vue
  8. 1
      dolphinscheduler-ui/src/js/conf/home/pages/dag/_source/formModel/tasks/flink.vue
  9. 19
      dolphinscheduler-ui/src/js/conf/home/pages/dag/_source/formModel/tasks/http.vue
  10. 2
      dolphinscheduler-ui/src/js/conf/home/pages/dag/_source/formModel/tasks/mr.vue
  11. 49
      dolphinscheduler-ui/src/js/conf/home/pages/dag/_source/formModel/tasks/pre_tasks.vue
  12. 3
      dolphinscheduler-ui/src/js/conf/home/pages/dag/_source/formModel/tasks/python.vue
  13. 4
      dolphinscheduler-ui/src/js/conf/home/pages/dag/_source/formModel/tasks/sql.vue
  14. 200
      dolphinscheduler-ui/src/js/conf/home/pages/dag/_source/formModel/tasks/sqoop.vue
  15. 44
      dolphinscheduler-ui/src/js/conf/home/pages/dag/_source/formModel/tasks/sub_process.vue
  16. 2
      dolphinscheduler-ui/src/js/conf/home/pages/dag/_source/formModel/tasks/waterdrop.vue
  17. 8
      dolphinscheduler-ui/src/sass/common/index.scss

12
dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/utils/HadoopUtils.java

@ -428,12 +428,7 @@ public class HadoopUtils implements Closeable {
String applicationUrl = getApplicationUrl(applicationId); String applicationUrl = getApplicationUrl(applicationId);
logger.info("applicationUrl={}", applicationUrl); logger.info("applicationUrl={}", applicationUrl);
String responseContent; String responseContent = PropertyUtils.getBoolean(Constants.HADOOP_SECURITY_AUTHENTICATION_STARTUP_STATE, false) ? KerberosHttpClient.get(applicationUrl) : HttpUtils.get(applicationUrl);
if (PropertyUtils.getBoolean(Constants.HADOOP_SECURITY_AUTHENTICATION_STARTUP_STATE, false)) {
responseContent = KerberosHttpClient.get(applicationUrl);
} else {
responseContent = HttpUtils.get(applicationUrl);
}
if (responseContent != null) { if (responseContent != null) {
ObjectNode jsonObject = JSONUtils.parseObject(responseContent); ObjectNode jsonObject = JSONUtils.parseObject(responseContent);
if (!jsonObject.has("app")) { if (!jsonObject.has("app")) {
@ -445,7 +440,8 @@ public class HadoopUtils implements Closeable {
//may be in job history //may be in job history
String jobHistoryUrl = getJobHistoryUrl(applicationId); String jobHistoryUrl = getJobHistoryUrl(applicationId);
logger.info("jobHistoryUrl={}", jobHistoryUrl); logger.info("jobHistoryUrl={}", jobHistoryUrl);
responseContent = HttpUtils.get(jobHistoryUrl); responseContent = PropertyUtils.getBoolean(Constants.HADOOP_SECURITY_AUTHENTICATION_STARTUP_STATE, false) ? KerberosHttpClient.get(jobHistoryUrl) : HttpUtils.get(jobHistoryUrl);
if (null != responseContent) { if (null != responseContent) {
ObjectNode jsonObject = JSONUtils.parseObject(responseContent); ObjectNode jsonObject = JSONUtils.parseObject(responseContent);
if (!jsonObject.has("job")) { if (!jsonObject.has("job")) {
@ -682,7 +678,7 @@ public class HadoopUtils implements Closeable {
*/ */
public static String getRMState(String url) { public static String getRMState(String url) {
String retStr = HttpUtils.get(url); String retStr = PropertyUtils.getBoolean(Constants.HADOOP_SECURITY_AUTHENTICATION_STARTUP_STATE, false) ? KerberosHttpClient.get(url) : HttpUtils.get(url);
if (StringUtils.isEmpty(retStr)) { if (StringUtils.isEmpty(retStr)) {
return null; return null;

169
dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/utils/KerberosHttpClient.java

@ -14,9 +14,11 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package org.apache.dolphinscheduler.common.utils; package org.apache.dolphinscheduler.common.utils;
import org.apache.dolphinscheduler.common.Constants; import org.apache.dolphinscheduler.common.Constants;
import org.apache.http.auth.AuthSchemeProvider; import org.apache.http.auth.AuthSchemeProvider;
import org.apache.http.auth.AuthScope; import org.apache.http.auth.AuthScope;
import org.apache.http.auth.Credentials; import org.apache.http.auth.Credentials;
@ -28,15 +30,7 @@ import org.apache.http.impl.auth.SPNegoSchemeFactory;
import org.apache.http.impl.client.BasicCredentialsProvider; import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder; import org.apache.http.impl.client.HttpClientBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.security.auth.Subject;
import javax.security.auth.kerberos.KerberosPrincipal;
import javax.security.auth.login.AppConfigurationEntry;
import javax.security.auth.login.Configuration;
import javax.security.auth.login.LoginContext;
import javax.security.auth.login.LoginException;
import java.security.Principal; import java.security.Principal;
import java.security.PrivilegedAction; import java.security.PrivilegedAction;
import java.util.HashMap; import java.util.HashMap;
@ -44,95 +38,103 @@ import java.util.HashSet;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import javax.security.auth.Subject;
import javax.security.auth.kerberos.KerberosPrincipal;
import javax.security.auth.login.AppConfigurationEntry;
import javax.security.auth.login.Configuration;
import javax.security.auth.login.LoginContext;
import javax.security.auth.login.LoginException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/** /**
* kerberos http client * kerberos http client
*/ */
public class KerberosHttpClient { public class KerberosHttpClient {
public static final Logger logger = LoggerFactory.getLogger(KerberosHttpClient.class); public static final Logger logger = LoggerFactory.getLogger(KerberosHttpClient.class);
private String principal; private String principal;
private String keyTabLocation; private String keyTabLocation;
public KerberosHttpClient(String principal, String keyTabLocation) { public KerberosHttpClient(String principal, String keyTabLocation) {
super(); super();
this.principal = principal; this.principal = principal;
this.keyTabLocation = keyTabLocation; this.keyTabLocation = keyTabLocation;
} }
public KerberosHttpClient(String principal, String keyTabLocation, boolean isDebug) { public KerberosHttpClient(String principal, String keyTabLocation, boolean isDebug) {
this(principal, keyTabLocation); this(principal, keyTabLocation);
if (isDebug) { if (isDebug) {
System.setProperty("sun.security.spnego.debug", "true"); System.setProperty("sun.security.spnego.debug", "true");
System.setProperty("sun.security.krb5.debug", "true"); System.setProperty("sun.security.krb5.debug", "true");
} }
} }
public KerberosHttpClient(String principal, String keyTabLocation, String krb5Location, boolean isDebug) { public KerberosHttpClient(String principal, String keyTabLocation, String krb5Location, boolean isDebug) {
this(principal, keyTabLocation, isDebug); this(principal, keyTabLocation, isDebug);
System.setProperty("java.security.krb5.conf", krb5Location); System.setProperty("java.security.krb5.conf", krb5Location);
} }
private static CloseableHttpClient buildSpengoHttpClient() { private static CloseableHttpClient buildSpengoHttpClient() {
HttpClientBuilder builder = HttpClientBuilder.create(); HttpClientBuilder builder = HttpClientBuilder.create();
Lookup<AuthSchemeProvider> authSchemeRegistry = RegistryBuilder.<AuthSchemeProvider>create() Lookup<AuthSchemeProvider> authSchemeRegistry = RegistryBuilder.<AuthSchemeProvider>create()
.register(AuthSchemes.SPNEGO, new SPNegoSchemeFactory(true)).build(); .register(AuthSchemes.SPNEGO, new SPNegoSchemeFactory(true)).build();
builder.setDefaultAuthSchemeRegistry(authSchemeRegistry); builder.setDefaultAuthSchemeRegistry(authSchemeRegistry);
BasicCredentialsProvider credentialsProvider = new BasicCredentialsProvider(); BasicCredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(new AuthScope(null, -1, null), new Credentials() { credentialsProvider.setCredentials(new AuthScope(null, -1, null), new Credentials() {
@Override @Override
public Principal getUserPrincipal() { public Principal getUserPrincipal() {
return null; return null;
} }
@Override @Override
public String getPassword() { public String getPassword() {
return null; return null;
} }
}); });
builder.setDefaultCredentialsProvider(credentialsProvider); builder.setDefaultCredentialsProvider(credentialsProvider);
return builder.build(); return builder.build();
} }
public String get(final String url, final String userId) { public String get(final String url, final String userId) {
logger.info("Calling KerberosHttpClient {} {} {}", this.principal, this.keyTabLocation, url); logger.info("Calling KerberosHttpClient {} {} {}", this.principal, this.keyTabLocation, url);
Configuration config = new Configuration() { Configuration config = new Configuration() {
@SuppressWarnings("serial") @SuppressWarnings("serial")
@Override @Override
public AppConfigurationEntry[] getAppConfigurationEntry(String name) { public AppConfigurationEntry[] getAppConfigurationEntry(String name) {
Map<String, Object> options = new HashMap<>(9); Map<String, Object> options = new HashMap<>(9);
options.put("useTicketCache", "false"); options.put("useTicketCache", "false");
options.put("useKeyTab", "true"); options.put("useKeyTab", "true");
options.put("keyTab", keyTabLocation); options.put("keyTab", keyTabLocation);
options.put("refreshKrb5Config", "true"); options.put("refreshKrb5Config", "true");
options.put("principal", principal); options.put("principal", principal);
options.put("storeKey", "true"); options.put("storeKey", "true");
options.put("doNotPrompt", "true"); options.put("doNotPrompt", "true");
options.put("isInitiator", "true"); options.put("isInitiator", "true");
options.put("debug", "true"); options.put("debug", "true");
return new AppConfigurationEntry[] { return new AppConfigurationEntry[] {
new AppConfigurationEntry("com.sun.security.auth.module.Krb5LoginModule", new AppConfigurationEntry("com.sun.security.auth.module.Krb5LoginModule",
AppConfigurationEntry.LoginModuleControlFlag.REQUIRED, options) }; AppConfigurationEntry.LoginModuleControlFlag.REQUIRED, options) };
} }
}; };
Set<Principal> princ = new HashSet<>(1); Set<Principal> princ = new HashSet<>(1);
princ.add(new KerberosPrincipal(userId)); princ.add(new KerberosPrincipal(userId));
Subject sub = new Subject(false, princ, new HashSet<>(), new HashSet<>()); Subject sub = new Subject(false, princ, new HashSet<>(), new HashSet<>());
LoginContext lc; LoginContext lc;
try { try {
lc = new LoginContext("", sub, null, config); lc = new LoginContext("", sub, null, config);
lc.login(); lc.login();
Subject serviceSubject = lc.getSubject(); Subject serviceSubject = lc.getSubject();
return Subject.doAs(serviceSubject, (PrivilegedAction<String>) () -> { return Subject.doAs(serviceSubject, (PrivilegedAction<String>) () -> {
CloseableHttpClient httpClient = buildSpengoHttpClient(); CloseableHttpClient httpClient = buildSpengoHttpClient();
HttpGet httpget = new HttpGet(url); HttpGet httpget = new HttpGet(url);
return HttpUtils.getResponseContentString(httpget, httpClient); return HttpUtils.getResponseContentString(httpget, httpClient);
}); });
} catch (LoginException le) { } catch (LoginException le) {
logger.error("Kerberos authentication failed ", le); logger.error("Kerberos authentication failed ", le);
} }
return null; return null;
} }
/** /**
@ -143,14 +145,13 @@ public class KerberosHttpClient {
*/ */
public static String get(String url) { public static String get(String url) {
String responseContent; String responseContent;
KerberosHttpClient kerberosHttpClient = new KerberosHttpClient( KerberosHttpClient kerberosHttpClient = new KerberosHttpClient(
PropertyUtils.getString(Constants.LOGIN_USER_KEY_TAB_USERNAME), PropertyUtils.getString(Constants.LOGIN_USER_KEY_TAB_USERNAME),
PropertyUtils.getString(Constants.LOGIN_USER_KEY_TAB_PATH), PropertyUtils.getString(Constants.LOGIN_USER_KEY_TAB_PATH),
PropertyUtils.getString(Constants.JAVA_SECURITY_KRB5_CONF_PATH), true); PropertyUtils.getString(Constants.JAVA_SECURITY_KRB5_CONF_PATH), true);
responseContent = kerberosHttpClient.get(url, PropertyUtils.getString(Constants.LOGIN_USER_KEY_TAB_USERNAME)); responseContent = kerberosHttpClient.get(url, PropertyUtils.getString(Constants.LOGIN_USER_KEY_TAB_USERNAME));
return responseContent; return responseContent;
} }
} }

124
dolphinscheduler-ui/src/js/conf/home/pages/dag/_source/formModel/formModel.vue

@ -30,99 +30,83 @@
<div class="content-box" v-if="isContentBox"> <div class="content-box" v-if="isContentBox">
<div class="form-model"> <div class="form-model">
<!-- Node name --> <!-- Node name -->
<div class="clearfix list"> <m-list-box>
<div class="text-box"><span>{{$t('Node name')}}</span></div> <div slot="text">{{$t('Node name')}}</div>
<div class="cont-box"> <div slot="content">
<label class="label-box"> <el-input
<el-input type="text"
type="text" v-model="name"
v-model="name" size="small"
size="small" :disabled="isDetails"
:disabled="isDetails" :placeholder="$t('Please enter name (required)')"
:placeholder="$t('Please enter name (required)')" maxlength="100"
maxlength="100" @blur="_verifName()">
@blur="_verifName()"> </el-input>
</el-input>
</label>
</div> </div>
</div> </m-list-box>
<!-- Running sign --> <!-- Running sign -->
<div class="clearfix list"> <m-list-box>
<div class="text-box"><span>{{$t('Run flag')}}</span></div> <div slot="text">{{$t('Run flag')}}</div>
<div class="cont-box"> <div slot="content">
<label class="label-box"> <el-radio-group v-model="runFlag" size="small">
<el-radio-group v-model="runFlag" size="small"> <el-radio :label="'NORMAL'" :disabled="isDetails">{{$t('Normal')}}</el-radio>
<el-radio :label="'NORMAL'" :disabled="isDetails">{{$t('Normal')}}</el-radio> <el-radio :label="'FORBIDDEN'" :disabled="isDetails">{{$t('Prohibition execution')}}</el-radio>
<el-radio :label="'FORBIDDEN'" :disabled="isDetails">{{$t('Prohibition execution')}}</el-radio> </el-radio-group>
</el-radio-group>
</label>
</div> </div>
</div> </m-list-box>
<!-- description --> <!-- description -->
<div class="clearfix list"> <m-list-box>
<div class="text-box"> <div slot="text">{{$t('Description')}}</div>
<span>{{$t('Description')}}</span> <div slot="content">
<el-input
:rows="2"
type="textarea"
:disabled="isDetails"
v-model="description"
:placeholder="$t('Please enter description')">
</el-input>
</div> </div>
<div class="cont-box"> </m-list-box>
<label class="label-box">
<el-input
:rows="2"
type="textarea"
:disabled="isDetails"
v-model="description"
:placeholder="$t('Please enter description')">
</el-input>
</label>
</div>
</div>
<!-- Task priority --> <!-- Task priority -->
<div class="clearfix list"> <m-list-box>
<div class="text-box"> <div slot="text">{{$t('Task priority')}}</div>
<span>{{$t('Task priority')}}</span> <div slot="content">
</div>
<div class="cont-box">
<span class="label-box" style="width: 193px;display: inline-block;"> <span class="label-box" style="width: 193px;display: inline-block;">
<m-priority v-model="taskInstancePriority"></m-priority> <m-priority v-model="taskInstancePriority"></m-priority>
</span> </span>
<span class="text-b">{{$t('Worker group')}}</span> <span class="text-b">{{$t('Worker group')}}</span>
<m-worker-groups v-model="workerGroup"></m-worker-groups> <m-worker-groups v-model="workerGroup"></m-worker-groups>
</div> </div>
</div> </m-list-box>
<!-- Number of failed retries --> <!-- Number of failed retries -->
<div class="clearfix list" v-if="nodeData.taskType !== 'SUB_PROCESS'"> <m-list-box v-if="nodeData.taskType !== 'SUB_PROCESS'">
<div class="text-box"> <div slot="text">{{$t('Number of failed retries')}}</div>
<span>{{$t('Number of failed retries')}}</span> <div slot="content">
</div>
<div class="cont-box">
<m-select-input v-model="maxRetryTimes" :list="[0,1,2,3,4]"></m-select-input> <m-select-input v-model="maxRetryTimes" :list="[0,1,2,3,4]"></m-select-input>
<span>({{$t('Times')}})</span> <span>({{$t('Times')}})</span>
<span class="text-b">{{$t('Failed retry interval')}}</span> <span class="text-b">{{$t('Failed retry interval')}}</span>
<m-select-input v-model="retryInterval" :list="[1,10,30,60,120]"></m-select-input> <m-select-input v-model="retryInterval" :list="[1,10,30,60,120]"></m-select-input>
<span>({{$t('Minute')}})</span> <span>({{$t('Minute')}})</span>
</div> </div>
</div> </m-list-box>
<!-- Delay execution time --> <!-- Delay execution time -->
<div class="clearfix list" v-if="nodeData.taskType !== 'SUB_PROCESS' && nodeData.taskType !== 'CONDITIONS' && nodeData.taskType !== 'DEPENDENT'"> <m-list-box v-if="nodeData.taskType !== 'SUB_PROCESS' && nodeData.taskType !== 'CONDITIONS' && nodeData.taskType !== 'DEPENDENT'">
<div class="text-box"> <div slot="text">{{$t('Delay execution time')}}</div>
<span>{{$t('Delay execution time')}}</span> <div slot="content">
</div>
<div class="cont-box">
<m-select-input v-model="delayTime" :list="[0,1,5,10]"></m-select-input> <m-select-input v-model="delayTime" :list="[0,1,5,10]"></m-select-input>
<span>({{$t('Minute')}})</span> <span>({{$t('Minute')}})</span>
</div> </div>
</div> </m-list-box>
<!-- Branch flow --> <!-- Branch flow -->
<div class="clearfix list" v-if="nodeData.taskType === 'CONDITIONS'"> <m-list-box v-if="nodeData.taskType === 'CONDITIONS'">
<div class="text-box"> <div slot="text">{{$t('State')}}</div>
<span>{{$t('State')}}</span> <div slot="content">
</div>
<div class="cont-box">
<span class="label-box" style="width: 193px;display: inline-block;"> <span class="label-box" style="width: 193px;display: inline-block;">
<el-select style="width: 157px;" size="small" v-model="successNode" :disabled="true"> <el-select style="width: 157px;" size="small" v-model="successNode" :disabled="true">
<el-option v-for="item in stateList" :key="item.value" :value="item.value" :label="item.label"></el-option> <el-option v-for="item in stateList" :key="item.value" :value="item.value" :label="item.label"></el-option>
@ -133,12 +117,10 @@
<el-option v-for="item in nodeData.rearList" :key="item.value" :value="item.value" :label="item.label"></el-option> <el-option v-for="item in nodeData.rearList" :key="item.value" :value="item.value" :label="item.label"></el-option>
</el-select> </el-select>
</div> </div>
</div> </m-list-box>
<div class="clearfix list" v-if="nodeData.taskType === 'CONDITIONS'"> <m-list-box v-if="nodeData.taskType === 'CONDITIONS'">
<div class="text-box"> <div slot="text">{{$t('State')}}</div>
<span>{{$t('State')}}</span> <div slot="content">
</div>
<div class="cont-box">
<span class="label-box" style="width: 193px;display: inline-block;"> <span class="label-box" style="width: 193px;display: inline-block;">
<el-select style="width: 157px;" size="small" v-model="failedNode" :disabled="true"> <el-select style="width: 157px;" size="small" v-model="failedNode" :disabled="true">
<el-option v-for="item in stateList" :key="item.value" :value="item.value" :label="item.label"></el-option> <el-option v-for="item in stateList" :key="item.value" :value="item.value" :label="item.label"></el-option>
@ -149,7 +131,7 @@
<el-option v-for="item in nodeData.rearList" :key="item.value" :value="item.value" :label="item.label"></el-option> <el-option v-for="item in nodeData.rearList" :key="item.value" :value="item.value" :label="item.label"></el-option>
</el-select> </el-select>
</div> </div>
</div> </m-list-box>
<!-- Task timeout alarm --> <!-- Task timeout alarm -->
<m-timeout-alarm <m-timeout-alarm
@ -299,6 +281,7 @@
import mMr from './tasks/mr' import mMr from './tasks/mr'
import mSql from './tasks/sql' import mSql from './tasks/sql'
import i18n from '@/module/i18n' import i18n from '@/module/i18n'
import mListBox from './tasks/_source/listBox'
import mShell from './tasks/shell' import mShell from './tasks/shell'
import mWaterdrop from './tasks/waterdrop' import mWaterdrop from './tasks/waterdrop'
import mSpark from './tasks/spark' import mSpark from './tasks/spark'
@ -800,6 +783,7 @@
} }
}, },
components: { components: {
mListBox,
mMr, mMr,
mShell, mShell,
mWaterdrop, mWaterdrop,

1
dolphinscheduler-ui/src/js/conf/home/pages/dag/_source/formModel/tasks/_source/dependItemList.vue

@ -257,6 +257,7 @@
// get processlist // get processlist
this._getProjectList().then(() => { this._getProjectList().then(() => {
if (!this.dependItemList.length) { if (!this.dependItemList.length) {
if (!this.projectList.length) return
let projectId = this.projectList[0].value let projectId = this.projectList[0].value
this._getProcessByProjectId(projectId).then(definitionList => { this._getProcessByProjectId(projectId).then(definitionList => {
let value = definitionList[0].value let value = definitionList[0].value

4
dolphinscheduler-ui/src/js/conf/home/pages/dag/_source/formModel/tasks/conditions.vue

@ -15,7 +15,7 @@
* limitations under the License. * limitations under the License.
*/ */
<template> <template>
<div class="dependence-model"> <div class="conditions-model">
<m-list-box> <m-list-box>
<div slot="text">{{$t('Custom Parameters')}}</div> <div slot="text">{{$t('Custom Parameters')}}</div>
<div slot="content"> <div slot="content">
@ -178,7 +178,7 @@
</script> </script>
<style lang="scss" rel="stylesheet/scss"> <style lang="scss" rel="stylesheet/scss">
.dependence-model { .conditions-model {
margin-top: -10px; margin-top: -10px;
.dep-opt { .dep-opt {
margin-bottom: 10px; margin-bottom: 10px;

18
dolphinscheduler-ui/src/js/conf/home/pages/dag/_source/formModel/tasks/datax.vue

@ -26,7 +26,7 @@
</label> </label>
</div> </div>
</m-list-box> </m-list-box>
<div v-if="!enable"> <template v-if="!enable">
<m-list-box> <m-list-box>
<div slot="text">{{$t('Datasource')}}</div> <div slot="text">{{$t('Datasource')}}</div>
<div slot="content"> <div slot="content">
@ -115,8 +115,8 @@
<span>({{$t('0 means unlimited by count')}})</span> <span>({{$t('0 means unlimited by count')}})</span>
</div> </div>
</m-list-box> </m-list-box>
</div> </template>
<div v-else> <template v-else>
<m-list-box> <m-list-box>
<div slot="text">json</div> <div slot="text">json</div>
<div slot="content"> <div slot="content">
@ -140,12 +140,10 @@
</m-local-params> </m-local-params>
</div> </div>
</m-list-box> </m-list-box>
</div> </template>
<div class="clearfix list"> <m-list-box>
<div class="text-box"> <div slot="text">{{$t('Running Memory')}}</div>
<span>{{$t('Running Memory')}}</span> <div slot="content">
</div>
<div class="cont-box">
<span >{{$t('Min Memory')}}</span> <span >{{$t('Min Memory')}}</span>
<m-select-input v-model="xms" :list="[1,2,3,4]"> <m-select-input v-model="xms" :list="[1,2,3,4]">
</m-select-input> </m-select-input>
@ -155,7 +153,7 @@
</m-select-input> </m-select-input>
<span>&nbsp;&nbsp;&nbsp;G</span> <span>&nbsp;&nbsp;&nbsp;G</span>
</div> </div>
</div> </m-list-box>
<el-dialog <el-dialog
:visible.sync="scriptBoxDialog" :visible.sync="scriptBoxDialog"
append-to-body="true" append-to-body="true"

10
dolphinscheduler-ui/src/js/conf/home/pages/dag/_source/formModel/tasks/dependent.vue

@ -15,7 +15,7 @@
* limitations under the License. * limitations under the License.
*/ */
<template> <template>
<div class="dependence-model"> <div class="dependent-model">
<m-list-box> <m-list-box>
<div slot="text">{{$t('Add dependency')}}</div> <div slot="text">{{$t('Add dependency')}}</div>
<div slot="content"> <div slot="content">
@ -67,7 +67,7 @@
import disabledState from '@/module/mixin/disabledState' import disabledState from '@/module/mixin/disabledState'
export default { export default {
name: 'dependence', name: 'dependent',
data () { data () {
return { return {
relation: 'AND', relation: 'AND',
@ -132,7 +132,7 @@
this.isLoading = false this.isLoading = false
}, 600) }, 600)
}, },
cacheDependence (val) { cacheDependent (val) {
this.$emit('on-cache-dependent', val) this.$emit('on-cache-dependent', val)
} }
}, },
@ -157,7 +157,7 @@
destroyed () { destroyed () {
}, },
computed: { computed: {
cacheDependence () { cacheDependent () {
return { return {
relation: this.relation, relation: this.relation,
dependTaskList: _.map(this.dependTaskList, v => { dependTaskList: _.map(this.dependTaskList, v => {
@ -174,7 +174,7 @@
</script> </script>
<style lang="scss" rel="stylesheet/scss"> <style lang="scss" rel="stylesheet/scss">
.dependence-model { .dependent-model {
margin-top: -10px; margin-top: -10px;
.dep-opt { .dep-opt {
margin-bottom: 10px; margin-bottom: 10px;

1
dolphinscheduler-ui/src/js/conf/home/pages/dag/_source/formModel/tasks/flink.vue

@ -33,7 +33,6 @@
</el-select> </el-select>
</div> </div>
</m-list-box> </m-list-box>
<m-list-box v-if="programType !== 'PYTHON'"> <m-list-box v-if="programType !== 'PYTHON'">
<div slot="text">{{$t('Main Class')}}</div> <div slot="text">{{$t('Main Class')}}</div>
<div slot="content"> <div slot="content">

19
dolphinscheduler-ui/src/js/conf/home/pages/dag/_source/formModel/tasks/http.vue

@ -88,8 +88,7 @@
</el-input> </el-input>
</div> </div>
</m-list-box> </m-list-box>
<m-list-box>
<m-list-box >
<div slot="text">{{$t('Timeout Settings')}}</div> <div slot="text">{{$t('Timeout Settings')}}</div>
<div slot="content"> <div slot="content">
<label class="label-box"> <label class="label-box">
@ -99,24 +98,20 @@
</label> </label>
</div> </div>
</m-list-box> </m-list-box>
<m-list-box v-if="timeoutSettings">
<div class="clearfix list" v-if = "timeoutSettings" > <div slot="text">{{$t('Connect Timeout')}}</div>
<div class="text-box"> <div slot="content">
<span>{{$t('Connect Timeout')}}</span> <span class="label-box" style="width: 193px;display: inline-block;">
</div>
<div class="cont-box">
<span class="label-box" style="width: 193px;display: inline-block;" >
<el-input size="small" v-model='connectTimeout' maxlength="7"></el-input> <el-input size="small" v-model='connectTimeout' maxlength="7"></el-input>
</span> </span>
<span>{{$t('ms')}}</span> <span>{{$t('ms')}}</span>
<span class="text-b">{{$t('Socket Timeout')}}</span> <span class="text-b">{{$t('Socket Timeout')}}</span>
<span class="label-box" style="width: 193px;display: inline-block;" > <span class="label-box" style="width: 193px;display: inline-block;">
<el-input size="small" v-model='socketTimeout' maxlength="7"></el-input> <el-input size="small" v-model='socketTimeout' maxlength="7"></el-input>
</span> </span>
<span>{{$t('ms')}}</span> <span>{{$t('ms')}}</span>
</div> </div>
</div> </m-list-box>
<m-list-box> <m-list-box>
<div slot="text">{{$t('Custom Parameters')}}</div> <div slot="text">{{$t('Custom Parameters')}}</div>
<div slot="content"> <div slot="content">

2
dolphinscheduler-ui/src/js/conf/home/pages/dag/_source/formModel/tasks/mr.vue

@ -15,7 +15,7 @@
* limitations under the License. * limitations under the License.
*/ */
<template> <template>
<div class="spark-model"> <div class="mr-model">
<m-list-box> <m-list-box>
<div slot="text">{{$t('Program Type')}}</div> <div slot="text">{{$t('Program Type')}}</div>
<div slot="content"> <div slot="content">

49
dolphinscheduler-ui/src/js/conf/home/pages/dag/_source/formModel/tasks/pre_tasks.vue

@ -16,35 +16,33 @@
*/ */
<template> <template>
<div class="pre_tasks-model"> <div class="pre_tasks-model">
<div class="clearfix list"> <m-list-box>
<div class="text-box"> <div slot="text">{{$t('Pre tasks')}}</div>
<span>{{$t('Pre tasks')}}</span> <div slot="content">
<el-select
ref="preTasksSelector"
style="width: 100%;"
filterable
multiple
size="small"
v-model="preTasks"
:disabled="isDetails"
:id="preTasksSelectorId">
<el-option
v-for="task in preTaskList"
:key="task.id"
:value="task.id"
:label="task.name">
</el-option>
</el-select>
</div> </div>
<div class="cont-box"> </m-list-box>
<div class="label-box">
<el-select
ref="preTasksSelector"
style="width: 100%;"
filterable
multiple
size="small"
v-model="preTasks"
:disabled="isDetails"
:id="preTasksSelectorId">
<el-option
v-for="task in preTaskList"
:key="task.id"
:value="task.id"
:label="task.name">
</el-option>
</el-select>
</div>
</div>
</div>
</div> </div>
</template> </template>
<script> <script>
import disabledState from '@/module/mixin/disabledState' import disabledState from '@/module/mixin/disabledState'
import mListBox from './_source/listBox'
export default { export default {
name: 'pre_tasks', name: 'pre_tasks',
mixins: [disabledState], mixins: [disabledState],
@ -104,6 +102,7 @@
}) })
return true return true
} }
} },
components: { mListBox }
} }
</script> </script>

3
dolphinscheduler-ui/src/js/conf/home/pages/dag/_source/formModel/tasks/python.vue

@ -15,7 +15,7 @@
* limitations under the License. * limitations under the License.
*/ */
<template> <template>
<div class="shell-model"> <div class="python-model">
<m-list-box> <m-list-box>
<div slot="text">{{$t('Script')}}</div> <div slot="text">{{$t('Script')}}</div>
<div slot="content"> <div slot="content">
@ -36,7 +36,6 @@
</treeselect> </treeselect>
</div> </div>
</m-list-box> </m-list-box>
<m-list-box> <m-list-box>
<div slot="text">{{$t('Custom Parameters')}}</div> <div slot="text">{{$t('Custom Parameters')}}</div>
<div slot="content"> <div slot="content">

4
dolphinscheduler-ui/src/js/conf/home/pages/dag/_source/formModel/tasks/sql.vue

@ -34,7 +34,7 @@
</div> </div>
</div> </div>
</m-list-box> </m-list-box>
<template v-if="sqlType==0"> <template v-if="sqlType === 0">
<m-list-box> <m-list-box>
<div slot="text"><strong class='requiredIcon'>*</strong>{{$t('Title')}}</div> <div slot="text"><strong class='requiredIcon'>*</strong>{{$t('Title')}}</div>
<div slot="content"> <div slot="content">
@ -54,7 +54,7 @@
</div> </div>
</m-list-box> </m-list-box>
</template> </template>
<m-list-box v-show="type === 'HIVE'"> <m-list-box v-if="type === 'HIVE'">
<div slot="text">{{$t('SQL Parameter')}}</div> <div slot="text">{{$t('SQL Parameter')}}</div>
<div slot="content"> <div slot="content">
<el-input <el-input

200
dolphinscheduler-ui/src/js/conf/home/pages/dag/_source/formModel/tasks/sqoop.vue

@ -15,8 +15,7 @@
* limitations under the License. * limitations under the License.
*/ */
<template> <template>
<div class="sql-model"> <div class="sqoop-model">
<m-list-box> <m-list-box>
<div slot="text">{{$t('Custom Job')}}</div> <div slot="text">{{$t('Custom Job')}}</div>
<div slot="content"> <div slot="content">
@ -78,99 +77,88 @@
</m-local-params> </m-local-params>
</div> </div>
</m-list-box> </m-list-box>
<m-list-box>
<template> <div slot="text" style="font-weight:bold">{{$t('Data Source')}}</div>
</m-list-box>
<hr style="margin-left: 60px;">
<m-list-box>
<div slot="text">{{$t('Type')}}</div>
<div slot="content">
<el-select
style="width: 130px;"
size="small"
v-model="sourceType"
:disabled="isDetails"
@change="_handleSourceTypeChange">
<el-option
v-for="city in sourceTypeList"
:key="city.code"
:value="city.code"
:label="city.code">
</el-option>
</el-select>
</div>
</m-list-box>
<template v-if="sourceType === 'MYSQL'">
<m-list-box> <m-list-box>
<div slot="text" style="font-weight:bold">{{$t('Data Source')}}</div> <div slot="text">{{$t('Datasource')}}</div>
<div slot="content">
<m-datasource
ref="refSourceDs"
@on-dsData="_onSourceDsData"
:data="{type:sourceMysqlParams.srcType,
typeList: [{id: 0, code: 'MYSQL', disabled: false}],
datasource:sourceMysqlParams.srcDatasource }"
>
</m-datasource>
</div>
</m-list-box> </m-list-box>
<hr style="margin-left: 60px;">
<m-list-box> <m-list-box>
<div slot="text">{{$t('Type')}}</div> <div slot="text">{{$t('ModelType')}}</div>
<div slot="content"> <div slot="content">
<el-select <el-radio-group v-model="srcQueryType" size="small" @change="_handleQueryType">
style="width: 130px;" <el-radio label="0">{{$t('Form')}}</el-radio>
size="small" <el-radio label="1">SQL</el-radio>
v-model="sourceType" </el-radio-group>
:disabled="isDetails"
@change="_handleSourceTypeChange">
<el-option
v-for="city in sourceTypeList"
:key="city.code"
:value="city.code"
:label="city.code">
</el-option>
</el-select>
</div> </div>
</m-list-box> </m-list-box>
<template v-if="sourceMysqlParams.srcQueryType === '0'">
<template v-if="sourceType ==='MYSQL'">
<m-list-box> <m-list-box>
<div slot="text">{{$t('Datasource')}}</div> <div slot="text">{{$t('Table')}}</div>
<div slot="content"> <div slot="content">
<m-datasource <el-input
ref="refSourceDs" :disabled="isDetails"
@on-dsData="_onSourceDsData" type="text"
:data="{type:sourceMysqlParams.srcType, size="small"
typeList: [{id: 0, code: 'MYSQL', disabled: false}], v-model="sourceMysqlParams.srcTable"
datasource:sourceMysqlParams.srcDatasource }" :placeholder="$t('Please enter Mysql Table(required)')">
> </el-input>
</m-datasource>
</div> </div>
</m-list-box> </m-list-box>
<m-list-box> <m-list-box>
<div slot="text">{{$t('ModelType')}}</div> <div slot="text">{{$t('ColumnType')}}</div>
<div slot="content"> <div slot="content">
<el-radio-group v-model="srcQueryType" size="small" @change="_handleQueryType"> <el-radio-group v-model="sourceMysqlParams.srcColumnType" size="small" style="vertical-align: sub;">
<el-radio label="0">{{$t('Form')}}</el-radio> <el-radio label="0">{{$t('All Columns')}}</el-radio>
<el-radio label="1">SQL</el-radio> <el-radio label="1">{{$t('Some Columns')}}</el-radio>
</el-radio-group> </el-radio-group>
</div> </div>
</m-list-box> </m-list-box>
<m-list-box v-if="sourceMysqlParams.srcColumnType === '1'">
<template v-if="sourceMysqlParams.srcQueryType=='0'"> <div slot="text">{{$t('Column')}}</div>
<div slot="content">
<m-list-box> <el-input
<div slot="text">{{$t('Table')}}</div> :disabled="isDetails"
<div slot="content"> type="text"
<el-input size="small"
:disabled="isDetails" v-model="sourceMysqlParams.srcColumns"
type="text" :placeholder="$t('Please enter Columns (Comma separated)')">
size="small" </el-input>
v-model="sourceMysqlParams.srcTable" </div>
:placeholder="$t('Please enter Mysql Table(required)')"> </m-list-box>
</el-input>
</div>
</m-list-box>
<m-list-box>
<div slot="text">{{$t('ColumnType')}}</div>
<div slot="content">
<el-radio-group v-model="sourceMysqlParams.srcColumnType" size="small" style="vertical-align: sub;">
<el-radio label="0">{{$t('All Columns')}}</el-radio>
<el-radio label="1">{{$t('Some Columns')}}</el-radio>
</el-radio-group>
</div>
</m-list-box>
<m-list-box v-if="sourceMysqlParams.srcColumnType=='1'">
<div slot="text">{{$t('Column')}}</div>
<div slot="content">
<el-input
:disabled="isDetails"
type="text"
size="small"
v-model="sourceMysqlParams.srcColumns"
:placeholder="$t('Please enter Columns (Comma separated)')">
</el-input>
</div>
</m-list-box>
</template>
</template> </template>
</template> </template>
<template v-if="sourceType === 'HIVE'">
<template v-if="sourceType=='HIVE'">
<m-list-box> <m-list-box>
<div slot="text">{{$t('Database')}}</div> <div slot="text">{{$t('Database')}}</div>
<div slot="content"> <div slot="content">
@ -220,8 +208,7 @@
</div> </div>
</m-list-box> </m-list-box>
</template> </template>
<template v-if="sourceType === 'HDFS'">
<template v-if="sourceType=='HDFS'">
<m-list-box> <m-list-box>
<div slot="text">{{$t('Export Dir')}}</div> <div slot="text">{{$t('Export Dir')}}</div>
<div slot="content"> <div slot="content">
@ -235,25 +222,23 @@
</div> </div>
</m-list-box> </m-list-box>
</template> </template>
<template v-if="sourceType === 'MYSQL'">
<m-list-box v-show="srcQueryType === '1' && sourceType ==='MYSQL'"> <m-list-box v-if="srcQueryType === '1'">
<div slot="text">{{$t('SQL Statement')}}</div> <div slot="text">{{$t('SQL Statement')}}</div>
<div slot="content"> <div slot="content">
<div class="from-mirror"> <div class="from-mirror">
<textarea <textarea
id="code-sqoop-mirror" id="code-sqoop-mirror"
name="code-sqoop-mirror" name="code-sqoop-mirror"
style="opacity: 0;"> style="opacity: 0;">
</textarea> </textarea>
<a class="ans-modal-box-max"> <a class="ans-modal-box-max">
<em class="el-icon-full-screen" @click="setEditorVal"></em> <em class="el-icon-full-screen" @click="setEditorVal"></em>
</a> </a>
</div> </div>
</div> </div>
</m-list-box> </m-list-box>
<m-list-box>
<template>
<m-list-box v-show="sourceType === 'MYSQL'">
<div slot="text">{{$t('Map Column Hive')}}</div> <div slot="text">{{$t('Map Column Hive')}}</div>
<div slot="content"> <div slot="content">
<m-local-params <m-local-params
@ -264,7 +249,7 @@
</m-local-params> </m-local-params>
</div> </div>
</m-list-box> </m-list-box>
<m-list-box v-show="sourceType === 'MYSQL'"> <m-list-box>
<div slot="text">{{$t('Map Column Java')}}</div> <div slot="text">{{$t('Map Column Java')}}</div>
<div slot="content"> <div slot="content">
<m-local-params <m-local-params
@ -276,12 +261,10 @@
</div> </div>
</m-list-box> </m-list-box>
</template> </template>
<m-list-box> <m-list-box>
<div slot="text" style="font-weight:bold">{{$t('Data Target')}}</div> <div slot="text" style="font-weight:bold">{{$t('Data Target')}}</div>
</m-list-box> </m-list-box>
<hr style="margin-left: 60px;"> <hr style="margin-left: 60px;">
<m-list-box> <m-list-box>
<div slot="text">{{$t('Type')}}</div> <div slot="text">{{$t('Type')}}</div>
<div slot="content"> <div slot="content">
@ -299,7 +282,7 @@
</el-select> </el-select>
</div> </div>
</m-list-box> </m-list-box>
<div v-show="targetType==='HIVE'"> <template v-if="targetType === 'HIVE'">
<m-list-box> <m-list-box>
<div slot="text">{{$t('Database')}}</div> <div slot="text">{{$t('Database')}}</div>
<div slot="content"> <div slot="content">
@ -378,8 +361,8 @@
</el-input> </el-input>
</div> </div>
</m-list-box> </m-list-box>
</div> </template>
<div v-show="targetType==='HDFS'"> <template v-if="targetType === 'HDFS'">
<m-list-box> <m-list-box>
<div slot="text">{{$t('Target Dir')}}</div> <div slot="text">{{$t('Target Dir')}}</div>
<div slot="content"> <div slot="content">
@ -444,8 +427,8 @@
</el-input> </el-input>
</div> </div>
</m-list-box> </m-list-box>
</div> </template>
<div v-show="targetType==='MYSQL'"> <template v-if="targetType === 'MYSQL'">
<m-list-box> <m-list-box>
<div slot="text">{{$t('Datasource')}}</div> <div slot="text">{{$t('Datasource')}}</div>
<div slot="content"> <div slot="content">
@ -534,8 +517,7 @@
</el-radio-group> </el-radio-group>
</div> </div>
</m-list-box> </m-list-box>
</template>
</div>
<m-list-box> <m-list-box>
<div slot="text">{{$t('Concurrency')}}</div> <div slot="text">{{$t('Concurrency')}}</div>
<div slot="content"> <div slot="content">

44
dolphinscheduler-ui/src/js/conf/home/pages/dag/_source/formModel/tasks/sub_process.vue

@ -16,35 +16,32 @@
*/ */
<template> <template>
<div class="sub_process-model"> <div class="sub_process-model">
<div class="clearfix list"> <m-list-box>
<div class="text-box"> <div slot="text">{{$t('Child Node')}}</div>
<span>{{$t('Child Node')}}</span> <div slot="content">
<el-select
style="width: 100%;"
size="small"
filterable
v-model="wdiCurr"
:disabled="isDetails"
@change="_handleWdiChanged">
<el-option
v-for="city in processDefinitionList"
:key="city.code"
:value="city.id"
:label="city.code">
</el-option>
</el-select>
</div> </div>
<div class="cont-box"> </m-list-box>
<div class="label-box">
<el-select
style="width: 100%;"
size="small"
filterable
v-model="wdiCurr"
:disabled="isDetails"
@change="_handleWdiChanged">
<el-option
v-for="city in processDefinitionList"
:key="city.code"
:value="city.id"
:label="city.code">
</el-option>
</el-select>
</div>
</div>
</div>
</div> </div>
</template> </template>
<script> <script>
import _ from 'lodash' import _ from 'lodash'
import i18n from '@/module/i18n' import i18n from '@/module/i18n'
import disabledState from '@/module/mixin/disabledState' import disabledState from '@/module/mixin/disabledState'
import mListBox from './_source/listBox'
export default { export default {
name: 'sub_process', name: 'sub_process',
@ -125,6 +122,7 @@
} }
}, },
mounted () { mounted () {
} },
components: { mListBox }
} }
</script> </script>

2
dolphinscheduler-ui/src/js/conf/home/pages/dag/_source/formModel/tasks/waterdrop.vue

@ -15,7 +15,7 @@
* limitations under the License. * limitations under the License.
*/ */
<template> <template>
<div class="shell-model"> <div class="waterdrop-model">
<!--deploy mode--> <!--deploy mode-->
<m-list-box> <m-list-box>
<div slot="text">{{$t('Deploy Mode')}}</div> <div slot="text">{{$t('Deploy Mode')}}</div>

8
dolphinscheduler-ui/src/sass/common/index.scss

@ -365,6 +365,8 @@ body::-webkit-scrollbar-thumb {
.el-dialog__body { .el-dialog__body {
padding: 10px; padding: 10px;
} }
.el-dialog__header {
.el-dialog__headerbtn {
right: 10px;
}
}

Loading…
Cancel
Save