AMBARI-20251. Tez UI throwing 404 error, Button to minimise TEZ UI, Worksheet save issues, creation of duplicate tabs and other tab issues (Venkata Sairam via pallavkul)
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/760be48e Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/760be48e Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/760be48e Branch: refs/heads/branch-feature-AMBARI-12556 Commit: 760be48e9bd21e215f3e0a3a004ae9bd5a383124 Parents: 266d81c Author: pallavkul <[email protected]> Authored: Wed Mar 1 21:26:29 2017 +0530 Committer: pallavkul <[email protected]> Committed: Wed Mar 1 21:26:29 2017 +0530 ---------------------------------------------------------------------- .../resources/ui/app/routes/queries/index.js | 2 +- .../resources/ui/app/routes/queries/query.js | 35 +++++++++++++------- .../app/routes/queries/query/visual-explain.js | 8 +++-- .../resources/ui/app/routes/savedqueries.js | 12 +++++-- .../resources/ui/app/services/tez-view-info.js | 26 ++++++++++----- .../main/resources/ui/app/templates/queries.hbs | 4 +-- .../ui/app/templates/queries/query/tez-ui.hbs | 7 ++++ 7 files changed, 64 insertions(+), 30 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/760be48e/contrib/views/hive20/src/main/resources/ui/app/routes/queries/index.js ---------------------------------------------------------------------- diff --git a/contrib/views/hive20/src/main/resources/ui/app/routes/queries/index.js b/contrib/views/hive20/src/main/resources/ui/app/routes/queries/index.js index f2af6bc..6994ffc 100644 --- a/contrib/views/hive20/src/main/resources/ui/app/routes/queries/index.js +++ b/contrib/views/hive20/src/main/resources/ui/app/routes/queries/index.js @@ -24,7 +24,7 @@ export default Ember.Route.extend({ if(existingWorksheets.get('length') > 0) { let selectedWorksheet = existingWorksheets.filterBy('selected', true).get('firstObject'); this.controllerFor('queries').set('worksheets', existingWorksheets); - this.transitionTo('queries.query', selectedWorksheet.get('title')); + this.transitionTo('queries.query', selectedWorksheet.get('id')); } else { this.transitionTo('queries.new'); } http://git-wip-us.apache.org/repos/asf/ambari/blob/760be48e/contrib/views/hive20/src/main/resources/ui/app/routes/queries/query.js ---------------------------------------------------------------------- diff --git a/contrib/views/hive20/src/main/resources/ui/app/routes/queries/query.js b/contrib/views/hive20/src/main/resources/ui/app/routes/queries/query.js index 62e5562..cf51ff7 100644 --- a/contrib/views/hive20/src/main/resources/ui/app/routes/queries/query.js +++ b/contrib/views/hive20/src/main/resources/ui/app/routes/queries/query.js @@ -66,7 +66,7 @@ export default Ember.Route.extend(UILoggerMixin, { }, model(params) { - let selectedWs = this.store.peekAll('worksheet').filterBy('title', params.worksheetId).get('firstObject'); + let selectedWs = this.store.peekAll('worksheet').filterBy('id', params.worksheetId.toLowerCase()).get('firstObject'); if(selectedWs) { selectedWs.set('selected', true); @@ -300,6 +300,7 @@ export default Ember.Route.extend(UILoggerMixin, { this.send('showQueryResultContainer'); let payload ={ + "id":this.get('controller.model').get('id'), "title":worksheetTitle, "dataBase":dbid, "forcedContent":forcedContent, @@ -321,9 +322,8 @@ export default Ember.Route.extend(UILoggerMixin, { self.get('controller').set('isJobCreated', false); let jobDetails = self.store.peekRecord('job', data.job.id); console.log(jobDetails); - self.send('getJobResult', data, payload.title, jobDetails); + self.send('getJobResult', data, payload.id, jobDetails); self.get('logger').success('Query has been submitted.'); - self.transitionTo('queries.query.loading'); }, (error) => { console.log('error', error); @@ -363,10 +363,15 @@ export default Ember.Route.extend(UILoggerMixin, { let existingWorksheets = self.get('store').peekAll('worksheet'); let myWs = null; if(existingWorksheets.get('length') > 0) { - myWs = existingWorksheets.filterBy('title', payloadTitle).get('firstObject'); + myWs = existingWorksheets.filterBy('id', payloadTitle).get('firstObject'); } if(!Ember.isBlank(jobDetails.get("dagId"))) { - self.get('controller.model').set('tezUrl', self.get("tezViewInfo").getTezViewURL() + jobDetails.get("dagId")); + let tezData = self.get("tezViewInfo").getTezViewData(); + if(tezData && tezData.error) { + self.get('controller.model').set('tezError', tezData.errorMsg); + } else if(tezData.tezUrl) { + self.get('controller.model').set('tezUrl', tezData.tezUrl + jobDetails.get("dagId")); + } } myWs.set('queryResult', data); myWs.set('isQueryRunning', false); @@ -385,8 +390,14 @@ export default Ember.Route.extend(UILoggerMixin, { self.get('controller.model').set('visualExplainJson', null); } - if( self.paramsFor('queries.query').worksheetId == payloadTitle){ - self.transitionTo('queries.query.results'); + if( self.paramsFor('queries.query').worksheetId && (self.paramsFor('queries.query').worksheetId.toLowerCase() == payloadTitle)){ + self.transitionTo('queries.query.loading'); + + Ember.run.later(() => { + self.transitionTo('queries.query.results'); + }, 1 * 100); + + } }, function(error) { @@ -396,7 +407,7 @@ export default Ember.Route.extend(UILoggerMixin, { }, showVisualExplain(payloadTitle){ - if( this.paramsFor('queries.query').worksheetId == payloadTitle){ + if( this.paramsFor('queries.query').worksheetId && this.paramsFor('queries.query').worksheetId.toLowerCase() === payloadTitle){ Ember.run.later(() => { this.transitionTo('queries.query.visual-explain'); }, 1); @@ -444,14 +455,14 @@ export default Ember.Route.extend(UILoggerMixin, { let existingWorksheets = this.get('store').peekAll('worksheet'); let myWs = null; if(existingWorksheets.get('length') > 0) { - myWs = existingWorksheets.filterBy('title', payloadTitle).get('firstObject'); + myWs = existingWorksheets.filterBy('id', payloadTitle.toLowerCase()).get('firstObject'); } this.transitionTo('queries.query.loading'); Ember.run.later(() => { this.transitionTo('queries.query.results', myWs); - }, 1 * 1000); + }, 1 * 100); }, goPrevPage(payloadTitle){ @@ -473,14 +484,14 @@ export default Ember.Route.extend(UILoggerMixin, { let existingWorksheets = this.get('store').peekAll('worksheet'); let myWs = null; if(existingWorksheets.get('length') > 0) { - myWs = existingWorksheets.filterBy('title', payloadTitle).get('firstObject'); + myWs = existingWorksheets.filterBy('id', payloadTitle.toLowerCase()).get('firstObject'); } this.transitionTo('queries.query.loading'); Ember.run.later(() => { this.transitionTo('queries.query.results', myWs); - }, 1 * 1000); + }, 1 * 100); }, openWorksheetModal(){ http://git-wip-us.apache.org/repos/asf/ambari/blob/760be48e/contrib/views/hive20/src/main/resources/ui/app/routes/queries/query/visual-explain.js ---------------------------------------------------------------------- diff --git a/contrib/views/hive20/src/main/resources/ui/app/routes/queries/query/visual-explain.js b/contrib/views/hive20/src/main/resources/ui/app/routes/queries/query/visual-explain.js index c85db19..b7a1ccc 100644 --- a/contrib/views/hive20/src/main/resources/ui/app/routes/queries/query/visual-explain.js +++ b/contrib/views/hive20/src/main/resources/ui/app/routes/queries/query/visual-explain.js @@ -39,9 +39,11 @@ export default Ember.Route.extend({ this.controller.set('jobId', jobId); this.controller.set('payloadTitle', model.get('currentJobData').job.title); this.controller.set('isQueryRunning', model.get('isQueryRunning')); - if(!Ember.isEmpty(JSON.parse(model.get('queryResult').rows[0][0])['STAGE PLANS'])){ - this.controller.set('visualExplainJson', model.get('queryResult').rows[0][0]); - } + try { + if(!Ember.isEmpty(JSON.parse(model.get('queryResult').rows[0][0])['STAGE PLANS'])){ + this.controller.set('visualExplainJson', model.get('queryResult').rows[0][0]); + } + }catch(error) { } this.controller.set('hasJobAssociated', true); } else { this.controller.set('hasJobAssociated', false); http://git-wip-us.apache.org/repos/asf/ambari/blob/760be48e/contrib/views/hive20/src/main/resources/ui/app/routes/savedqueries.js ---------------------------------------------------------------------- diff --git a/contrib/views/hive20/src/main/resources/ui/app/routes/savedqueries.js b/contrib/views/hive20/src/main/resources/ui/app/routes/savedqueries.js index 5369f8e..f3b27c8 100644 --- a/contrib/views/hive20/src/main/resources/ui/app/routes/savedqueries.js +++ b/contrib/views/hive20/src/main/resources/ui/app/routes/savedqueries.js @@ -19,7 +19,7 @@ import Ember from 'ember'; import UILoggerMixin from '../mixins/ui-logger'; -export default Ember.Route.extend({ +export default Ember.Route.extend(UILoggerMixin, { savedQueries: Ember.inject.service(), @@ -104,9 +104,14 @@ export default Ember.Route.extend({ }); worksheetId = `worksheet${worksheets.get('length') + 1}`; } + var isTabExisting = this.store.peekRecord('worksheet', savedQuery.id); + if(isTabExisting) { + self.transitionTo('queries.query', isTabExisting.get("id")); + return; + } this.get("savedQueries").fetchSavedQuery(savedQuery.get('queryFile')).then(function(response) { let localWs = { - id: worksheetId, + id: savedQuery.get('id'), title: savedQuery.get('title'), queryFile: savedQuery.get('queryFile'), query: response.file.fileContent, @@ -116,8 +121,9 @@ export default Ember.Route.extend({ }; self.store.createRecord('worksheet', localWs ); + self.controllerFor('queries').set('worksheets', self.store.peekAll('worksheet')); - self.transitionTo('queries.query', localWs.title); + self.transitionTo('queries.query', savedQuery.get('id')); }, (error) => { self.get('logger').danger('Failed to load the query', self.extractError(error)); }); http://git-wip-us.apache.org/repos/asf/ambari/blob/760be48e/contrib/views/hive20/src/main/resources/ui/app/services/tez-view-info.js ---------------------------------------------------------------------- diff --git a/contrib/views/hive20/src/main/resources/ui/app/services/tez-view-info.js b/contrib/views/hive20/src/main/resources/ui/app/services/tez-view-info.js index 943d002..02cc5af 100644 --- a/contrib/views/hive20/src/main/resources/ui/app/services/tez-view-info.js +++ b/contrib/views/hive20/src/main/resources/ui/app/services/tez-view-info.js @@ -24,6 +24,7 @@ export default Ember.Service.extend({ tezURLPrefix: '/views/TEZ', tezDagPath: '?viewPath=/#/dag/', getTezViewInfo: function () { + this.set('error', null); if (this.get('isTezViewAvailable')) { return; } @@ -68,16 +69,23 @@ export default Ember.Service.extend({ // status: 404 => Tev View isn't deployed if (data.status && data.status === 404) { this.set('error', 'tez.errors.not.deployed'); - return; - } - - // no instance created - if (data.instances && !data.instances.length) { + this.set('errorMsg', 'Tez view not deployed'); + } else if (data.instances && !data.instances.length) { // no instance created this.set('error', 'tez.errors.no.instance'); - return; + this.set('errorMsg', 'Tez view instance not created'); + } else { + this.set('error', 'error'); + this.set('errorMsg', 'Error occurred while dispaying TEZ UI'); } }, - getTezViewURL(){ - return this.get('tezViewURL') + this.get("tezDagPath"); + getTezViewData(){ + let tezData = {}; + if(this.get('error')){ + tezData.error = this.get('error'); + tezData.errorMsg = this.get('errorMsg'); + } else { + tezData.tezUrl = this.get('tezViewURL') + this.get("tezDagPath"); + } + return tezData; } -}); \ No newline at end of file +}); http://git-wip-us.apache.org/repos/asf/ambari/blob/760be48e/contrib/views/hive20/src/main/resources/ui/app/templates/queries.hbs ---------------------------------------------------------------------- diff --git a/contrib/views/hive20/src/main/resources/ui/app/templates/queries.hbs b/contrib/views/hive20/src/main/resources/ui/app/templates/queries.hbs index 6fc7486..b8e19da 100644 --- a/contrib/views/hive20/src/main/resources/ui/app/templates/queries.hbs +++ b/contrib/views/hive20/src/main/resources/ui/app/templates/queries.hbs @@ -20,7 +20,7 @@ <ul class="worksheet-nav row nav nav-tabs inverse"> {{#each worksheets as |worksheet| }} <li class="{{if worksheet.selected 'active'}}" style=""> - {{#link-to 'queries.query' worksheet.title }}{{ worksheet.title }}{{/link-to}} + {{#link-to 'queries.query' worksheet.id classBinding='worksheet.selected:active'}}{{ worksheet.title }}{{/link-to}} </li> {{/each}} <li> @@ -29,4 +29,4 @@ </ul> </div> -{{outlet}} \ No newline at end of file +{{outlet}} http://git-wip-us.apache.org/repos/asf/ambari/blob/760be48e/contrib/views/hive20/src/main/resources/ui/app/templates/queries/query/tez-ui.hbs ---------------------------------------------------------------------- diff --git a/contrib/views/hive20/src/main/resources/ui/app/templates/queries/query/tez-ui.hbs b/contrib/views/hive20/src/main/resources/ui/app/templates/queries/query/tez-ui.hbs index edc1e8e..f9ecf5e 100644 --- a/contrib/views/hive20/src/main/resources/ui/app/templates/queries/query/tez-ui.hbs +++ b/contrib/views/hive20/src/main/resources/ui/app/templates/queries/query/tez-ui.hbs @@ -17,7 +17,14 @@ }} {{#if model.tezUrl}} +<div class="pull-right"> + <button class="btn btn-default" title="Expand/Collspse" {{action "expandQueryResultPanel" }}>{{fa-icon "expand"}}</button> +</div> <iframe class="tez-ui" src={{model.tezUrl}}></iframe> +{{else if model.tezError}} +<div class="explain--error"> + <div>{{model.tezError}}</div> +</div> {{else}} <div class="explain--error"> <div>Tez UI not available.</div>
