blob: 9bc19baa07391a9255e9ddf5285aed0bbe39d44e [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import Ember from 'ember';
import CommonUtils from "../utils/common-utils";
import CustomMappingHandler from "../domain/custom-mapping-handler";
import {MappingMixin,ConfigurationMapper,PrepareMapper} from "../domain/mapping-utils";
var ActionJobHandler=Ember.Object.extend(MappingMixin,{
type:"actionJob",
context : {},
configurationMapper:ConfigurationMapper.create({}),
prepareMapper:PrepareMapper.create({}),
setContext(context){
this.context = context;
},
getContext(){
return this.context;
},
handle(nodeDomain,nodeObj,nodeName){
var actionObj={};
nodeObj[this.get("actionType")]=actionObj;
if (this.get("nameSpace")){
var schemaVersion=this.schemaVersions.actionVersions.get(this.get("actionType"));
if (this.get("nameSpace")){
var schema=this.get("nameSpace");
if (schemaVersion){
schema=CommonUtils.extractSchema(schema)+":"+schemaVersion;
}
nodeObj[this.get("actionType")]["_xmlns"]=schema;
}
}
var customMapping = CustomMappingHandler.getMapping(nodeName);
var mapping = this.mapping.copy();
if(customMapping){
Object.keys(customMapping).forEach((customProp)=>{
var index = mapping.indexOf(mapping.findBy('xml',customMapping[customProp].prevSibling));
mapping.insertAt(index+1, {xml:customProp,domain:customProp});
}.bind(this));
}
this.handleMapping(nodeDomain,actionObj,mapping,nodeName);
},
/* jshint unused:vars */
validate(nodeDomain){
//overwrite in implmentations and return array of errors object.
},
handleImport(actionNode,json){
this.handleImportMapping(actionNode,json,this.mapping);
var customMapping = {};
var x2js = new X2JS();
var actionXml = x2js.json2xml({action:json});
Object.keys(json).forEach((propKey)=>{
if(!this.mapping.findBy('xml', propKey) && propKey !== '_xmlns'){
var eltInXml = actionXml.getElementsByTagName(propKey)[0];
var previousSiblingXml = eltInXml.previousSibling;
var prevSibling = previousSiblingXml ? Object.keys(x2js.xml_str2json(new XMLSerializer().serializeToString(previousSiblingXml)))[0] : undefined;
customMapping[propKey] = {
prevSibling : prevSibling,
mapping : {xml:propKey,domain:propKey}
};
}
});
if(!Ember.isEmpty(Object.keys(customMapping))){
actionNode.customMapping = customMapping;
}
}
});
var JavaActionJobHandler=ActionJobHandler.extend({
actionType:"java",
mapping:null,
init(){
this.mapping=[
{xml:"job-tracker",domain:"jobTracker"},
{xml:"name-node",domain:"nameNode"},
{xml:"prepare",customHandler:this.prepareMapper},
{xml:"job-xml",domain:"jobXml",occurs:"many",domainProperty:"value"},
{xml:"configuration",customHandler:this.configurationMapper},
{xml:"main-class",domain:"mainClass",mandatory:true},
{xml:"java-opts",domain:"javaOpts"},
{xml:"java-opt",domain:"javaOpt",occurs:"many", domainProperty:"value"},
{xml:"arg",domain:"args",occurs:"many",domainProperty:"value"},
{xml:"file",domain:"files",occurs:"many",domainProperty:"value"},
{xml:"archive",domain:"archives",occurs:"many",domainProperty:"value"},
{xml:"capture-output",domain:"captureOutput",ignoreValue:true}
];
},
handleImport(actionNode,json){
this._super(actionNode,json);
}
});
var PigActionJobHandler=ActionJobHandler.extend({
actionType:"pig",
mapping:null,
init(){
this.mapping=[
{xml:"job-tracker",domain:"jobTracker"},
{xml:"name-node",domain:"nameNode"},
{xml:"prepare",customHandler:this.prepareMapper},
{xml:"job-xml",domain:"jobXml",occurs:"many",domainProperty:"value"},
{xml:"configuration",customHandler:this.configurationMapper},
{xml:"script",domain:"script",mandatory:true},
{xml:"param",domain:"param",domainProperty:"value",occurs:"many"},
{xml:"argument",domain:"args",occurs:"many",domainProperty:"value"},
{xml:"file",domain:"files",occurs:"many",domainProperty:"value"},
{xml:"archive",domain:"archives",occurs:"many",domainProperty:"value"}
];
}
});
var HiveActionJobHandler=ActionJobHandler.extend({
actionType:"hive",
nameSpace:"uri:oozie:hive-action:0.6",
mapping:null,
init(){
this.mapping=[
{xml:"job-tracker",domain:"jobTracker"},
{xml:"name-node",domain:"nameNode"},
{xml:"prepare",customHandler:this.prepareMapper},
{xml:"job-xml",domain:"jobXml",occurs:"many",domainProperty:"value"},
{xml:"configuration",customHandler:this.configurationMapper},
{xml:"script",domain:"script"},
{xml:"query",domain:"query"},
{xml:"param",domain:"params",domainProperty:"value",occurs:"many"},
{xml:"argument",domain:"args",occurs:"many",domainProperty:"value"},
{xml:"file",domain:"files",occurs:"many",domainProperty:"value"},
{xml:"archive",domain:"archives",occurs:"many",domainProperty:"value"}
];
},
validate(nodeDomain){
if (Ember.isBlank(nodeDomain.script) && Ember.isBlank(nodeDomain.query)){
return [{message : "Either script or query to be set."}];
}
}
});
var Hive2ActionJobHandler=ActionJobHandler.extend({
actionType:"hive2",
nameSpace:"uri:oozie:hive2-action:0.2",
mapping:null,
init(){
this.mapping=[
{xml:"job-tracker",domain:"jobTracker"},
{xml:"name-node",domain:"nameNode"},
{xml:"prepare",customHandler:this.prepareMapper},
{xml:"job-xml",domain:"jobXml",occurs:"many",domainProperty:"value"},
{xml:"configuration",customHandler:this.configurationMapper},
{xml:"jdbc-url",domain:"jdbc-url",mandatory:true},
{xml:"password",domain:"password"},
{xml:"script",domain:"script"},
{xml:"query",domain:"query"},
{xml:"param",domain:"params",domainProperty:"value",occurs:"many"},
{xml:"argument",domain:"args",occurs:"many",domainProperty:"value"},
{xml:"file",domain:"files",occurs:"many",domainProperty:"value"},
{xml:"archive",domain:"archives",occurs:"many",domainProperty:"value"}
];
},
validate(nodeDomain){
if (Ember.isBlank(nodeDomain.script) && Ember.isBlank(nodeDomain.query)){
return [{message : "Either script or query to be set."}];
}
}
});
var SqoopActionJobHandler=ActionJobHandler.extend({
actionType:"sqoop",
nameSpace:"uri:oozie:sqoop-action:0.4",
mapping:null,
init(){
this.mapping=[
{xml:"job-tracker",domain:"jobTracker"},
{xml:"name-node",domain:"nameNode"},
{xml:"prepare",customHandler:this.prepareMapper},
{xml:"job-xml",domain:"jobXml",occurs:"many",domainProperty:"value"},
{xml:"configuration",customHandler:this.configurationMapper},
{xml:"command",domain:"command"},
{xml:"arg",domain:"arg",occurs:"many",domainProperty:"value"},
{xml:"file",domain:"files",occurs:"many",domainProperty:"value"},
{xml:"archive",domain:"archives",occurs:"many",domainProperty:"value"}
];
},
validate(nodeDomain){
if (Ember.isBlank(nodeDomain.command) && (!nodeDomain.arg || nodeDomain.arg.length < 1)){
return [{message : "Either command or arguments have to be set."}];
}
}
});
var ShellActionJobHandler=ActionJobHandler.extend({
actionType:"shell",
nameSpace:"uri:oozie:shell-action:0.3",
mapping:null,
init(){
this.mapping=[
{xml:"job-tracker",domain:"jobTracker"},
{xml:"name-node",domain:"nameNode"},
{xml:"prepare",customHandler:this.prepareMapper},
{xml:"job-xml",domain:"jobXml",occurs:"many",domainProperty:"value"},
{xml:"configuration",customHandler:this.configurationMapper},
{xml:"exec",domain:"exec",mandatory:true},
{xml:"argument",domain:"args",occurs:"many",domainProperty:"value"},
{xml:"env-var",domain:"envVar",occurs:"many",domainProperty:"value"},
{xml:"file",domain:"files",occurs:"many",domainProperty:"value"},
{xml:"archive",domain:"archives",occurs:"many",domainProperty:"value"},
{xml:"capture-output",domain:"captureOutput",ignoreValue:true}
];
},
handleImport(actionNode,json){
this._super(actionNode,json);
}
});
var SparkActionJobHandler=ActionJobHandler.extend({
actionType:"spark",
nameSpace:"uri:oozie:spark-action:0.2",
mapping:null,
init(){
this.mapping=[
{xml:"job-tracker",domain:"jobTracker"},
{xml:"name-node",domain:"nameNode"},
{xml:"prepare",customHandler:this.prepareMapper},
{xml:"job-xml",domain:"jobXml",occurs:"many",domainProperty:"value"},
{xml:"configuration",customHandler:this.configurationMapper},
{xml:"master",domain:"master",mandatory:true,displayName:"Runs On"},
{xml:"mode",domain:"mode"},
{xml:"name",domain:"sparkName",mandatory:true},
{xml:"class",domain:"class"},
{xml:"jar",domain:"jar",mandatory:true,displayName:"Application"},
{xml:"spark-opts",domain:"sparkOpts"},
{xml:"arg",domain:"args",occurs:"many",domainProperty:"value"},
{xml:"file",domain:"files",occurs:"many",domainProperty:"value"},
{xml:"archive",domain:"archives",occurs:"many",domainProperty:"value"}
];
},
handleImport(actionNode,json){
if(json.master === "yarn-client") {
json.master = "yarn-cluster";
}
this._super(actionNode,json);
}
});
var SubWFActionJobHandler=ActionJobHandler.extend({
actionType:"sub-workflow",
mapping:null,
init(){
this.mapping=[
{xml:"app-path",domain:"appPath",mandatory:true},
{xml:"propagate-configuration",domain:"propagate-configuration", ignoreValue:true},
{xml:"configuration",customHandler:this.configurationMapper}
];
}
});
var DistCpJobHandler=ActionJobHandler.extend({
actionType:"distcp",
nameSpace:"uri:oozie:distcp-action:0.2",
mapping:null,
init(){
this.mapping=[
{xml:"job-tracker",domain:"jobTracker"},
{xml:"name-node",domain:"nameNode"},
{xml:"prepare",customHandler:this.handlePrepare},
{xml:"configuration",customHandler:this.configurationMapper},
{xml:"java-opts",domain:"javaOpts"},
{xml:"arg",domain:"args",occurs:"many",domainProperty:"value"},
];
},
});
var SshActionJobHandler=ActionJobHandler.extend({
actionType:"ssh",
nameSpace:"uri:oozie:ssh-action:0.2",
mapping:null,
init(){
this.mapping=[
{xml:"host",domain:"host"},
{xml:"command",domain:"command"},
{xml:"args",domain:"args",occurs:"many",domainProperty:"value"},
{xml:"arg",domain:"arg",occurs:"many",domainProperty:"value"},
{xml:"capture-output",domain:"captureOutput",ignoreValue:true}
];
},
handleImport(actionNode,json){
this._super(actionNode,json);
}
});
var EmailActionJobHandler=ActionJobHandler.extend({
actionType:"email",
nameSpace:"uri:oozie:email-action:0.2",
mapping:null,
init(){
this.mapping=[
{xml:"to",domain:"to",mandatory:true},
{xml:"cc",domain:"cc"},
{xml:"bcc",domain:"bcc"},
{xml:"subject",domain:"subject",mandatory:true},
{xml:"body",domain:"body",mandatory:true},
{xml:"content_type",domain:"content_type"},
{xml:"attachment",domain:"attachment"}
];
},
handleImport(actionNode,json){
this._super(actionNode,json);
}
});
var MapRedActionJobHandler=ActionJobHandler.extend({
actionType:"map-reduce",
mapping:null,
init(){
this.mapping=[
{xml:"job-tracker",domain:"jobTracker"},
{xml:"name-node",domain:"nameNode"},
{xml:"prepare",customHandler:this.prepareMapper},
{xml:"job-xml",domain:"jobXml",occurs:"many",domainProperty:"value"},
{xml:"config-class", domain:"config-class"},
{xml:"configuration",customHandler:this.configurationMapper},
{xml:"file",domain:"files",occurs:"many",domainProperty:"value"},
{xml:"archive",domain:"archives",occurs:"many",domainProperty:"value"}
];
},
handleImport(actionNode,json){
this._super(actionNode,json);
}
});
var CustomActionJobHandler=ActionJobHandler.extend({
actionType:'',
mapping:null,
init(){
this.mapping=[];
},
handleImport(actionNode,json){
actionNode.set('domain', json);
},
handle(nodeDomain,nodeObj,nodeName){
var customDomain = {};
Object.keys(nodeDomain).forEach(key =>{
if(key !== 'slaInfo' && key !== 'slaEnabled' && key!=='credentials'){
customDomain[key] = nodeDomain[key];
}
});
nodeObj[this.get("actionType")] = customDomain;
}
});
var FSActionJobHandler=ActionJobHandler.extend({
actionType:"fs",
mapping:null,
x2js : new X2JS({escapeMode:false}),
init(){
this.mapping=[
{xml:"name-node",domain:"nameNode"},
{xml:"job-xml",domain:"jobXml",occurs:"many",domainProperty:"value"},
{xml:"configuration", customHandler:this.configurationMapper},
{xml:"delete"},
{xml:"mkdir"},
{xml:"move"},
{xml:"chmod"},
{xml:"touchz"},
{xml:"chgrp"}
];
},
handle(nodeDomain,nodeObj,nodeName){
this._super(nodeDomain,nodeObj,nodeName);
if (!nodeDomain.fsOps){
return;
}
var $root = Ember.$('<XMLDocument />');
nodeDomain.fsOps.forEach(function(fsop){
switch (fsop.type) {
case 'delete':
$root.append(Ember.$('<delete/>').attr("path",fsop.path));
break;
case 'mkdir':
$root.append(Ember.$('<mkdir/>').attr("path",fsop.path));
break;
case 'move':
$root.append(Ember.$('<move/>').attr("source",fsop.source).attr("target",fsop.target));
break;
case 'touchz':
$root.append(Ember.$('<touchz/>').attr("path",fsop.path));
break;
case 'chmod':
var permissions, ownerPerm = 0, groupPerm = 0, othersPerm = 0, dirFiles = fsop.dirfiles;
if(fsop){
if(fsop.oread){
ownerPerm = 1;
}
if(fsop.owrite){
ownerPerm = ownerPerm + 2;
}
if(fsop.oexecute){
ownerPerm = ownerPerm + 4;
}
if(fsop.gread){
groupPerm = 1;
}
if(fsop.gwrite){
groupPerm = groupPerm + 2;
}
if(fsop.gexecute){
groupPerm = groupPerm + 4;
}
if(fsop.rread){
othersPerm = 1;
}
if(fsop.rwrite){
othersPerm = othersPerm + 2;
}
if(fsop.rexecute){
othersPerm = othersPerm + 4;
}
}
permissions = ownerPerm+""+groupPerm+""+othersPerm;
if(dirFiles === undefined){
dirFiles = false;
}
var conf={"_path":fsop.path,"_permissions":permissions,"_dir-files":dirFiles};
var chmodElem=Ember.$('<chmod/>').attr("path",fsop.path).attr("permissions",permissions).attr("dir-files",dirFiles);
if (fsop.recursive){
chmodElem.append('<recursive/>');
}
$root.append(chmodElem);
break;
case 'chgrp':
var dirFiles = fsop.dirfiles;
if(dirFiles === undefined){
dirFiles = false;
}
var chGrpElem=Ember.$('<chgrp/>').attr("path",fsop.path).attr("group",fsop.group).attr("dir-files",dirFiles);
if (fsop.recursive){
chGrpElem.append('<recursive/>');
}
$root.append(chGrpElem);
break;
default:
}
});
if (nodeObj.fs){
nodeObj['fs']=this.x2js.json2xml_str(nodeObj.fs)+$root.html();
}else{
nodeObj['fs']=$root.html();
}
console.log("generated root=",$root)
},
handleImport(actionNode,json,xmlDoc){
this._super(actionNode,json);
var commandKeys=["delete","mkdir","move","chmod","touchz","chgrp"];
var fsConfigs=xmlDoc[0].children[0].children;
var fsOps=actionNode.domain.fsOps=[];
for (var idx=0,len=fsConfigs.length;idx<len;idx++){
var fsCofig=fsConfigs[idx];
var tag=fsCofig.tagName;
var fsConf={};
fsOps.push(fsConf);
fsConf.type=tag;
var settings=fsConf;
switch (tag) {
case 'delete':
settings.path=fsCofig.getAttribute("path");
settings.skipTrash=fsCofig.getAttribute("skip-trash");
break;
case 'mkdir':
settings.path=fsCofig.getAttribute("path");
break;
case 'touchz':
settings.path=fsCofig.getAttribute("path");
break;
case 'move':
settings.source=fsCofig.getAttribute("source");
settings.target=fsCofig.getAttribute("target");
break;
case 'chmod':
settings.path=fsCofig.getAttribute("path");
settings.permissions=fsCofig.getAttribute("permissions");
settings.dirfiles==fsCofig.getAttribute("dir-files");
settings.recursive ==fsCofig.children.length===1 && fsCofig.children[0].tagName==="recursive";
var perm = settings.permissions.toString();
if(isNaN(perm)){
var permList = {"-":0,"r":1,"w":2,"x":4}, permissionNumFormat = "", permTokenNum = 0, tempArr = [1,4,7];
for(let p=0; p<tempArr.length; p++){
var permToken = perm.slice(tempArr[p],tempArr[p]+3);
for(let q=0; q<permToken.length; q++){
var tok = permList[permToken.slice(q,q+1)]
permTokenNum = permTokenNum + tok;
}
permissionNumFormat = permissionNumFormat +""+ permTokenNum;
permTokenNum = 0;
}
perm = permissionNumFormat;
}
for(var i=0; i< perm.length; i++){
var keyField;
if(i===0){
keyField = "o";
}else if(i===1){
keyField = "g";
}else if(i===2){
keyField = "r";
}
if(perm.slice(i,i+1) === "0"){
settings[keyField+"read"] = 0;
settings[keyField+"write"] = 0;
settings[keyField+"execute"] = 0;
}else if(perm.slice(i,i+1) === "1"){
settings[keyField+"read"] = 1;
settings[keyField+"write"] = 0;
settings[keyField+"execute"] = 0;
}else if(perm.slice(i,i+1) === "2"){
settings[keyField+"read"] = 0;
settings[keyField+"write"] = 2;
settings[keyField+"execute"] = 0;
}else if (perm.slice(i,i+1) === "3"){
settings[keyField+"read"] = 1;
settings[keyField+"write"] = 2;
settings[keyField+"execute"] = 0;
}else if (perm.slice(i,i+1) === "4"){
settings[keyField+"read"] = 0;
settings[keyField+"write"] = 0;
settings[keyField+"execute"] = 4;
}else if (perm.slice(i,i+1) === "5"){
settings[keyField+"read"] = 1;
settings[keyField+"write"] = 0;
settings[keyField+"execute"] = 4;
}else if (perm.slice(i,i+1) === "6"){
settings[keyField+"read"] = 0;
settings[keyField+"write"] = 2;
settings[keyField+"execute"] = 4;
}else if (perm.slice(i,i+1) === "7"){
settings[keyField+"read"] = 1;
settings[keyField+"write"] = 2;
settings[keyField+"execute"] = 4;
}
}
break;
case 'chgrp':
settings.path=fsCofig.getAttribute("path");
settings.group=fsCofig.getAttribute("group");
settings.dirfiles==fsCofig.getAttribute("dir-files");
settings.recursive ==fsCofig.children.length===1 && fsCofig.children[0].tagName==="recursive";
break;
default:
break;
}
}
}
});
export{ActionJobHandler,JavaActionJobHandler,PigActionJobHandler,HiveActionJobHandler,SqoopActionJobHandler,ShellActionJobHandler, EmailActionJobHandler,SparkActionJobHandler,MapRedActionJobHandler, Hive2ActionJobHandler, SubWFActionJobHandler, DistCpJobHandler, SshActionJobHandler, FSActionJobHandler, CustomActionJobHandler};