Repository: ambari Updated Branches: refs/heads/branch-3.0-perf 45d9ca671 -> eaf1fd5ce
AMBARI-22528 Integrate stack upgrades 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/eaf1fd5c Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/eaf1fd5c Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/eaf1fd5c Branch: refs/heads/branch-3.0-perf Commit: eaf1fd5cee81bc8a021e2dd01ee4fc604c0ee3b0 Parents: 45d9ca6 Author: Andrii Tkach <[email protected]> Authored: Wed Nov 29 13:45:32 2017 +0200 Committer: Andrii Tkach <[email protected]> Committed: Wed Nov 29 13:45:32 2017 +0200 ---------------------------------------------------------------------- ambari-web/app/assets/test/tests.js | 1 + .../global/background_operations_controller.js | 10 +- .../controllers/global/cluster_controller.js | 7 - .../app/controllers/global/update_controller.js | 42 ++--- ambari-web/app/controllers/main.js | 2 + .../main/admin/stack_and_upgrade_controller.js | 22 +-- ambari-web/app/mappers.js | 1 + .../app/mappers/socket/upgrade_state_mapper.js | 42 +++++ .../global/background_operations_test.js | 15 +- .../global/cluster_controller_test.js | 12 -- .../global/update_controller_test.js | 181 ++----------------- .../admin/stack_and_upgrade_controller_test.js | 16 +- ambari-web/test/controllers/main_test.js | 33 ++++ .../mappers/socket/upgrade_state_mapper_test.js | 80 ++++++++ 14 files changed, 211 insertions(+), 253 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/eaf1fd5c/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 23b985a..f4b319a 100644 --- a/ambari-web/app/assets/test/tests.js +++ b/ambari-web/app/assets/test/tests.js @@ -174,6 +174,7 @@ var files = [ 'test/mappers/socket/host_state_mapper_test', 'test/mappers/socket/alert_definitions_mapper_adapter_test', 'test/mappers/socket/alert_groups_mapper_adapter_test', + 'test/mappers/socket/upgrade_state_mapper_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/eaf1fd5c/ambari-web/app/controllers/global/background_operations_controller.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/controllers/global/background_operations_controller.js b/ambari-web/app/controllers/global/background_operations_controller.js index f160883..caca04a 100644 --- a/ambari-web/app/controllers/global/background_operations_controller.js +++ b/ambari-web/app/controllers/global/background_operations_controller.js @@ -65,6 +65,9 @@ App.BackgroundOperationsController = Em.Controller.extend({ }.observes('isWorking'), updateRequests: function(event) { + if (this.isUpgradeRequest({Requests: {request_context: event.requestContext}})) { + return; + } const request = this.get('services').findProperty('id', event.requestId); const context = this.parseRequestContext(event.requestContext); const visibleOperationsCount = this.get('operationsCount'); @@ -308,13 +311,9 @@ App.BackgroundOperationsController = Em.Controller.extend({ var currentRequestIds = []; var countIssued = this.get('operationsCount'); var countGot = data.itemTotal; - var restoreUpgradeState = false; data.items.forEach(function (request) { if (this.isUpgradeRequest(request)) { - if (!App.get('upgradeIsRunning')) { - restoreUpgradeState = true; - } return; } var rq = this.get("services").findProperty('id', request.Requests.id); @@ -349,9 +348,6 @@ App.BackgroundOperationsController = Em.Controller.extend({ this.set("services", this.get("services").sortProperty('id').reverse()); } }, this); - if (restoreUpgradeState) { - App.router.get('clusterController').restoreUpgradeState(); - } this.removeOldRequests(currentRequestIds); this.set('isShowMoreAvailable', countGot >= countIssued); this.set('serviceTimestamp', App.dateTimeWithTimeZone()); http://git-wip-us.apache.org/repos/asf/ambari/blob/eaf1fd5c/ambari-web/app/controllers/global/cluster_controller.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/controllers/global/cluster_controller.js b/ambari-web/app/controllers/global/cluster_controller.js index 32b5db5..bc3ce38 100644 --- a/ambari-web/app/controllers/global/cluster_controller.js +++ b/ambari-web/app/controllers/global/cluster_controller.js @@ -306,7 +306,6 @@ App.ClusterController = Em.Controller.extend(App.ReloadPopupMixin, { * restore upgrade status from server * and make call to get latest status from server * Also loading all upgrades to App.StackUpgradeHistory model - * TODO should be called even if recent background operations doesn't have Upgrade request */ restoreUpgradeState: function () { var self = this; @@ -314,7 +313,6 @@ App.ClusterController = Em.Controller.extend(App.ReloadPopupMixin, { var upgradeController = App.router.get('mainAdminStackAndUpgradeController'); var allUpgrades = data.items.sortProperty('Upgrade.request_id'); var lastUpgradeData = allUpgrades.pop(); - var dbUpgradeState = App.db.get('MainAdminStackAndUpgrade', 'upgradeState'); if (lastUpgradeData){ var status = lastUpgradeData.Upgrade.request_status; var lastUpgradeNotFinished = (self.isSuspendedState(status) || self.isRunningState(status)); @@ -347,11 +345,6 @@ App.ClusterController = Em.Controller.extend(App.ReloadPopupMixin, { } } else { upgradeController.initDBProperties(); - upgradeController.loadUpgradeData(true); - } - - if (!Em.isNone(dbUpgradeState)) { - App.set('upgradeState', dbUpgradeState); } App.stackUpgradeHistoryMapper.map(data); http://git-wip-us.apache.org/repos/asf/ambari/blob/eaf1fd5c/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 56f9ab6..231b178 100644 --- a/ambari-web/app/controllers/global/update_controller.js +++ b/ambari-web/app/controllers/global/update_controller.js @@ -187,15 +187,6 @@ App.UpdateController = Em.Controller.extend({ */ updateAll: function () { if (this.get('isWorking') && !App.get('isOnlyViewUser')) { - App.StompClient.subscribe('/events/hostcomponents', App.hostComponentStatusMapper.map.bind(App.hostComponentStatusMapper)); - App.StompClient.subscribe('/events/alerts', App.alertSummaryMapper.map.bind(App.alertSummaryMapper)); - App.StompClient.subscribe('/events/ui_topologies', App.topologyMapper.map.bind(App.topologyMapper)); - 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.StompClient.subscribe('/events/alert_group', App.alertGroupsMapperAdapter.map.bind(App.alertGroupsMapperAdapter)); - App.updater.run(this, 'updateHostsMetrics', 'isWorking', App.contentUpdateInterval, '\/main\/(hosts).*'); App.updater.run(this, 'updateServiceMetric', 'isWorking', App.componentsUpdateInterval, '\/main\/(dashboard|services).*'); App.updater.run(this, 'updateComponentsState', 'isWorking', App.componentsUpdateInterval, '\/main\/(dashboard|services|hosts).*'); @@ -204,20 +195,22 @@ App.UpdateController = Em.Controller.extend({ if (!App.get('router.mainAlertInstancesController.isUpdating')) { App.updater.run(this, 'updateUnhealthyAlertInstances', 'updateAlertInstances', App.alertInstancesUpdateInterval, '\/main\/alerts.*'); } - App.updater.run(this, 'updateUpgradeState', 'isWorking', App.bgOperationsUpdateInterval); App.updater.run(this, 'updateWizardWatcher', 'isWorking', App.bgOperationsUpdateInterval); - } else { - App.StompClient.unsubscribe('/events/hostcomponents'); - App.StompClient.unsubscribe('/events/alerts'); - // "/events/ui_topologies" topic should listen to topology changes when wizard running - App.StompClient.unsubscribe('/events/configs'); - App.StompClient.unsubscribe('/events/services'); - App.StompClient.unsubscribe('/events/hosts'); - App.StompClient.unsubscribe('/events/alert_definitions'); - App.StompClient.unsubscribe('/events/alert_group'); } }.observes('isWorking', 'App.router.mainAlertInstancesController.isUpdating'), + startSubscriptions: function () { + App.StompClient.subscribe('/events/hostcomponents', App.hostComponentStatusMapper.map.bind(App.hostComponentStatusMapper)); + App.StompClient.subscribe('/events/alerts', App.alertSummaryMapper.map.bind(App.alertSummaryMapper)); + App.StompClient.subscribe('/events/ui_topologies', App.topologyMapper.map.bind(App.topologyMapper)); + 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.StompClient.subscribe('/events/alert_group', App.alertGroupsMapperAdapter.map.bind(App.alertGroupsMapperAdapter)); + App.StompClient.subscribe('/events/upgrade', App.upgradeStateMapper.map.bind(App.upgradeStateMapper)); + }, + /** * * @param {Function} callback @@ -622,17 +615,6 @@ App.UpdateController = Em.Controller.extend({ }); }, - updateUpgradeState: function (callback) { - var currentStateName = App.get('router.currentState.name'), - parentStateName = App.get('router.currentState.parentState.name'), - mainAdminStackAndUpgradeController = App.get('router.mainAdminStackAndUpgradeController'); - if (!(currentStateName === 'versions' && parentStateName === 'stackAndUpgrade') && currentStateName !== 'stackUpgrade' && App.get('wizardIsNotFinished') && !mainAdminStackAndUpgradeController.get('isLoadUpgradeDataPending')) { - mainAdminStackAndUpgradeController.loadUpgradeData(true).done(callback); - } else { - callback(); - } - }, - makeCallForClusterEnv: function(event) { if (event.configs.someProperty('type', 'cluster-env')) { this.updateClusterEnv(); http://git-wip-us.apache.org/repos/asf/ambari/blob/eaf1fd5c/ambari-web/app/controllers/main.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/controllers/main.js b/ambari-web/app/controllers/main.js index 18018d9..a34e199 100644 --- a/ambari-web/app/controllers/main.js +++ b/ambari-web/app/controllers/main.js @@ -101,9 +101,11 @@ App.MainController = Em.Controller.extend({ startPolling: function () { if (App.router.get('applicationController.isExistingClusterDataLoaded')) { App.router.get('updateController').set('isWorking', true); + App.router.get('updateController').startSubscriptions(); App.router.get('backgroundOperationsController').set('isWorking', true); } }.observes('App.router.applicationController.isExistingClusterDataLoaded'), + stopPolling: function(){ App.router.get('updateController').set('isWorking', false); App.router.get('backgroundOperationsController').set('isWorking', false); http://git-wip-us.apache.org/repos/asf/ambari/blob/eaf1fd5c/ambari-web/app/controllers/main/admin/stack_and_upgrade_controller.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/controllers/main/admin/stack_and_upgrade_controller.js b/ambari-web/app/controllers/main/admin/stack_and_upgrade_controller.js index 2f0cb68..20627ce 100644 --- a/ambari-web/app/controllers/main/admin/stack_and_upgrade_controller.js +++ b/ambari-web/app/controllers/main/admin/stack_and_upgrade_controller.js @@ -421,13 +421,11 @@ App.MainAdminStackAndUpgradeController = Em.Controller.extend(App.LocalStorage, var dfd = $.Deferred(); var self = this; - this.loadUpgradeData(true).done(function() { - self.loadStackVersionsToModel(true).done(function () { - self.loadRepoVersionsToModel().done(function() { - self.loadCompatibleVersions().done(function() { - self.updateCurrentStackVersion(); - dfd.resolve(); - }); + this.loadStackVersionsToModel(true).done(function () { + self.loadRepoVersionsToModel().done(function() { + self.loadCompatibleVersions().done(function() { + self.updateCurrentStackVersion(); + dfd.resolve(); }); }); }); @@ -2140,16 +2138,18 @@ App.MainAdminStackAndUpgradeController = Em.Controller.extend(App.LocalStorage, isWizardRestricted: upgradeType.get('isWizardRestricted'), downgradeAllowed: lastUpgradeData.Upgrade.downgrade_allowed, upgradeTypeDisplayName: upgradeType.get('displayName'), - failuresTolerance: Em.Object.create({ + isSuspended: lastUpgradeData.Upgrade.suspended, + failuresTolerance: { skipComponentFailures: lastUpgradeData.Upgrade.skip_failures, skipSCFailures: lastUpgradeData.Upgrade.skip_service_check_failures - }) + } }); + this.initDBProperties(); + App.set('upgradeState', lastUpgradeData.Upgrade.request_status); this.loadRepoVersionsToModel().done(function () { var toVersion = App.RepositoryVersion.find().findProperty('repositoryVersion', lastUpgradeData.Upgrade.associated_version); self.setDBProperty('upgradeVersion', toVersion && toVersion.get('displayName')); - self.initDBProperties(); - self.loadUpgradeData(true); + self.set('upgradeVersion', toVersion && toVersion.get('displayName')); }); }, http://git-wip-us.apache.org/repos/asf/ambari/blob/eaf1fd5c/ambari-web/app/mappers.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/mappers.js b/ambari-web/app/mappers.js index 93cd319..e6f1bb0 100644 --- a/ambari-web/app/mappers.js +++ b/ambari-web/app/mappers.js @@ -51,3 +51,4 @@ require('mappers/socket/alert_summary_mapper'); require('mappers/socket/host_state_mapper'); require('mappers/socket/alert_definitions_mapper_adapter'); require('mappers/socket/alert_groups_mapper_adapter'); +require('mappers/socket/upgrade_state_mapper'); http://git-wip-us.apache.org/repos/asf/ambari/blob/eaf1fd5c/ambari-web/app/mappers/socket/upgrade_state_mapper.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/mappers/socket/upgrade_state_mapper.js b/ambari-web/app/mappers/socket/upgrade_state_mapper.js new file mode 100644 index 0000000..1670ed5 --- /dev/null +++ b/ambari-web/app/mappers/socket/upgrade_state_mapper.js @@ -0,0 +1,42 @@ +/** + * 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.upgradeStateMapper = App.QuickDataMapper.create({ + + /** + * @param {object} event + */ + map: function (event) { + var controller = App.router.get('mainAdminStackAndUpgradeController'); + if (event.type === 'CREATE') { + controller.restoreLastUpgrade({Upgrade: event}); + } + //TODO rename type to eventType + if (event.type === 'UPDATE' && controller.get('upgradeId') === event.request_id) { + if (!Em.isNone(event.request_status)) { + App.set('upgradeState', event.request_status); + controller.setDBProperty('upgradeState', event.request_status); + } + if (!Em.isNone(event.suspended)) { + controller.set('isSuspended', event.suspended); + controller.setDBProperty('isSuspended', event.suspended); + } + } + } +}); http://git-wip-us.apache.org/repos/asf/ambari/blob/eaf1fd5c/ambari-web/test/controllers/global/background_operations_test.js ---------------------------------------------------------------------- diff --git a/ambari-web/test/controllers/global/background_operations_test.js b/ambari-web/test/controllers/global/background_operations_test.js index 43b2170..8612cd2 100644 --- a/ambari-web/test/controllers/global/background_operations_test.js +++ b/ambari-web/test/controllers/global/background_operations_test.js @@ -149,14 +149,6 @@ describe('App.BackgroundOperationsController', function () { describe('#callBackForMostRecent()', function () { - beforeEach(function () { - sinon.stub(App.router.get('clusterController'), 'restoreUpgradeState', Em.K); - }); - - afterEach(function () { - App.router.get('clusterController').restoreUpgradeState.restore(); - }); - it('No requests exists', function () { var data = { items: [] @@ -783,6 +775,13 @@ describe('App.BackgroundOperationsController', function () { controller.propertyDidChange.restore(); }); + it('should exit when request is upgrade', function() { + controller.updateRequests({ + requestContext: 'upgrading' + }); + expect(controller.parseRequestContext.called).to.be.false; + }); + it('should add request to list', function() { controller.set('services', []); controller.updateRequests({ http://git-wip-us.apache.org/repos/asf/ambari/blob/eaf1fd5c/ambari-web/test/controllers/global/cluster_controller_test.js ---------------------------------------------------------------------- diff --git a/ambari-web/test/controllers/global/cluster_controller_test.js b/ambari-web/test/controllers/global/cluster_controller_test.js index 988379d..fcbad62 100644 --- a/ambari-web/test/controllers/global/cluster_controller_test.js +++ b/ambari-web/test/controllers/global/cluster_controller_test.js @@ -501,10 +501,6 @@ describe('App.clusterController', function () { expect(controller.getAllUpgrades.calledOnce).to.be.true; }); - it('upgradeState is PENDING', function () { - expect(App.get('upgradeState')).to.equal('PENDING'); - }); - it('restoreLastUpgrade is called with valid arguments', function () { expect(upgradeController.restoreLastUpgrade.calledWith(data.upgradeData.items[0])).to.be.true; }); @@ -572,10 +568,6 @@ describe('App.clusterController', function () { expect(controller.getAllUpgrades.calledOnce).to.be.true; }); - it('upgradeState is PENDING', function () { - expect(App.get('upgradeState')).to.equal('PENDING'); - }); - it('restoreLastUpgrade is not called', function () { expect(upgradeController.restoreLastUpgrade.called).to.be.false; }); @@ -588,10 +580,6 @@ describe('App.clusterController', function () { expect(upgradeController.initDBProperties.calledOnce).to.be.true; }); - it('loadUpgradeData is called with valid arguments', function () { - expect(upgradeController.loadUpgradeData.calledWith(true)).to.be.true; - }); - }); }); http://git-wip-us.apache.org/repos/asf/ambari/blob/eaf1fd5c/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 78a4064..a812353 100644 --- a/ambari-web/test/controllers/global/update_controller_test.js +++ b/ambari-web/test/controllers/global/update_controller_test.js @@ -56,31 +56,29 @@ describe('App.UpdateController', function () { }); describe('#updateAll()', function () { - beforeEach(function() { - sinon.stub(App.StompClient, 'unsubscribe'); - sinon.stub(App.StompClient, 'subscribe'); - }); - afterEach(function() { - App.StompClient.unsubscribe.restore(); - App.StompClient.subscribe.restore(); - }); it('isWorking = false', function () { controller.set('isWorking', false); controller.updateAll(); expect(App.updater.run.called).to.equal(false); - expect(App.StompClient.unsubscribe.calledWith('/events/hostcomponents')).to.be.true; - expect(App.StompClient.unsubscribe.calledWith('/events/alerts')).to.be.true; - 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; - expect(App.StompClient.unsubscribe.calledWith('/events/alert_group')).to.be.true; }); it('isWorking = true', function () { controller.set('isWorking', true); - expect(App.updater.run.callCount).to.equal(7); + expect(App.updater.run.callCount).to.equal(6); + }); + }); + + describe('#startSubscriptions()', function () { + beforeEach(function() { + sinon.stub(App.StompClient, 'subscribe'); + }); + afterEach(function() { + App.StompClient.subscribe.restore(); + }); + + it('should subscribe to all topics', function () { + controller.startSubscriptions(); 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; @@ -89,6 +87,7 @@ describe('App.UpdateController', function () { expect(App.StompClient.subscribe.calledWith('/events/hosts')).to.be.true; expect(App.StompClient.subscribe.calledWith('/events/alert_definitions')).to.be.true; expect(App.StompClient.subscribe.calledWith('/events/alert_group')).to.be.true; + expect(App.StompClient.subscribe.calledWith('/events/upgrade')).to.be.true; }); }); @@ -320,156 +319,6 @@ describe('App.UpdateController', function () { }); }); - describe('#updateUpgradeState()', function () { - - var cases = [ - { - currentStateName: 'versions', - parentStateName: 'stackAndUpgrade', - wizardIsNotFinished: true, - isLoadUpgradeDataPending: true, - loadUpgradeDataCallCount: 0, - callbackCallCount: 1, - title: 'stack versions page' - }, - { - currentStateName: 'stackUpgrade', - parentStateName: 'admin', - wizardIsNotFinished: true, - isLoadUpgradeDataPending: true, - loadUpgradeDataCallCount: 0, - callbackCallCount: 1, - title: 'upgrade popup open' - }, - { - currentStateName: 'versions', - parentStateName: 'admin', - wizardIsNotFinished: true, - isLoadUpgradeDataPending: false, - loadUpgradeDataCallCount: 1, - callbackCallCount: 0, - title: 'another page with \'versions\' name' - }, - { - currentStateName: 'versions', - parentStateName: 'admin', - wizardIsNotFinished: false, - isLoadUpgradeDataPending: false, - loadUpgradeDataCallCount: 0, - callbackCallCount: 1, - title: 'another page with \'versions\' name, upgrade finished' - }, - { - currentStateName: 'versions', - parentStateName: 'admin', - wizardIsNotFinished: true, - isLoadUpgradeDataPending: true, - loadUpgradeDataCallCount: 0, - callbackCallCount: 1, - title: 'another page with \'versions\' name, another update upgrade request not completed' - }, - { - currentStateName: 'services', - parentStateName: 'stackAndUpgrade', - wizardIsNotFinished: true, - isLoadUpgradeDataPending: false, - loadUpgradeDataCallCount: 1, - callbackCallCount: 0, - title: 'another page from \'Stack and Versions\' section' - }, - { - currentStateName: 'services', - parentStateName: 'stackAndUpgrade', - wizardIsNotFinished: false, - isLoadUpgradeDataPending: false, - loadUpgradeDataCallCount: 0, - callbackCallCount: 1, - title: 'another page from \'Stack and Versions\' section, upgrade finished' - }, - { - currentStateName: 'services', - parentStateName: 'stackAndUpgrade', - wizardIsNotFinished: true, - isLoadUpgradeDataPending: true, - loadUpgradeDataCallCount: 0, - callbackCallCount: 1, - title: 'another page from \'Stack and Versions\' section, another update upgrade request not completed' - }, - { - currentStateName: 'widgets', - parentStateName: 'dashboard', - wizardIsNotFinished: true, - isLoadUpgradeDataPending: false, - loadUpgradeDataCallCount: 1, - callbackCallCount: 0, - title: 'not \'Stack and Versions\' section' - }, - { - currentStateName: 'widgets', - parentStateName: 'dashboard', - wizardIsNotFinished: false, - isLoadUpgradeDataPending: false, - loadUpgradeDataCallCount: 0, - callbackCallCount: 1, - title: 'not \'Stack and Versions\' section, upgrade finished' - }, - { - currentStateName: 'widgets', - parentStateName: 'dashboard', - wizardIsNotFinished: true, - isLoadUpgradeDataPending: true, - loadUpgradeDataCallCount: 0, - callbackCallCount: 1, - title: 'not \'Stack and Versions\' section, another update upgrade request not completed' - } - ], - mock = { - callback: Em.K, - loadUpgradeData: function () { - return { - done: Em.K - }; - } - }, - appGetMock; - - beforeEach(function () { - sinon.spy(mock, 'callback'); - sinon.spy(mock, 'loadUpgradeData'); - appGetMock = sinon.stub(App, 'get'); - }); - - afterEach(function () { - mock.callback.restore(); - mock.loadUpgradeData.restore(); - App.get.restore(); - appGetMock.restore(); - }); - - cases.forEach(function (item) { - describe(item.title, function () { - - beforeEach(function () { - appGetMock.withArgs('router.mainAdminStackAndUpgradeController').returns(Em.Object.create({ - loadUpgradeData: mock.loadUpgradeData, - isLoadUpgradeDataPending: item.isLoadUpgradeDataPending - })).withArgs('wizardIsNotFinished').returns(item.wizardIsNotFinished) - .withArgs('router.currentState.name').returns(item.currentStateName) - .withArgs('router.currentState.parentState.name').returns(item.parentStateName); - controller.updateUpgradeState(mock.callback); - }); - it('loadUpgradeData is called ' + item.loadUpgradeDataCallCount + ' times', function () { - expect(mock.loadUpgradeData.callCount).to.equal(item.loadUpgradeDataCallCount); - }); - it('callback is called ' + item.callbackCallCount + ' times', function () { - expect(mock.callback.callCount).to.equal(item.callbackCallCount); - }); - - }); - }); - - }); - describe('#computeParameters', function () { beforeEach(function() { http://git-wip-us.apache.org/repos/asf/ambari/blob/eaf1fd5c/ambari-web/test/controllers/main/admin/stack_and_upgrade_controller_test.js ---------------------------------------------------------------------- diff --git a/ambari-web/test/controllers/main/admin/stack_and_upgrade_controller_test.js b/ambari-web/test/controllers/main/admin/stack_and_upgrade_controller_test.js index 1b04b17..0ebaee8 100644 --- a/ambari-web/test/controllers/main/admin/stack_and_upgrade_controller_test.js +++ b/ambari-web/test/controllers/main/admin/stack_and_upgrade_controller_test.js @@ -113,9 +113,6 @@ describe('App.MainAdminStackAndUpgradeController', function() { describe("#load()", function() { beforeEach(function(){ - sinon.stub(controller, 'loadUpgradeData').returns({ - done: Em.clb - }); sinon.stub(controller, 'loadStackVersionsToModel').returns({ done: Em.clb }); @@ -137,15 +134,11 @@ describe('App.MainAdminStackAndUpgradeController', function() { controller.load(); }); afterEach(function(){ - controller.loadUpgradeData.restore(); controller.loadStackVersionsToModel.restore(); controller.loadRepoVersionsToModel.restore(); controller.loadCompatibleVersions.restore(); App.StackVersion.find.restore(); }); - it("loadUpgradeData called with valid arguments", function() { - expect(controller.loadUpgradeData.calledWith(true)).to.be.true; - }); it('loadStackVersionsToModel called with valid arguments', function () { expect(controller.loadStackVersionsToModel.calledWith(true)).to.be.true; }); @@ -1771,6 +1764,7 @@ describe('App.MainAdminStackAndUpgradeController', function() { upgrade_type: 'ROLLING', downgrade_allowed: true, skip_failures: true, + suspended: false, skip_service_check_failures: true, to_version: '1' } @@ -1811,11 +1805,12 @@ describe('App.MainAdminStackAndUpgradeController', function() { upgradeType: "ROLLING", isWizardRestricted: false, downgradeAllowed: true, + isSuspended: false, upgradeTypeDisplayName: Em.I18n.t('admin.stackVersions.version.upgrade.upgradeOptions.RU.title'), - failuresTolerance: Em.Object.create({ + failuresTolerance: { skipComponentFailures: true, skipSCFailures: true - }) + } }); }); it('models are saved', function () { @@ -1824,9 +1819,6 @@ describe('App.MainAdminStackAndUpgradeController', function() { it('initDBProperties is called', function () { expect(controller.initDBProperties.calledOnce).to.be.true; }); - it('loadUpgradeData called with valid arguments', function () { - expect(controller.loadUpgradeData.calledWith(true)).to.be.true; - }); }); describe("#getServiceCheckItemSuccessCallback()", function() { http://git-wip-us.apache.org/repos/asf/ambari/blob/eaf1fd5c/ambari-web/test/controllers/main_test.js ---------------------------------------------------------------------- diff --git a/ambari-web/test/controllers/main_test.js b/ambari-web/test/controllers/main_test.js index 4ab423e..8adb1fd 100644 --- a/ambari-web/test/controllers/main_test.js +++ b/ambari-web/test/controllers/main_test.js @@ -102,4 +102,37 @@ describe('App.MainController', function () { }); }); + describe('#startPolling', function() { + var mock, + updateController = Em.Object.create({ + startSubscriptions: sinon.spy(), + isWorking: false + }), + backgroundOperationsController = Em.Object.create({ + isWorking: false + }); + beforeEach(function() { + mock = sinon.stub(App.router, 'get'); + mock.withArgs('applicationController.isExistingClusterDataLoaded').returns(true); + mock.withArgs('updateController').returns(updateController); + mock.withArgs('backgroundOperationsController').returns(backgroundOperationsController); + mainController.startPolling(); + }); + afterEach(function() { + App.router.get.restore(); + }); + + it('updateController should be working', function() { + expect(updateController.get('isWorking')).to.be.true; + }); + + it('backgroundOperationsController should be working', function() { + expect(backgroundOperationsController.get('isWorking')).to.be.true; + }); + + it('startSubscriptions should be called', function() { + expect(updateController.startSubscriptions.called).to.be.true; + }); + }); + }); http://git-wip-us.apache.org/repos/asf/ambari/blob/eaf1fd5c/ambari-web/test/mappers/socket/upgrade_state_mapper_test.js ---------------------------------------------------------------------- diff --git a/ambari-web/test/mappers/socket/upgrade_state_mapper_test.js b/ambari-web/test/mappers/socket/upgrade_state_mapper_test.js new file mode 100644 index 0000000..322c04f --- /dev/null +++ b/ambari-web/test/mappers/socket/upgrade_state_mapper_test.js @@ -0,0 +1,80 @@ +/** + * 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/upgrade_state_mapper'); + +describe('App.upgradeStateMapper', function () { + + describe('#map', function() { + var mainAdminStackAndUpgradeController = Em.Object.create({ + restoreLastUpgrade: sinon.spy(), + setDBProperty: sinon.spy(), + upgradeId: 1 + }); + beforeEach(function() { + sinon.stub(App.router, 'get').returns(mainAdminStackAndUpgradeController) + }); + afterEach(function() { + App.router.get.restore(); + }); + + it('should call restoreLastUpgrade on CREATE event', function() { + var event = { + type: 'CREATE', + associated_version: "2.5.4.0-121", + cluster_id: 2, + direction: "DOWNGRADE", + downgrade_allowed: false, + end_time: -1, + progress_percent: 0, + request_id: 26, + request_status: "PENDING", + revert_allowed: false, + skip_failures: false, + skip_service_check_failures: false, + start_time: -1, + suspended: false, + upgrade_id: 56, + upgrade_type: "NON_ROLLING" + }; + App.upgradeStateMapper.map(event); + expect(mainAdminStackAndUpgradeController.restoreLastUpgrade.getCall(0).args[0]).to.be.eql({ + Upgrade: event + }); + }); + + it('should set upgrade state on UPDATE event', function() { + var event = { + end_time: -1, + progress_percent: 0, + request_id: 1, + request_status: "PENDING", + start_time: -1, + suspended: true, + type: "UPDATE" + }; + App.upgradeStateMapper.map(event); + expect(App.get('upgradeState')).to.be.equal('PENDING'); + expect(mainAdminStackAndUpgradeController.get('isSuspended')).to.be.true; + expect(mainAdminStackAndUpgradeController.setDBProperty.calledWith('upgradeState', 'PENDING')).to.be.true; + expect(mainAdminStackAndUpgradeController.setDBProperty.calledWith('isSuspended', true)).to.be.true; + }); + }); +});
