AMBARI-20442. Knox proxy - Navigating to Hive view from Hive Summary page is not working (Go to view link) (alexantonenko)
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/1fc41441 Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/1fc41441 Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/1fc41441 Branch: refs/heads/branch-feature-AMBARI-12556 Commit: 1fc41441f16a40950af9cc0530bb416ac6519ab7 Parents: ece203b Author: Alex Antonenko <hiv...@gmail.com> Authored: Tue Mar 14 14:43:58 2017 +0200 Committer: Alex Antonenko <hiv...@gmail.com> Committed: Tue Mar 14 17:36:48 2017 +0200 ---------------------------------------------------------------------- ambari-web/app/assets/test/tests.js | 1 + .../controllers/main/service/info/summary.js | 2 +- .../app/controllers/main/views_controller.js | 32 ++++---- ambari-web/app/models.js | 1 + ambari-web/app/models/view_instance.js | 81 ++++++++++++++++++++ .../templates/main/service/services/hive.hbs | 2 +- .../app/views/main/service/services/hive.js | 14 ++-- .../controllers/main/views_controller_test.js | 38 ++++++--- ambari-web/test/models/view_instance_test.js | 59 ++++++++++++++ 9 files changed, 193 insertions(+), 37 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/1fc41441/ambari-web/app/assets/test/tests.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/assets/test/tests.js b/ambari-web/app/assets/test/tests.js index ab007f0..8fadb44 100644 --- a/ambari-web/app/assets/test/tests.js +++ b/ambari-web/app/assets/test/tests.js @@ -418,6 +418,7 @@ var files = [ 'test/models/stack_test', 'test/models/stack_service_test', 'test/models/user_test', + 'test/models/view_instance_test', 'test/models/widget_test', 'test/models/widget_property_test', 'test/models/host_stack_version_test', http://git-wip-us.apache.org/repos/asf/ambari/blob/1fc41441/ambari-web/app/controllers/main/service/info/summary.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/controllers/main/service/info/summary.js b/ambari-web/app/controllers/main/service/info/summary.js index 15f3861..1554c61 100644 --- a/ambari-web/app/controllers/main/service/info/summary.js +++ b/ambari-web/app/controllers/main/service/info/summary.js @@ -856,7 +856,7 @@ App.MainServiceInfoSummaryController = Em.Controller.extend(App.WidgetSectionMix }, goToView: function(event) { - App.router.route('main' + event.context.href); + App.router.route(event.context.get('internalAmbariUrl')); } }); \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ambari/blob/1fc41441/ambari-web/app/controllers/main/views_controller.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/controllers/main/views_controller.js b/ambari-web/app/controllers/main/views_controller.js index eb5775d..398cdd8 100644 --- a/ambari-web/app/controllers/main/views_controller.js +++ b/ambari-web/app/controllers/main/views_controller.js @@ -80,19 +80,20 @@ App.MainViewsController = Em.Controller.extend({ data.items.forEach(function (view) { view.versions.forEach(function (version) { version.instances.forEach(function (instance) { - var current_instance = Em.Object.create({ - iconPath: instance.ViewInstanceInfo.icon_path || "/img/ambari-view-default.png", - label: instance.ViewInstanceInfo.label || version.ViewVersionInfo.label || instance.ViewInstanceInfo.view_name, - visible: instance.ViewInstanceInfo.visible || false, - version: instance.ViewInstanceInfo.version, - description: instance.ViewInstanceInfo.description || Em.I18n.t('views.main.instance.noDescription'), - viewName: instance.ViewInstanceInfo.view_name, - shortUrl:instance.ViewInstanceInfo.short_url, - instanceName: instance.ViewInstanceInfo.instance_name, - href: instance.ViewInstanceInfo.context_path + "/" + var info = instance.ViewInstanceInfo; + var currentInstance = App.ViewInstance.create({ + iconPath: info.icon_path || '/img/ambari-view-default.png', + label: info.label || version.ViewVersionInfo.label || info.view_name, + visible: info.visible || false, + version: info.version, + description: info.description || Em.I18n.t('views.main.instance.noDescription'), + viewName: info.view_name, + shortUrl:info.short_url, + instanceName: info.instance_name, + href: info.context_path + '/' }); - if (current_instance.visible) { - instances.push(current_instance); + if (currentInstance.visible) { + instances.push(currentInstance); } }, this); }, this); @@ -108,10 +109,7 @@ App.MainViewsController = Em.Controller.extend({ setView: function (event) { if (event.context) { - if(event.context.shortUrl){ - App.router.route('main/view/' + event.context.viewName + '/' + event.context.shortUrl); - } else { - App.router.route('main/views/' + event.context.viewName + '/' + event.context.version + '/' + event.context.instanceName); - }} + App.router.route(event.context.get('internalAmbariUrl')); + } } }); \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ambari/blob/1fc41441/ambari-web/app/models.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/models.js b/ambari-web/app/models.js index e0168a2..3b86782 100644 --- a/ambari-web/app/models.js +++ b/ambari-web/app/models.js @@ -78,6 +78,7 @@ require('models/configs/theme/config_action'); require('models/configs/objects/service_config'); require('models/configs/objects/service_config_category'); require('models/configs/objects/service_config_property'); +require('models/view_instance'); require('models/widget'); require('models/widget_property'); require('models/widget_layout'); http://git-wip-us.apache.org/repos/asf/ambari/blob/1fc41441/ambari-web/app/models/view_instance.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/models/view_instance.js b/ambari-web/app/models/view_instance.js new file mode 100644 index 0000000..d438640 --- /dev/null +++ b/ambari-web/app/models/view_instance.js @@ -0,0 +1,81 @@ +/** + * 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. + */ + +var App = require('app'); + +App.ViewInstance = Em.Object.extend({ + + /** + * @type {string} + */ + iconPath: '', + + /** + * @type {string} + */ + label: '', + + /** + * @type {boolean} + */ + visible: false, + + /** + * @type {string} + */ + version: '', + + /** + * @type {string} + */ + description: '', + + /** + * @type {string} + */ + viewName: '', + + /** + * @type {string} + */ + shortUrl: '', + + /** + * @type {string} + */ + instanceName: '', + + /** + * @type {string} + */ + href: '', + + /** + * @type {string} + */ + internalAmbariUrl: function () { + var shortUrl = this.get('shortUrl'); + var viewName = this.get('viewName'); + var version = this.get('version'); + var instanceName = this.get('instanceName'); + if(shortUrl) { + return 'main/view/' + viewName + '/' + shortUrl; + } + return 'main/views/' + viewName + '/' + version + '/' + instanceName; + }.property('shortUrl', 'viewName', 'version', 'instanceName') +}); \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ambari/blob/1fc41441/ambari-web/app/templates/main/service/services/hive.hbs ---------------------------------------------------------------------- diff --git a/ambari-web/app/templates/main/service/services/hive.hbs b/ambari-web/app/templates/main/service/services/hive.hbs index 672403e..9c8b914 100644 --- a/ambari-web/app/templates/main/service/services/hive.hbs +++ b/ambari-web/app/templates/main/service/services/hive.hbs @@ -44,7 +44,7 @@ <div class="row"> <div class="col-md-6 summary-label">{{link.label}}</div> <div class="col-md-6 summary-value"> - <a href="#" target="_blank" {{action goToView link target="controller"}}>{{t app.goToView}}</a> + <a href="#" target="_blank" {{action goToView link.viewInstance target="controller"}}>{{t app.goToView}}</a> </div> </div> {{/each}} http://git-wip-us.apache.org/repos/asf/ambari/blob/1fc41441/ambari-web/app/views/main/service/services/hive.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/views/main/service/services/hive.js b/ambari-web/app/views/main/service/services/hive.js index 32e97f3..ab2ae6d 100644 --- a/ambari-web/app/views/main/service/services/hive.js +++ b/ambari-web/app/views/main/service/services/hive.js @@ -30,15 +30,15 @@ App.MainDashboardServiceHiveView = App.MainDashboardServiceView.extend({ viewLinks: function() { var viewsToShow = this.get('viewsToShow'); var links = []; - App.router.get('mainViewsController.ambariViews').forEach(function(item) { - var view = viewsToShow[item.get('instanceName')]; - if (view) { + App.router.get('mainViewsController.ambariViews').forEach(function(viewInstance) { + var viewMeta = viewsToShow[viewInstance.get('instanceName')]; + if (viewMeta) { var link = { - href: item.href, - label: item.label + viewInstance: viewInstance, + label: viewInstance.get('label') }; - if (view.overwriteLabel) { - link.label = Em.I18n.t(view.overwriteLabel); + if (viewMeta.overwriteLabel) { + link.label = Em.I18n.t(viewMeta.overwriteLabel); } links.push(link); } http://git-wip-us.apache.org/repos/asf/ambari/blob/1fc41441/ambari-web/test/controllers/main/views_controller_test.js ---------------------------------------------------------------------- diff --git a/ambari-web/test/controllers/main/views_controller_test.js b/ambari-web/test/controllers/main/views_controller_test.js index 4242750..0ab7654 100644 --- a/ambari-web/test/controllers/main/views_controller_test.js +++ b/ambari-web/test/controllers/main/views_controller_test.js @@ -103,16 +103,32 @@ describe('MainViewsController', function () { ] }; - it("should parse view instance data", function () { + var viewInstanceFields = { + iconPath: 'icon_path1', + label: 'label1', + visible: true, + version: '1.0', + description: 'desc1', + href: 'path1/' + }; + + beforeEach(function () { mainViewsController.loadViewInstancesSuccess(data); - expect(JSON.parse(JSON.stringify(mainViewsController.get('ambariViews')))).to.be.eql([{ - "iconPath": "icon_path1", - "label": "label1", - "visible": true, - "version": "1.0", - "description": "desc1", - "href": "path1/" - }]); + }); + + it('one view instance is parsed', function () { + expect(mainViewsController.get('ambariViews.length')).to.be.equal(1); + }); + + + Object.keys(viewInstanceFields).forEach(function (fieldName) { + it(JSON.stringify(fieldName) + ' is set correctly', function () { + expect(mainViewsController.get('ambariViews.firstObject.' + fieldName)).to.be.equal(viewInstanceFields[fieldName]); + }); + }); + + + it('`isDataLoaded` is set `true` when view instances are parsed', function () { expect(mainViewsController.get('isDataLoaded')).to.be.true; }); }); @@ -142,11 +158,11 @@ describe('MainViewsController', function () { it("context exist", function () { mainViewsController.setView({ - context: { + context: App.ViewInstance.create({ viewName: 'view1', version: '1', instanceName: 'instance1' - } + }) }); expect(App.router.route.calledWith('main/views/view1/1/instance1')).to.be.true; }); http://git-wip-us.apache.org/repos/asf/ambari/blob/1fc41441/ambari-web/test/models/view_instance_test.js ---------------------------------------------------------------------- diff --git a/ambari-web/test/models/view_instance_test.js b/ambari-web/test/models/view_instance_test.js new file mode 100644 index 0000000..0e977e3 --- /dev/null +++ b/ambari-web/test/models/view_instance_test.js @@ -0,0 +1,59 @@ +/** + * 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. + */ + +var model; + +describe('App.ViewInstance', function () { + + beforeEach(function () { + model = App.ViewInstance.create(); + }); + + describe('#internalAmbariUrl', function () { + + [ + { + props: { + shortUrl: '', + viewName: 'CAPACITY-SCHEDULER', + version: '1.0.0', + instanceName: 'AUTO_CS_INSTANCE' + }, + e: 'main/views/CAPACITY-SCHEDULER/1.0.0/AUTO_CS_INSTANCE', + m: '`shortUrl` does not exist' + }, + { + props: { + shortUrl: 'auto_cs_instance', + viewName: 'CAPACITY-SCHEDULER', + version: '1.0.0', + instanceName: 'AUTO_CS_INSTANCE' + }, + e: 'main/view/CAPACITY-SCHEDULER/auto_cs_instance', + m: '`shortUrl` exists' + } + ].forEach(function (test) { + it(test.m, function () { + model.setProperties(test.props); + expect(model.get('internalAmbariUrl')).to.be.equal(test.e); + }); + }); + + }); + +}); \ No newline at end of file