AMBARI-8626. Remove unneeded ajax-calls and models for manage alert group.(xiwang)
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/1aff154a Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/1aff154a Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/1aff154a Branch: refs/heads/trunk Commit: 1aff154abe88c1c71ad07cb5c30eb1095f648a73 Parents: bd3aea5 Author: Xi Wang <[email protected]> Authored: Tue Dec 9 14:35:57 2014 -0800 Committer: Xi Wang <[email protected]> Committed: Wed Dec 10 12:59:08 2014 -0800 ---------------------------------------------------------------------- .../alerts/manage_alert_groups_controller.js | 260 ++++++++++--------- ambari-web/app/mappers/alert_groups_mapper.js | 6 +- ambari-web/app/models/alert_group.js | 64 +---- .../main/alerts/manage_alert_groups_popup.hbs | 4 +- ambari-web/app/utils/ajax/ajax.js | 5 - .../main/alerts/manage_alert_groups_view.js | 2 - 6 files changed, 156 insertions(+), 185 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/1aff154a/ambari-web/app/controllers/main/alerts/manage_alert_groups_controller.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/controllers/main/alerts/manage_alert_groups_controller.js b/ambari-web/app/controllers/main/alerts/manage_alert_groups_controller.js index fca6800..6d273cf 100644 --- a/ambari-web/app/controllers/main/alerts/manage_alert_groups_controller.js +++ b/ambari-web/app/controllers/main/alerts/manage_alert_groups_controller.js @@ -34,138 +34,119 @@ App.ManageAlertGroupsController = Em.Controller.extend({ selectedDefinitions: [], - alertDefinitions: [], - - alertNotifications: [], - - // load alert definitions for all services - loadAlertDefinitions: function () { - App.ajax.send({ - name: 'alerts.load_all_alert_definitions', - sender: this, - success: 'onLoadAlertDefinitionsSuccess', - error: 'onLoadAlertDefinitionsError' - }); - }, - - onLoadAlertDefinitionsSuccess: function (data) { - var alertDefinitions = []; - if (data && data.items) { - data.items.forEach( function(def) { - if (def && def.AlertDefinition) { - alertDefinitions.pushObject (Em.Object.create({ - name: def.AlertDefinition.name, - serviceName: def.AlertDefinition.service_name, - serviceNameDisplay:function() { - return App.format.role(this.get('serviceName')); - }.property('serviceName'), - componentName: def.AlertDefinition.component_name, - componentNameDisplay: function() { - return App.format.role(this.get('componentName')); - }.property('componentName'), - label: def.AlertDefinition.label, - id: def.AlertDefinition.id - })); - } + /** + * List of all Alert Notifications + * @type {App.AlertNotification[]} + */ + alertNotifications: function () { + return this.get('isLoaded') ? App.AlertNotification.find().map (function (target) { + return Em.Object.create ({ + name: target.get('name'), + id: target.get('id'), + description: target.get('description'), + type: target.get('type'), + global: target.get('global') }); - } - this.set('alertDefinitions', alertDefinitions); - }, + }) : []; + }.property('isLoaded'), - onLoadAlertDefinitionsError: function () { - console.error('Unable to load all alert definitions.'); - }, + /** + * List of all global Alert Notifications + * @type {App.AlertNotification[]} + */ + alertGlobalNotifications: function () { + return this.get('alertNotifications').filterProperty('global'); + }.property('alertNotifications'), - // load all alert notifications + /** + * Load all Alert Notifications from server + * @returns {$.ajax|null} + */ loadAlertNotifications: function () { - App.ajax.send({ - name: 'alerts.load_alert_notification', - sender: this, - success: 'onLoadAlertNotificationsSuccess', - error: 'onLoadAlertNotificationsError' - }); - }, - - onLoadAlertNotificationsSuccess: function (data) { - var alertNotifications = []; - if (data && data.items) { - data.items.forEach( function(target) { - if (target && target.AlertTarget) { - alertNotifications.pushObject (Em.Object.create({ - name: target.AlertTarget.name, - type: target.AlertTarget.notification_type, - description: target.AlertTarget.description, - global: target.AlertTarget.global, - id: target.AlertTarget.id - })); - } - }); - } - this.set('alertNotifications', alertNotifications); - this.set('alertGlobalNotifications', alertNotifications.filterProperty('global')); - }, - - onLoadAlertNotificationsError: function () { - console.error('Unable to load all alert notifications.'); - }, - - loadAlertGroups: function () { this.set('isLoaded', false); this.set('alertGroups', []); this.set('originalAlertGroups', []); + this.set('selectedAlertGroup', null); this.set('isRemoveButtonDisabled', true); this.set('isRenameButtonDisabled', true); this.set('isDuplicateButtonDisabled', true); - App.ajax.send({ - name: 'alerts.load_alert_groups', + return App.ajax.send({ + name: 'alerts.notifications', sender: this, - success: 'onLoadAlertGroupsSuccess', - error: 'onLoadAlertGroupsError' + success: 'getAlertNotificationsSuccessCallback', + error: 'getAlertNotificationsErrorCallback' }); }, - onLoadAlertGroupsSuccess: function (data) { - var self = this; - if (data && data.items) { - this.set('alertGroupsCount', data.items.length); - data.items.forEach(function(alert_group) { - App.ajax.send({ - name: 'alerts.load_an_alert_group', - sender: self, - data: { - "group_id": alert_group.AlertGroup.id - }, - success: 'onLoadAlertGroupSuccess', - error: 'onLoadAlertGroupError' - }); - }, this); - } + /** + * Success-callback for load alert notifications request + * @param {object} json + * @method getAlertNotificationsSuccessCallback + */ + getAlertNotificationsSuccessCallback: function (json) { + App.alertNotificationMapper.map(json); + this.loadAlertGroups(); }, - onLoadAlertGroupSuccess: function (data) { - var alertGroups = this.get('alertGroups'); - if (data && data.AlertGroup) { - alertGroups.pushObject (App.AlertGroupComplex.create({ - name: data.AlertGroup.name, - default: data.AlertGroup.default, - id: data.AlertGroup.id, - definitions: data.AlertGroup.definitions, - notifications: data.AlertGroup.targets - })); - } - if (this.get('alertGroupsCount') == alertGroups.length) { - this.set('isLoaded', true); - this.set('originalAlertGroups', this.copyAlertGroups(alertGroups)); - this.set('selectedAlertGroup', alertGroups[0]) - } + /** + * Error-callback for load alert notifications request + * @method getAlertNotificationsErrorCallback + */ + getAlertNotificationsErrorCallback: function () { + this.set('isLoaded', true); }, + /** + * Load all alert groups from alert group model + */ + loadAlertGroups: function () { + var alertGroups = App.AlertGroup.find().map(function (group) { + var definitions = group.get('definitions').map (function (def) { + return Em.Object.create ({ + name: def.get('name'), + serviceName: def.get('serviceName'), + componentName: def.get('componentName'), + serviceNameDisplay: def.get('service.displayName'), + componentNameDisplay: def.get('componentNameFormatted'), + label: def.get('label'), + id: def.get('id') + }); + }); + + var targets = group.get('targets').map (function (target) { + return Em.Object.create ({ + name: target.get('name'), + id: target.get('id'), + description: target.get('description'), + type: target.get('type'), + global: target.get('global') + }); + }); - onLoadAlertGroupsError: function () { - console.error('Unable to load all alert groups.'); - }, - onLoadAlertGroupError: function () { - console.error('Unable to load an alert group.'); + return Em.Object.create({ + id: group.get('id'), + name: group.get('name'), + default: group.get('default'), + displayName: function () { + var name = this.get('name'); + if (name && name.length > App.config.CONFIG_GROUP_NAME_MAX_LENGTH) { + var middle = Math.floor(App.config.CONFIG_GROUP_NAME_MAX_LENGTH / 2); + name = name.substring(0, middle) + "..." + name.substring(name.length - middle); + } + return this.get('default') ? (name + ' Default') : name; + }.property('name', 'default'), + label: function () { + return this.get('displayName') + ' (' + this.get('definitions.length') + ')'; + }.property('displayName', 'definitions.length'), + definitions: definitions, + isAddDefinitionsDisabled: group.get('isAddDefinitionsDisabled'), + notifications: targets + }); + }); + this.set('alertGroups', alertGroups); + this.set('isLoaded', true); + this.set('originalAlertGroups', this.copyAlertGroups(this.get('alertGroups'))); + this.set('selectedAlertGroup', this.get('alertGroups')[0]); }, /** @@ -205,7 +186,6 @@ App.ManageAlertGroupsController = Em.Controller.extend({ alertGroups.removeObject(defaultGroup); }); var sorted = defaultGroups.sortProperty('name').concat(alertGroups.sortProperty('name')); - // var sorted = alertGroups.sortProperty('name'); this.removeObserver('[email protected]', this, 'resortAlertGroup'); this.set('alertGroups', sorted); @@ -235,13 +215,44 @@ App.ManageAlertGroupsController = Em.Controller.extend({ }.property('selectedAlertGroup', 'selectedAlertGroup.definitions.length', 'selectedDefinitions.length'), /** + * Provides alert definitions which are available for inclusion in + * non-default alert groups. + */ + getAvailableDefinitions: function (selectedAlertGroup) { + if (selectedAlertGroup.get('default')) return []; + var usedDefinitionsMap = {}; + var availableDefinitions = []; + var sharedDefinitions = App.AlertDefinition.getAllDefinitions(); + + selectedAlertGroup.get('definitions').forEach(function (def) { + usedDefinitionsMap[def.name] = true; + }); + sharedDefinitions.forEach(function (shared_def) { + if (!usedDefinitionsMap[shared_def.get('name')]) { + availableDefinitions.pushObject(shared_def); + } + }); + return availableDefinitions.map (function (def) { + return Em.Object.create ({ + name: def.get('name'), + serviceName: def.get('serviceName'), + componentName: def.get('componentName'), + serviceNameDisplay: def.get('service.displayName'), + componentNameDisplay: def.get('componentNameFormatted'), + label: def.get('label'), + id: def.get('id') + }); + }); + }, + + /** * add alert definitions to a group */ addDefinitions: function () { if (this.get('selectedAlertGroup.isAddDefinitionsDisabled')){ return false; } - var availableDefinitions = this.get('selectedAlertGroup.availableDefinitions'); + var availableDefinitions = this.getAvailableDefinitions(this.get('selectedAlertGroup')); var popupDescription = { header: Em.I18n.t('alerts.actions.manage_alert_groups_popup.selectDefsDialog.title'), dialogMessage: Em.I18n.t('alerts.actions.manage_alert_groups_popup.selectDefsDialog.message').format(this.get('selectedAlertGroup.displayName')) @@ -461,7 +472,7 @@ App.ManageAlertGroupsController = Em.Controller.extend({ copyAlertGroups: function (originGroups) { var alertGroups = []; originGroups.forEach(function (alertGroup) { - var copiedGroup = App.AlertGroupComplex.create($.extend(true, {}, alertGroup)); + var copiedGroup = Em.Object.create($.extend(true, {}, alertGroup)); alertGroups.pushObject(copiedGroup); }); return alertGroups; @@ -667,10 +678,23 @@ App.ManageAlertGroupsController = Em.Controller.extend({ return !(this.get('alertGroupName').trim().length > 0 && !this.get('warningMessage')); }.property('warningMessage', 'alertGroupName'), onPrimary: function () { - var newAlertGroup = App.AlertGroupComplex.create({ + var newAlertGroup = Em.Object.create({ name: this.get('alertGroupName').trim(), + default: false, + displayName: function () { + var name = this.get('name'); + if (name && name.length > App.config.CONFIG_GROUP_NAME_MAX_LENGTH) { + var middle = Math.floor(App.config.CONFIG_GROUP_NAME_MAX_LENGTH / 2); + name = name.substring(0, middle) + "..." + name.substring(name.length - middle); + } + return this.get('default') ? (name + ' Default') : name; + }.property('name', 'default'), + label: function () { + return this.get('displayName') + ' (' + this.get('definitions.length') + ')'; + }.property('displayName', 'definitions.length'), definitions: [], - notifications: self.get('alertGlobalNotifications') + notifications: self.get('alertGlobalNotifications'), + isAddDefinitionsDisabled: false }); self.get('alertGroups').pushObject(newAlertGroup); self.set('selectedAlertGroup', newAlertGroup); http://git-wip-us.apache.org/repos/asf/ambari/blob/1aff154a/ambari-web/app/mappers/alert_groups_mapper.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/mappers/alert_groups_mapper.js b/ambari-web/app/mappers/alert_groups_mapper.js index 0060a15..a1b33f5 100644 --- a/ambari-web/app/mappers/alert_groups_mapper.js +++ b/ambari-web/app/mappers/alert_groups_mapper.js @@ -80,9 +80,10 @@ App.alertGroupsMapper = App.QuickDataMapper.create({ Em.keys(typesMap).forEach(function(k) { group[typesMap[k]] = []; }); + group.targets = []; if (item.AlertGroup.definitions) { item.AlertGroup.definitions.forEach(function(definition) { - var type = typesMap[definition.source_type]; + var type = typesMap[definition.source_type]; if (!group[type].contains(definition.id)) { group[type].push(definition.id); } @@ -94,6 +95,9 @@ App.alertGroupsMapper = App.QuickDataMapper.create({ } if (item.AlertGroup.targets) { item.AlertGroup.targets.forEach(function(target) { + if (!group.targets.contains(target.id)) { + group.targets.push(target.id); + } if (Em.isNone(alertNotificationsGroupsMap[target.id])) { alertNotificationsGroupsMap[target.id] = []; } http://git-wip-us.apache.org/repos/asf/ambari/blob/1aff154a/ambari-web/app/models/alert_group.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/models/alert_group.js b/ambari-web/app/models/alert_group.js index 6ffe263..15e88b2 100644 --- a/ambari-web/app/models/alert_group.js +++ b/ambari-web/app/models/alert_group.js @@ -79,7 +79,10 @@ App.AlertGroup = DS.Model.extend({ */ scriptAlertDefinitions: DS.hasMany('App.ScriptAlertDefinition'), - targets: [], + /** + * @type {App.AlertNotification[]} + */ + targets: DS.hasMany('App.AlertNotification'), /** * @type {string} @@ -98,65 +101,12 @@ App.AlertGroup = DS.Model.extend({ */ displayNameDefinitions: function () { return this.get('displayName') + ' (' + this.get('definitions.length') + ')'; - }.property('displayName', 'definitions.length') -}); -App.AlertGroup.FIXTURES = []; - -App.AlertGroupComplex = Ember.Object.extend({ - id: null, - name: null, - default: null, - definitions: [], - targets: [], - - /** - * all alert definitions that belong to all services - */ - alertDefinitionsBinding: 'App.router.manageAlertGroupsController.alertDefinitions', - /** - * all alert notifications - */ - alertNotificationsBinding: 'App.router.manageAlertGroupsController.alertNotifications', - - - displayName: function () { - var name = this.get('name'); - if (name && name.length > App.config.CONFIG_GROUP_NAME_MAX_LENGTH) { - var middle = Math.floor(App.config.CONFIG_GROUP_NAME_MAX_LENGTH / 2); - name = name.substring(0, middle) + "..." + name.substring(name.length - middle); - } - return this.get('default') ? (name + ' Default') : name; - }.property('name', 'default'), - - displayNameDefinitions: function () { - return this.get('displayName') + ' (' + this.get('definitions.length') + ')'; }.property('displayName', 'definitions.length'), - /** - * Provides alert definitions which are available for inclusion in - * non-default alert groups. - */ - availableDefinitions: function () { - if (this.get('default')) return []; - var usedDefinitionsMap = {}; - var availableDefinitions = []; - var sharedDefinitions = this.get('alertDefinitions'); - - this.get('definitions').forEach(function (def) { - usedDefinitionsMap[def.name] = true; - }); - sharedDefinitions.forEach(function (shared_def) { - if (!usedDefinitionsMap[shared_def.get('name')]) { - availableDefinitions.pushObject(shared_def); - } - }); - return availableDefinitions; - }.property('alertDefinitions', 'definitions.@each', 'definitions.length'), - isAddDefinitionsDisabled: function () { - return (this.get('default') || this.get('availableDefinitions.length') === 0); - }.property('availableDefinitions.length') - + return this.get('default'); + }.property('default') }); +App.AlertGroup.FIXTURES = []; http://git-wip-us.apache.org/repos/asf/ambari/blob/1aff154a/ambari-web/app/templates/main/alerts/manage_alert_groups_popup.hbs ---------------------------------------------------------------------- diff --git a/ambari-web/app/templates/main/alerts/manage_alert_groups_popup.hbs b/ambari-web/app/templates/main/alerts/manage_alert_groups_popup.hbs index 15cf3b1..2d7366a 100644 --- a/ambari-web/app/templates/main/alerts/manage_alert_groups_popup.hbs +++ b/ambari-web/app/templates/main/alerts/manage_alert_groups_popup.hbs @@ -24,7 +24,7 @@ <span> </span> {{view Em.Select contentBinding="alertGroups" - optionLabelPath="content.displayNameDefinitions" + optionLabelPath="content.label" selectionBinding="view.selectedAlertGroup" multiple="multiple" class="group-select select-group-box" @@ -73,7 +73,7 @@ </div> <div class="row-fluid notification-editable-list"> <div class="span11"> - {{view App.EditableList itemsBinding="selectedAlertGroup.notifications" resourcesBinding="selectedAlertGroup.alertNotifications" nameBinding="selectedAlertGroup.displayName"}} + {{view App.EditableList itemsBinding="selectedAlertGroup.notifications" resourcesBinding="controller.alertNotifications" nameBinding="selectedAlertGroup.displayName"}} </div> </div> http://git-wip-us.apache.org/repos/asf/ambari/blob/1aff154a/ambari-web/app/utils/ajax/ajax.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/utils/ajax/ajax.js b/ambari-web/app/utils/ajax/ajax.js index 7aa5fbd..11f1f74 100644 --- a/ambari-web/app/utils/ajax/ajax.js +++ b/ambari-web/app/utils/ajax/ajax.js @@ -304,11 +304,6 @@ var urls = { 'real': '/clusters/{clusterName}/request_schedules/{request_schedule_id}', 'type': 'DELETE' }, - - 'alerts.load_alert_notification': { - 'real': '/alert_targets?fields=*', - 'mock': 'data/alerts/alertNotifications.json' - }, 'alerts.load_alert_groups': { 'real': '/clusters/{clusterName}/alert_groups?fields=*', 'mock': 'data/alerts/alertGroups.json' http://git-wip-us.apache.org/repos/asf/ambari/blob/1aff154a/ambari-web/app/views/main/alerts/manage_alert_groups_view.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/views/main/alerts/manage_alert_groups_view.js b/ambari-web/app/views/main/alerts/manage_alert_groups_view.js index ab62b9c..42e6859 100644 --- a/ambari-web/app/views/main/alerts/manage_alert_groups_view.js +++ b/ambari-web/app/views/main/alerts/manage_alert_groups_view.js @@ -67,8 +67,6 @@ App.MainAlertsManageAlertGroupView = Em.View.extend({ * @method willInsertElement */ willInsertElement: function() { - this.get('controller').loadAlertGroups(); - this.get('controller').loadAlertDefinitions(); this.get('controller').loadAlertNotifications(); },
