Repository: ambari Updated Branches: refs/heads/trunk 2f123f0ae -> e90009310
AMBARI-19254 : Prompting for underlying workflow job properties in a coordinator and coordinator job properties in bundle during job submission (Padma Priya via nitirajrathore) Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/e9000931 Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/e9000931 Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/e9000931 Branch: refs/heads/trunk Commit: e900093107475b765ac2d02edf1c28e61d6250bd Parents: 2f123f0 Author: Nitiraj Rathore <nitiraj.rath...@gmail.com> Authored: Fri Dec 23 14:31:19 2016 +0530 Committer: Nitiraj Rathore <nitiraj.rath...@gmail.com> Committed: Fri Dec 23 14:31:19 2016 +0530 ---------------------------------------------------------------------- .../ui/app/components/bundle-config.js | 51 +++++++++++++++++--- .../resources/ui/app/components/coord-config.js | 40 ++++++++++----- .../ui/app/components/flow-designer.js | 2 +- .../ui/app/services/property-extractor.js | 3 +- .../src/main/resources/ui/app/styles/app.less | 2 +- .../app/templates/components/bundle-config.hbs | 3 ++ .../app/templates/components/coord-config.hbs | 3 ++ .../main/resources/ui/app/utils/constants.js | 3 ++ 8 files changed, 86 insertions(+), 21 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/e9000931/contrib/views/wfmanager/src/main/resources/ui/app/components/bundle-config.js ---------------------------------------------------------------------- diff --git a/contrib/views/wfmanager/src/main/resources/ui/app/components/bundle-config.js b/contrib/views/wfmanager/src/main/resources/ui/app/components/bundle-config.js index 4a8ac90..4ef0ac3 100644 --- a/contrib/views/wfmanager/src/main/resources/ui/app/components/bundle-config.js +++ b/contrib/views/wfmanager/src/main/resources/ui/app/components/bundle-config.js @@ -132,7 +132,7 @@ export default Ember.Component.extend(Ember.Evented, Validations, { importBundle (filePath){ this.set("bundleFilePath", filePath); this.set("isImporting", false); - var deferred = this.getBundleFromHdfs(filePath); + var deferred = this.getFromHdfs(filePath); deferred.promise.then(function(data){ this.getBundleFromXml(data); this.set("isImporting", false); @@ -141,7 +141,7 @@ export default Ember.Component.extend(Ember.Evented, Validations, { this.set("isImportingSuccess", false); }.bind(this)); }, - getBundleFromHdfs(filePath){ + getFromHdfs(filePath){ var url = Ember.ENV.API_URL + "/readWorkflowXml?workflowXmlPath="+filePath; var deferred = Ember.RSVP.defer(); Ember.$.ajax({ @@ -154,7 +154,8 @@ export default Ember.Component.extend(Ember.Evented, Validations, { } }).done(function(data){ deferred.resolve(data); - }).fail(function(){ + }).fail(function(e){ + console.error(e); deferred.reject(); }); return deferred; @@ -166,6 +167,22 @@ export default Ember.Component.extend(Ember.Evented, Validations, { this.get("errors").clear(); this.get("errors").pushObjects(bundleObj.errors); }, + getJobProperties(coordinatorPath){ + var deferred = Ember.RSVP.defer(); + this.getFromHdfs(coordinatorPath).promise.then((coordinatorXml)=>{ + var x2js = new X2JS(); + var coordProps = this.get('propertyExtractor').getDynamicProperties(coordinatorXml); + var coordinatorJson = x2js.xml_str2json(coordinatorXml); + var workflowPath = coordinatorJson['coordinator-app']['action']['workflow']['app-path']; + this.getFromHdfs(workflowPath).promise.then((workflowXml)=>{ + var workflowProps = this.get('propertyExtractor').getDynamicProperties(workflowXml); + deferred.resolve(Array.from(coordProps.values()).concat(Array.from(workflowProps.values()))); + }); + }.bind(this)).catch((e)=>{ + deferred.reject({trace :e, path: coordinatorPath}); + }); + return deferred; + }, actions : { closeFileBrowser(){ this.set("showingFileBrowser", false); @@ -238,10 +255,30 @@ export default Ember.Component.extend(Ember.Evented, Validations, { } var bundleGenerator = BundleGenerator.create({bundle:this.get("bundle")}); var bundleXml = bundleGenerator.process(); - var dynamicProperties = this.get('propertyExtractor').getDynamicProperties(bundleXml); - var configForSubmit = {props : dynamicProperties, xml : bundleXml, params : this.get('bundle.parameters')}; - this.set("bundleConfigs", configForSubmit); - this.set("showingJobConfig", true); + var propertyPromises = []; + this.$('#loading').show(); + this.get('bundle.coordinators').forEach((coordinator) =>{ + var deferred = this.getJobProperties(coordinator.appPath); + propertyPromises.push(deferred.promise); + }, this); + Ember.RSVP.Promise.all(propertyPromises).then(function(props){ + var combinedProps = []; + props.forEach((prop)=>{ + combinedProps = combinedProps.concat(prop); + }); + var dynamicProperties = this.get('propertyExtractor').getDynamicProperties(bundleXml); + combinedProps.forEach((prop)=>{ + dynamicProperties.set(prop, prop); + }); + this.$('#loading').hide(); + var configForSubmit = {props : dynamicProperties, xml : bundleXml, params : this.get('bundle.parameters')}; + this.set("bundleConfigs", configForSubmit); + this.set("showingJobConfig", true); + }.bind(this)).catch(function(e){ + this.$('#loading').hide(); + this.get("errors").pushObject({'message' : 'Could not process coordinator from ' + e.path}); + throw new Error(e.trace); + }.bind(this)); }, preview(){ if(this.get('validations.isInvalid')) { http://git-wip-us.apache.org/repos/asf/ambari/blob/e9000931/contrib/views/wfmanager/src/main/resources/ui/app/components/coord-config.js ---------------------------------------------------------------------- diff --git a/contrib/views/wfmanager/src/main/resources/ui/app/components/coord-config.js b/contrib/views/wfmanager/src/main/resources/ui/app/components/coord-config.js index 15eb1ce..1d7f435 100644 --- a/contrib/views/wfmanager/src/main/resources/ui/app/components/coord-config.js +++ b/contrib/views/wfmanager/src/main/resources/ui/app/components/coord-config.js @@ -251,9 +251,10 @@ export default Ember.Component.extend(Validations, Ember.Evented, { deferred.promise.then(function(data){ this.getCoordinatorFromXml(data); this.set("isImporting", false); - }.bind(this)).catch(function(){ + }.bind(this)).catch(function(e){ this.set("isImporting", false); this.set("isImportingSuccess", false); + throw new Error(e); }.bind(this)); }, readFromHdfs(filePath){ @@ -269,8 +270,8 @@ export default Ember.Component.extend(Validations, Ember.Evented, { } }).done(function(data){ deferred.resolve(data); - }).fail(function(){ - deferred.reject(); + }).fail(function(e){ + deferred.reject(e); }); return deferred; }, @@ -396,12 +397,29 @@ export default Ember.Component.extend(Validations, Ember.Evented, { this.set('showErrorMessage', true); return; } - var coordGenerator=CoordinatorGenerator.create({coordinator:this.get("coordinator")}); - var coordinatorXml=coordGenerator.process(); - var dynamicProperties = this.get('propertyExtractor').getDynamicProperties(coordinatorXml); - var configForSubmit={props:dynamicProperties,xml:coordinatorXml,params:this.get('coordinator.parameters')}; - this.set("coordinatorConfigs", configForSubmit); - this.set("showingJobConfig", true); + this.$('#loading').show(); + var deferred = this.readFromHdfs(this.get('coordinator.workflow.appPath')); + deferred.promise.then(function(data){ + var x2js = new X2JS(); + var workflowJson = x2js.xml_str2json(data); + this.set('workflowName', workflowJson["workflow-app"]._name); + var workflowProps = this.get('propertyExtractor').getDynamicProperties(data); + var coordGenerator = CoordinatorGenerator.create({coordinator:this.get("coordinator")}); + var coordinatorXml = coordGenerator.process(); + var dynamicProperties = this.get('propertyExtractor').getDynamicProperties(coordinatorXml); + workflowProps.forEach((prop)=>{ + dynamicProperties.set(prop, prop); + }); + this.$('#loading').hide(); + var configForSubmit={props:dynamicProperties,xml:coordinatorXml,params:this.get('coordinator.parameters')}; + this.set("coordinatorConfigs", configForSubmit); + this.set("showingJobConfig", true); + }.bind(this)).catch(function(e){ + this.set('workflowProps',[]); + this.$('#loading').hide(); + this.get("errors").pushObject({'message' : 'Could not process workflow from ' + this.get('coordinator.workflow.appPath')}); + throw new Error(e); + }.bind(this)); }, closeCoordSubmitConfig(){ this.set("showingJobConfig", false); @@ -473,7 +491,6 @@ export default Ember.Component.extend(Validations, Ember.Evented, { if(data.coordinator.get('dataInputType') === 'logical'){ this.set('conditionalDataInExists', true); } - console.error(this.get('coordinator')); }.bind(this)).catch(function(e){ throw new Error(e); }); @@ -527,8 +544,9 @@ export default Ember.Component.extend(Validations, Ember.Evented, { var x2js = new X2JS(); var workflowJson = x2js.xml_str2json(data); this.set('workflowName', workflowJson["workflow-app"]._name); - }.bind(this)).catch(function(){ + }.bind(this)).catch(function(e){ this.set('workflowName', null); + throw new Error(e); }.bind(this)); }, showVersionSettings(value){ http://git-wip-us.apache.org/repos/asf/ambari/blob/e9000931/contrib/views/wfmanager/src/main/resources/ui/app/components/flow-designer.js ---------------------------------------------------------------------- diff --git a/contrib/views/wfmanager/src/main/resources/ui/app/components/flow-designer.js b/contrib/views/wfmanager/src/main/resources/ui/app/components/flow-designer.js index 28239fa..50c7592 100644 --- a/contrib/views/wfmanager/src/main/resources/ui/app/components/flow-designer.js +++ b/contrib/views/wfmanager/src/main/resources/ui/app/components/flow-designer.js @@ -203,7 +203,7 @@ export default Ember.Component.extend(FindNodeMixin, Validations, { workflowXmlDownload(workflowXml){ var link = document.createElement("a"); link.download = "workflow.xml"; - link.href = "data:text/xml,"+vkbeautify.xml(workflowXml); + link.href = "data:text/xml,"+workflowXml; link.click(); }, nodeRendered: function(){ http://git-wip-us.apache.org/repos/asf/ambari/blob/e9000931/contrib/views/wfmanager/src/main/resources/ui/app/services/property-extractor.js ---------------------------------------------------------------------- diff --git a/contrib/views/wfmanager/src/main/resources/ui/app/services/property-extractor.js b/contrib/views/wfmanager/src/main/resources/ui/app/services/property-extractor.js index 17ff9aa..0ebd9a7 100644 --- a/contrib/views/wfmanager/src/main/resources/ui/app/services/property-extractor.js +++ b/contrib/views/wfmanager/src/main/resources/ui/app/services/property-extractor.js @@ -16,6 +16,7 @@ */ import Ember from 'ember'; +import Constants from '../utils/constants'; export default Ember.Service.extend({ simpleProperty : /^[A-Za-z_][0-9A-Za-z_]+$/, @@ -31,7 +32,7 @@ export default Ember.Service.extend({ return dynamicProperties; } matches.forEach((match)=>{ - if(this.get('dynamicProperty').test(match)){ + if(this.get('dynamicProperty').test(match) && Constants.elConstants.indexOf(match) < 0){ dynamicProperties.push(match); } }.bind(this)); http://git-wip-us.apache.org/repos/asf/ambari/blob/e9000931/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 036f529..6296a64 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 @@ -875,7 +875,7 @@ input:invalid { width: 50vw; height: 40vh; overflow: hidden; - z-index: 1; + z-index: 999; } .loader img { http://git-wip-us.apache.org/repos/asf/ambari/blob/e9000931/contrib/views/wfmanager/src/main/resources/ui/app/templates/components/bundle-config.hbs ---------------------------------------------------------------------- diff --git a/contrib/views/wfmanager/src/main/resources/ui/app/templates/components/bundle-config.hbs b/contrib/views/wfmanager/src/main/resources/ui/app/templates/components/bundle-config.hbs index 8293dbe..93a0541 100644 --- a/contrib/views/wfmanager/src/main/resources/ui/app/templates/components/bundle-config.hbs +++ b/contrib/views/wfmanager/src/main/resources/ui/app/templates/components/bundle-config.hbs @@ -64,6 +64,9 @@ </div> </nav> <div class="container-fluid"> + <div id='loading'> + {{spin-spinner lines=13 length=20 width=10}} + </div> {{designer-errors errors=errors}} <form class="form-horizontal"> <div class="col-sm-12 paddingtop10"> http://git-wip-us.apache.org/repos/asf/ambari/blob/e9000931/contrib/views/wfmanager/src/main/resources/ui/app/templates/components/coord-config.hbs ---------------------------------------------------------------------- diff --git a/contrib/views/wfmanager/src/main/resources/ui/app/templates/components/coord-config.hbs b/contrib/views/wfmanager/src/main/resources/ui/app/templates/components/coord-config.hbs index 6b0ea84..fff8c8c 100644 --- a/contrib/views/wfmanager/src/main/resources/ui/app/templates/components/coord-config.hbs +++ b/contrib/views/wfmanager/src/main/resources/ui/app/templates/components/coord-config.hbs @@ -69,6 +69,9 @@ </div> </div> </nav> +<div id='loading'> + {{spin-spinner lines=13 length=20 width=10}} +</div> <div class="container-fluid"> {{designer-errors errors=errors}} <form class="form-horizontal"> http://git-wip-us.apache.org/repos/asf/ambari/blob/e9000931/contrib/views/wfmanager/src/main/resources/ui/app/utils/constants.js ---------------------------------------------------------------------- diff --git a/contrib/views/wfmanager/src/main/resources/ui/app/utils/constants.js b/contrib/views/wfmanager/src/main/resources/ui/app/utils/constants.js index 6e281d3..a508905 100644 --- a/contrib/views/wfmanager/src/main/resources/ui/app/utils/constants.js +++ b/contrib/views/wfmanager/src/main/resources/ui/app/utils/constants.js @@ -85,4 +85,7 @@ export default Ember.Object.create({ {displayName:'(GMT +12:00) Auckland, Wellington, Fiji, Kamchatka',gmtOffset:-12, value:'GMT+12:00'} ]), persistWorkInProgressInterval : 30000, + elConstants : [ + '${YEAR}', '${MONTH}', '${DAY}', '${HOUR}', '${MINUTE}' + ] });