Repository: ambari Updated Branches: refs/heads/branch-3.0-perf eb156a92d -> 05cd35982
AMBARI-22430 Integrate Alert Definitions page with websocket events. (atkach) Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/05cd3598 Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/05cd3598 Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/05cd3598 Branch: refs/heads/branch-3.0-perf Commit: 05cd35982b30f424cec0b5b9d93bc4709880a3bc Parents: eb156a9 Author: Andrii Tkach <[email protected]> Authored: Mon Nov 13 19:00:16 2017 +0200 Committer: Andrii Tkach <[email protected]> Committed: Mon Nov 13 19:00:16 2017 +0200 ---------------------------------------------------------------------- ambari-web/app/assets/test/tests.js | 1 + .../app/controllers/global/update_controller.js | 3 +- .../alerts/definition_configs_controller.js | 11 +-- ambari-web/app/mappers.js | 1 + .../app/mappers/alert_definitions_mapper.js | 10 ++- .../socket/alert_definitions_mapper_adapter.js | 45 +++++++++++ ambari-web/app/utils/stomp_client.js | 2 +- .../global/update_controller_test.js | 4 +- .../alert_definitions_mapper_adapter_test.js | 85 ++++++++++++++++++++ ambari-web/test/utils/stomp_client_test.js | 2 +- 10 files changed, 146 insertions(+), 18 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/05cd3598/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 ca980be..eac9967 100644 --- a/ambari-web/app/assets/test/tests.js +++ b/ambari-web/app/assets/test/tests.js @@ -172,6 +172,7 @@ var files = [ 'test/mappers/socket/host_component_status_mapper_test', 'test/mappers/socket/service_state_mapper_test', 'test/mappers/socket/host_state_mapper_test', + 'test/mappers/socket/alert_definitions_mapper_adapter_test', 'test/mixins/common/configs/enhanced_configs_test', 'test/mixins/common/configs/config_recommendations_test', 'test/mixins/common/configs/config_recommendation_parser_test', http://git-wip-us.apache.org/repos/asf/ambari/blob/05cd3598/ambari-web/app/controllers/global/update_controller.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/controllers/global/update_controller.js b/ambari-web/app/controllers/global/update_controller.js index 5bd89ea..63a4da4 100644 --- a/ambari-web/app/controllers/global/update_controller.js +++ b/ambari-web/app/controllers/global/update_controller.js @@ -193,6 +193,7 @@ App.UpdateController = Em.Controller.extend({ App.StompClient.subscribe('/events/configs', this.makeCallForClusterEnv.bind(this)); App.StompClient.subscribe('/events/services', App.serviceStateMapper.map.bind(App.serviceStateMapper)); App.StompClient.subscribe('/events/hosts', App.hostStateMapper.map.bind(App.hostStateMapper)); + App.StompClient.subscribe('/events/alert_definitions', App.alertDefinitionsMapperAdapter.map.bind(App.alertDefinitionsMapperAdapter)); App.updater.run(this, 'updateHostsMetrics', 'isWorking', App.contentUpdateInterval, '\/main\/(hosts).*'); App.updater.run(this, 'updateServiceMetric', 'isWorking', App.componentsUpdateInterval, '\/main\/(dashboard|services).*'); @@ -201,7 +202,6 @@ App.UpdateController = Em.Controller.extend({ App.updater.run(this, 'updateComponentConfig', 'isWorking'); App.updater.run(this, 'updateAlertGroups', 'isWorking', App.alertGroupsUpdateInterval, '\/main\/alerts.*'); - App.updater.run(this, 'updateAlertDefinitions', 'isWorking', App.alertDefinitionsUpdateInterval, '\/main\/alerts.*'); if (!App.get('router.mainAlertInstancesController.isUpdating')) { App.updater.run(this, 'updateUnhealthyAlertInstances', 'updateAlertInstances', App.alertInstancesUpdateInterval, '\/main\/alerts.*'); } @@ -214,6 +214,7 @@ App.UpdateController = Em.Controller.extend({ App.StompClient.unsubscribe('/events/configs'); App.StompClient.unsubscribe('/events/services'); App.StompClient.unsubscribe('/events/hosts'); + App.StompClient.unsubscribe('/events/alert_definitions'); } }.observes('isWorking', 'App.router.mainAlertInstancesController.isUpdating'), http://git-wip-us.apache.org/repos/asf/ambari/blob/05cd3598/ambari-web/app/controllers/main/alerts/definition_configs_controller.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/controllers/main/alerts/definition_configs_controller.js b/ambari-web/app/controllers/main/alerts/definition_configs_controller.js index 31e34a9..89aee5b 100644 --- a/ambari-web/app/controllers/main/alerts/definition_configs_controller.js +++ b/ambari-web/app/controllers/main/alerts/definition_configs_controller.js @@ -656,20 +656,11 @@ App.MainAlertDefinitionConfigsController = Em.Controller.extend({ data: { id: this.get('content.id'), data: this.getPropertiesToUpdate(true) - }, - success: 'saveConfigsSuccessCallback' + } }); }, /** - * Success-callback for saveConfigs-request - * @method saveConfigsSuccessCallback - */ - saveConfigsSuccessCallback: function () { - App.router.get('updateController').updateAlertDefinitions(Em.K); - }, - - /** * Create object with new values to put it on server * @param {boolean} onlyChanged * @method getPropertiesToUpdate http://git-wip-us.apache.org/repos/asf/ambari/blob/05cd3598/ambari-web/app/mappers.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/mappers.js b/ambari-web/app/mappers.js index f4c7e5c..241ba29 100644 --- a/ambari-web/app/mappers.js +++ b/ambari-web/app/mappers.js @@ -50,3 +50,4 @@ require('mappers/socket/service_state_mapper'); require('mappers/socket/host_component_status_mapper'); require('mappers/socket/alert_summary_mapper'); require('mappers/socket/host_state_mapper'); +require('mappers/socket/alert_definitions_mapper_adapter'); http://git-wip-us.apache.org/repos/asf/ambari/blob/05cd3598/ambari-web/app/mappers/alert_definitions_mapper.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/mappers/alert_definitions_mapper.js b/ambari-web/app/mappers/alert_definitions_mapper.js index ca0ada6..8f5a446 100644 --- a/ambari-web/app/mappers/alert_definitions_mapper.js +++ b/ambari-web/app/mappers/alert_definitions_mapper.js @@ -85,7 +85,7 @@ App.alertDefinitionsMapper = App.QuickDataMapper.create({ interval: 'AlertDefinition.source.ams.interval' }, - map: function (json) { + map: function (json, ignoreDelete) { console.time('App.alertDefinitionsMapper execution time'); if (json && json.items) { var self = this, @@ -223,9 +223,11 @@ App.alertDefinitionsMapper = App.QuickDataMapper.create({ } }, this); - alertDefinitionsToDelete.forEach(function(definitionId) { - self.deleteRecord(existingAlertDefinitions.findProperty('id', definitionId)); - }); + if (!ignoreDelete) { + alertDefinitionsToDelete.forEach(function(definitionId) { + self.deleteRecord(existingAlertDefinitions.findProperty('id', definitionId)); + }); + } // load all mapped data to model App.store.safeLoadMany(this.get('reportModel'), alertReportDefinitions); http://git-wip-us.apache.org/repos/asf/ambari/blob/05cd3598/ambari-web/app/mappers/socket/alert_definitions_mapper_adapter.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/mappers/socket/alert_definitions_mapper_adapter.js b/ambari-web/app/mappers/socket/alert_definitions_mapper_adapter.js new file mode 100644 index 0000000..224a27c --- /dev/null +++ b/ambari-web/app/mappers/socket/alert_definitions_mapper_adapter.js @@ -0,0 +1,45 @@ +/** + * 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.alertDefinitionsMapperAdapter = App.QuickDataMapper.create({ + + /** + * @param {object} event + */ + map: function(event) { + event.clusters[App.get('clusterId')].alertDefinitions.forEach((alertDefinition) => { + // TODO: remove when fields will be correctly named + alertDefinition.id = alertDefinition.definitionId; + alertDefinition.component_name = alertDefinition.componentName; + alertDefinition.service_name = alertDefinition.serviceName; + + if (event.eventType === 'UPDATE') { // UPDATE/ADD + App.alertDefinitionsMapper.map({ + items: [ + { + AlertDefinition: alertDefinition + } + ] + }, true); + } else if (event.eventType === 'DELETE') { + this.deleteRecord(App.AlertDefinition.find(alertDefinition.id)); + } + }); + } +}); http://git-wip-us.apache.org/repos/asf/ambari/blob/05cd3598/ambari-web/app/utils/stomp_client.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/utils/stomp_client.js b/ambari-web/app/utils/stomp_client.js index 18167f6..5c4847f 100644 --- a/ambari-web/app/utils/stomp_client.js +++ b/ambari-web/app/utils/stomp_client.js @@ -27,7 +27,7 @@ module.exports = Em.Object.extend({ /** * @type {string} */ - webSocketUrl: 'ws://{hostname}:8080/api/stomp/v1', + webSocketUrl: 'ws://{hostname}:8080/api/stomp/v1/websocket', /** * @type {string} http://git-wip-us.apache.org/repos/asf/ambari/blob/05cd3598/ambari-web/test/controllers/global/update_controller_test.js ---------------------------------------------------------------------- diff --git a/ambari-web/test/controllers/global/update_controller_test.js b/ambari-web/test/controllers/global/update_controller_test.js index 3c17bc3..c42926a 100644 --- a/ambari-web/test/controllers/global/update_controller_test.js +++ b/ambari-web/test/controllers/global/update_controller_test.js @@ -74,17 +74,19 @@ describe('App.UpdateController', function () { expect(App.StompClient.unsubscribe.calledWith('/events/configs')).to.be.true; expect(App.StompClient.unsubscribe.calledWith('/events/services')).to.be.true; expect(App.StompClient.unsubscribe.calledWith('/events/hosts')).to.be.true; + expect(App.StompClient.unsubscribe.calledWith('/events/alert_definitions')).to.be.true; }); it('isWorking = true', function () { controller.set('isWorking', true); - expect(App.updater.run.callCount).to.equal(10); + expect(App.updater.run.callCount).to.equal(9); expect(App.StompClient.subscribe.calledWith('/events/hostcomponents')).to.be.true; expect(App.StompClient.subscribe.calledWith('/events/alerts')).to.be.true; expect(App.StompClient.subscribe.calledWith('/events/ui_topologies')).to.be.true; expect(App.StompClient.subscribe.calledWith('/events/configs')).to.be.true; expect(App.StompClient.subscribe.calledWith('/events/services')).to.be.true; expect(App.StompClient.subscribe.calledWith('/events/hosts')).to.be.true; + expect(App.StompClient.subscribe.calledWith('/events/alert_definitions')).to.be.true; }); }); http://git-wip-us.apache.org/repos/asf/ambari/blob/05cd3598/ambari-web/test/mappers/socket/alert_definitions_mapper_adapter_test.js ---------------------------------------------------------------------- diff --git a/ambari-web/test/mappers/socket/alert_definitions_mapper_adapter_test.js b/ambari-web/test/mappers/socket/alert_definitions_mapper_adapter_test.js new file mode 100644 index 0000000..49b8aa4 --- /dev/null +++ b/ambari-web/test/mappers/socket/alert_definitions_mapper_adapter_test.js @@ -0,0 +1,85 @@ +/** + * 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'); + +require('mappers/socket/alert_definitions_mapper_adapter'); + +describe('App.alertDefinitionsMapperAdapter', function () { + + describe('#map', function() { + beforeEach(function() { + sinon.stub(App.alertDefinitionsMapper, 'map'); + sinon.stub(App.AlertDefinition, 'find').returns({}); + sinon.stub(App.alertDefinitionsMapperAdapter, 'deleteRecord'); + App.set('clusterId', 1); + }); + afterEach(function() { + App.alertDefinitionsMapper.map.restore(); + App.AlertDefinition.find.restore(); + App.alertDefinitionsMapperAdapter.deleteRecord.restore(); + }); + + it('should call App.alertDefinitionsMapper.map on UPDATE event', function() { + var event = { + eventType: 'UPDATE', + clusters: { + 1: { + alertDefinitions: [ + { + definitionId: 1, + componentName: 'C1', + serviceName: 'S1' + } + ] + } + } + }; + App.alertDefinitionsMapperAdapter.map(event); + expect(App.alertDefinitionsMapper.map.getCall(0).args[0]).to.be.eql({ + items: [{ + AlertDefinition: { + id: 1, + component_name: 'C1', + service_name: 'S1', + definitionId: 1, + componentName: 'C1', + serviceName: 'S1' + } + }] + }); + }); + + it('should call deleteRecord on DELETE event', function() { + var event = { + eventType: 'DELETE', + clusters: { + 1: { + alertDefinitions: [ + { + definitionId: 1 + } + ] + } + } + }; + App.alertDefinitionsMapperAdapter.map(event); + expect(App.alertDefinitionsMapperAdapter.deleteRecord.calledWith({})).to.be.true; + }); + }); +}); http://git-wip-us.apache.org/repos/asf/ambari/blob/05cd3598/ambari-web/test/utils/stomp_client_test.js ---------------------------------------------------------------------- diff --git a/ambari-web/test/utils/stomp_client_test.js b/ambari-web/test/utils/stomp_client_test.js index 5ee7a5e..48b2e25 100644 --- a/ambari-web/test/utils/stomp_client_test.js +++ b/ambari-web/test/utils/stomp_client_test.js @@ -67,7 +67,7 @@ describe('App.StompClient', function () { describe('#getSocket', function() { it('should return WebSocket instance', function() { - expect(stomp.getSocket().URL).to.be.equal('ws://:8080/api/stomp/v1'); + expect(stomp.getSocket().URL).to.be.equal('ws://:8080/api/stomp/v1/websocket'); }); it('should return SockJS instance', function() { expect(stomp.getSocket(true).url).to.be.equal('http://:8080/api/stomp/v1');
