You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by pa...@apache.org on 2017/01/16 09:19:21 UTC
ambari git commit: AMBARI-19478. Need to handle unsupported
configurations gracefully in workflow actions. (pallavkul via Padma Priya)
Repository: ambari
Updated Branches:
refs/heads/trunk e17af8b29 -> 8b43080a0
AMBARI-19478. Need to handle unsupported configurations gracefully in workflow actions. (pallavkul via Padma Priya)
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/8b43080a
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/8b43080a
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/8b43080a
Branch: refs/heads/trunk
Commit: 8b43080a0025f9146172005b20df3f3a170782fe
Parents: e17af8b
Author: pallavkul <pa...@gmail.com>
Authored: Mon Jan 16 14:48:19 2017 +0530
Committer: pallavkul <pa...@gmail.com>
Committed: Mon Jan 16 14:48:19 2017 +0530
----------------------------------------------------------------------
.../resources/ui/app/components/sla-info.js | 1 +
.../ui/app/components/workflow-action-editor.js | 9 +++++++
.../ui/app/domain/actionjob_hanlder.js | 28 +++++++++++++++++++-
.../ui/app/domain/custom-mapping-handler.js | 28 ++++++++++++++++++++
.../resources/ui/app/domain/mapping-utils.js | 16 ++++++++---
.../ui/app/domain/workflow-json-importer.js | 3 +++
.../ui/app/domain/workflow-xml-generator.js | 5 ++++
.../src/main/resources/ui/app/styles/app.less | 12 +++++++++
.../components/workflow-action-editor.hbs | 11 ++++++++
9 files changed, 108 insertions(+), 5 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ambari/blob/8b43080a/contrib/views/wfmanager/src/main/resources/ui/app/components/sla-info.js
----------------------------------------------------------------------
diff --git a/contrib/views/wfmanager/src/main/resources/ui/app/components/sla-info.js b/contrib/views/wfmanager/src/main/resources/ui/app/components/sla-info.js
index 7390205..bcc209b 100644
--- a/contrib/views/wfmanager/src/main/resources/ui/app/components/sla-info.js
+++ b/contrib/views/wfmanager/src/main/resources/ui/app/components/sla-info.js
@@ -148,6 +148,7 @@ export default Ember.Component.extend(Validations, {
this.$('input[name="nominalTime"]').datetimepicker({
useCurrent: false,
showClose : true,
+ format: 'MM/DD/YYYY hh:mm A',
defaultDate : this.get('slaInfo.nominalTime')
});
this.sendAction('register','slaInfo', this);
http://git-wip-us.apache.org/repos/asf/ambari/blob/8b43080a/contrib/views/wfmanager/src/main/resources/ui/app/components/workflow-action-editor.js
----------------------------------------------------------------------
diff --git a/contrib/views/wfmanager/src/main/resources/ui/app/components/workflow-action-editor.js b/contrib/views/wfmanager/src/main/resources/ui/app/components/workflow-action-editor.js
index 8ee5a0a..8a3c7cf 100644
--- a/contrib/views/wfmanager/src/main/resources/ui/app/components/workflow-action-editor.js
+++ b/contrib/views/wfmanager/src/main/resources/ui/app/components/workflow-action-editor.js
@@ -58,6 +58,15 @@ export default Ember.Component.extend( Ember.Evented,{
return this.get('actionIcons')[this.get('actionType')];
}),
saveClicked : false,
+ containsUnsupportedProperties : Ember.computed('actionModel.unsupportedProperties', function(){
+ return this.get('actionModel.unsupportedProperties') ? !Ember.isEmpty(Object.keys(this.get('actionModel.unsupportedProperties'))) : false;
+ }),
+ unsupportedPropertiesXml : Ember.computed('actionModel.unsupportedProperties', function(){
+ if(this.get('containsUnsupportedProperties')){
+ var x2js = new X2JS();
+ return vkbeautify.xml(x2js.json2xml_str(this.get('actionModel.unsupportedProperties')));
+ }
+ }),
fileBrowser : Ember.inject.service('file-browser'),
onDestroy : function(){
this.set('transition',{});
http://git-wip-us.apache.org/repos/asf/ambari/blob/8b43080a/contrib/views/wfmanager/src/main/resources/ui/app/domain/actionjob_hanlder.js
----------------------------------------------------------------------
diff --git a/contrib/views/wfmanager/src/main/resources/ui/app/domain/actionjob_hanlder.js b/contrib/views/wfmanager/src/main/resources/ui/app/domain/actionjob_hanlder.js
index 99d96ac..0bb2fb8 100644
--- a/contrib/views/wfmanager/src/main/resources/ui/app/domain/actionjob_hanlder.js
+++ b/contrib/views/wfmanager/src/main/resources/ui/app/domain/actionjob_hanlder.js
@@ -17,6 +17,7 @@
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",
@@ -42,7 +43,15 @@ var ActionJobHandler=Ember.Object.extend(MappingMixin,{
nodeObj[this.get("actionType")]["_xmlns"]=schema;
}
}
- this.handleMapping(nodeDomain,actionObj,this.mapping,nodeName);
+ 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){
@@ -50,6 +59,23 @@ var ActionJobHandler=Ember.Object.extend(MappingMixin,{
},
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({
http://git-wip-us.apache.org/repos/asf/ambari/blob/8b43080a/contrib/views/wfmanager/src/main/resources/ui/app/domain/custom-mapping-handler.js
----------------------------------------------------------------------
diff --git a/contrib/views/wfmanager/src/main/resources/ui/app/domain/custom-mapping-handler.js b/contrib/views/wfmanager/src/main/resources/ui/app/domain/custom-mapping-handler.js
new file mode 100644
index 0000000..aa003e6
--- /dev/null
+++ b/contrib/views/wfmanager/src/main/resources/ui/app/domain/custom-mapping-handler.js
@@ -0,0 +1,28 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements. See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+import Ember from 'ember';
+import CommonUtils from "../utils/common-utils";
+export default Ember.Object.create({
+ customMappingMap : new Map(),
+ setMapping(id, mapping){
+ this.customMappingMap.set(id, mapping);
+ },
+ getMapping(id){
+ return this.customMappingMap.get(id);
+ },
+});
http://git-wip-us.apache.org/repos/asf/ambari/blob/8b43080a/contrib/views/wfmanager/src/main/resources/ui/app/domain/mapping-utils.js
----------------------------------------------------------------------
diff --git a/contrib/views/wfmanager/src/main/resources/ui/app/domain/mapping-utils.js b/contrib/views/wfmanager/src/main/resources/ui/app/domain/mapping-utils.js
index d4d8f50..1929ddf 100644
--- a/contrib/views/wfmanager/src/main/resources/ui/app/domain/mapping-utils.js
+++ b/contrib/views/wfmanager/src/main/resources/ui/app/domain/mapping-utils.js
@@ -62,12 +62,20 @@ var MappingMixin= Ember.Mixin.create({
},
handleImportMapping(actionNode,json,mappings){
- var domain={};
+ var domain={
+ unsupportedProperties : {}
+ };
if (json._xmlns){
var version=CommonUtils.extractSchemaVersion(json._xmlns);
//this.schemaVersions.setActionVersion(actionNode.actionType,version);
}
actionNode.set("domain",domain);
+ Object.keys(json).forEach((propKey)=>{
+ if(!mappings.findBy('xml', propKey) && propKey !=='_xmlns'){
+ domain.unsupportedProperties[propKey] = json[propKey];
+ domain[propKey] = json[propKey];
+ }
+ });
mappings.forEach(function(mapping){
if (!mapping.occurs) {
mapping.occurs = "once";
@@ -210,13 +218,13 @@ var SLAMapper= Ember.Object.extend({
if (sla.nominalTime){
slaInfo[slaPrefix+":"+"nominal-time"]=sla.nominalTime;
}
- if (sla.shouldStart){
+ if (sla.shouldStart && sla.shouldStart.time){
slaInfo[slaPrefix+":"+"should-start"]="${"+sla.shouldStart.time+ "*"+sla.shouldStart.unit+"}";
}
- if (sla.shouldEnd){
+ if (sla.shouldEnd && sla.shouldEnd.time){
slaInfo[slaPrefix+":"+"should-end"]="${"+sla.shouldEnd.time+ "*"+sla.shouldEnd.unit+"}";
}
- if (sla.maxDuration){
+ if (sla.maxDuration && sla.maxDuration.time){
slaInfo[slaPrefix+":"+"max-duration"]="${"+sla.maxDuration.time+ "*"+sla.maxDuration.unit+"}";
}
if (sla.alertEvents){
http://git-wip-us.apache.org/repos/asf/ambari/blob/8b43080a/contrib/views/wfmanager/src/main/resources/ui/app/domain/workflow-json-importer.js
----------------------------------------------------------------------
diff --git a/contrib/views/wfmanager/src/main/resources/ui/app/domain/workflow-json-importer.js b/contrib/views/wfmanager/src/main/resources/ui/app/domain/workflow-json-importer.js
index 527badf..656df4b 100644
--- a/contrib/views/wfmanager/src/main/resources/ui/app/domain/workflow-json-importer.js
+++ b/contrib/views/wfmanager/src/main/resources/ui/app/domain/workflow-json-importer.js
@@ -61,6 +61,9 @@ var WorkflowJsonImporter= Ember.Object.extend({
node.set("domain",nodeJson.domain);
node.set("errorMsgs",nodeJson.errorMsgs);
node.set("errors",nodeJson.errors);
+ if(nodeJson.customMapping){
+ node.set('customMapping', nodeJson.customMapping);
+ }
nodeMap.set(node.id,node);
if (nodeJson.transitions){
nodeJson.transitions.forEach(function(nodeTran){
http://git-wip-us.apache.org/repos/asf/ambari/blob/8b43080a/contrib/views/wfmanager/src/main/resources/ui/app/domain/workflow-xml-generator.js
----------------------------------------------------------------------
diff --git a/contrib/views/wfmanager/src/main/resources/ui/app/domain/workflow-xml-generator.js b/contrib/views/wfmanager/src/main/resources/ui/app/domain/workflow-xml-generator.js
index b9e4307..e30750f 100644
--- a/contrib/views/wfmanager/src/main/resources/ui/app/domain/workflow-xml-generator.js
+++ b/contrib/views/wfmanager/src/main/resources/ui/app/domain/workflow-xml-generator.js
@@ -18,6 +18,8 @@
import Ember from 'ember';
import {WorkflowXmlMapper} from '../domain/workflow_xml_mapper';
import {NodeVisitor} from '../domain/node-visitor';
+import CustomMappingHandler from "../domain/custom-mapping-handler";
+
var WorkflowGenerator= Ember.Object.extend({
workflowMapper:null,
x2js : new X2JS({useDoubleQuotes:true}),
@@ -120,6 +122,9 @@ var WorkflowGenerator= Ember.Object.extend({
if (!self.ignoreErrors && !node.get("domain")){
this.workflowContext.addError({node : node, message : "Action Properties are empty"});
}else{
+ if(node.customMapping){
+ CustomMappingHandler.setMapping(node.name, node.customMapping);
+ }
jobHandler.handle(node.get("domain"),nodeObj,node.get("name"));
if (!self.ignoreErrors){
var errors=jobHandler.validate(node.get("domain"));
http://git-wip-us.apache.org/repos/asf/ambari/blob/8b43080a/contrib/views/wfmanager/src/main/resources/ui/app/styles/app.less
----------------------------------------------------------------------
diff --git a/contrib/views/wfmanager/src/main/resources/ui/app/styles/app.less b/contrib/views/wfmanager/src/main/resources/ui/app/styles/app.less
index dcf2905..bc0e419 100644
--- a/contrib/views/wfmanager/src/main/resources/ui/app/styles/app.less
+++ b/contrib/views/wfmanager/src/main/resources/ui/app/styles/app.less
@@ -1615,3 +1615,15 @@ input:invalid {
.visibility-hidden {
visibility: hidden;
}
+
+.unsupported-elt-warning span{
+ padding: 2px;
+}
+.unsupported-elt-warning .fa-exclamation-triangle{
+ padding-right: 5px;
+ color: #f0ad4e;
+}
+.unsupported-xml{
+ width: 100%;
+ min-height: 100px;
+}
http://git-wip-us.apache.org/repos/asf/ambari/blob/8b43080a/contrib/views/wfmanager/src/main/resources/ui/app/templates/components/workflow-action-editor.hbs
----------------------------------------------------------------------
diff --git a/contrib/views/wfmanager/src/main/resources/ui/app/templates/components/workflow-action-editor.hbs b/contrib/views/wfmanager/src/main/resources/ui/app/templates/components/workflow-action-editor.hbs
index 069c052..b36578d 100644
--- a/contrib/views/wfmanager/src/main/resources/ui/app/templates/components/workflow-action-editor.hbs
+++ b/contrib/views/wfmanager/src/main/resources/ui/app/templates/components/workflow-action-editor.hbs
@@ -35,6 +35,9 @@
{{#decision-config actionModel=actionModel register="registerChild"}}{{/decision-config}}
{{/if}}
{{#if (eq nodeType 'action')}}
+ {{#if containsUnsupportedProperties}}
+ <span class="unsupported-elt-warning"> <p><a href='#unsupported-props'><i class="fa fa-exclamation-triangle" aria-hidden="true"></i>Action contains elements that are not currently supported by the designer.</a></p></span>
+ {{/if}}
{{#if (eq actionType 'java')}}
{{#java-action actionModel=actionModel transition=transition killNodes=killNodes openFileBrowser="openFileBrowser" register="registerChild" addKillNode="addKillNode" currentNode=currentNode credentials=credentials}}{{/java-action}}
{{else if (eq actionType 'hive')}}
@@ -62,6 +65,14 @@
{{else if (eq actionType 'sub-workflow')}}
{{#sub-workflow actionModel=actionModel transition=transition killNodes=killNodes openFileBrowser="openFileBrowser" register="registerChild" addKillNode="addKillNode" currentNode=currentNode credentials=credentials}}{{/sub-workflow}}
{{/if}}
+ {{#if containsUnsupportedProperties}}
+ <div id="unsupported-props" class=" panel panel-default">
+ <div class="panel-heading">Unsupported Properties</div>
+ <div class="panel-body handlerPanel">
+ {{textarea class="unsupported-xml" value=unsupportedPropertiesXml}}
+ </div>
+ </div>
+ {{/if}}
{{/if}}
{{#if (eq nodeType 'kill')}}
<div class="form-group">