Repository: ambari Updated Branches: refs/heads/trunk c67e883e6 -> 68147d53c
AMBARI-5506. Flume agents should have actions to stop/start each agent. (akovalenko) Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/68147d53 Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/68147d53 Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/68147d53 Branch: refs/heads/trunk Commit: 68147d53c7a08afc75f79e8f26b5f595ece444f4 Parents: c67e883 Author: Aleksandr Kovalenko <[email protected]> Authored: Fri Apr 18 15:31:56 2014 +0300 Committer: Aleksandr Kovalenko <[email protected]> Committed: Fri Apr 18 15:31:56 2014 +0300 ---------------------------------------------------------------------- .../controllers/main/service/info/summary.js | 68 +++++++++++++ ambari-web/app/messages.js | 4 + ambari-web/app/styles/application.less | 14 ++- .../app/templates/main/service/info/summary.hbs | 6 +- .../templates/main/service/services/flume.hbs | 102 +++++++++++-------- ambari-web/app/utils/ajax/ajax.js | 23 +++++ .../app/views/main/service/services/flume.js | 26 ++++- 7 files changed, 194 insertions(+), 49 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/68147d53/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 0fb5a01..08150cb 100644 --- a/ambari-web/app/controllers/main/service/info/summary.js +++ b/ambari-web/app/controllers/main/service/info/summary.js @@ -20,6 +20,74 @@ var App = require('app'); App.MainServiceInfoSummaryController = Em.Controller.extend({ name: 'mainServiceInfoSummaryController', + selectedFlumeAgent: null, + + /** + * Send start command for selected Flume Agent + * @method startFlumeAgent + */ + startFlumeAgent: function () { + var selectedFlumeAgent = this.get('selectedFlumeAgent'); + if (selectedFlumeAgent && selectedFlumeAgent.get('status') === 'INSTALLED') { + var self = this; + App.showConfirmationPopup(function () { + var command = 'START'; + var context = Em.I18n.t('services.service.summary.flume.start.context').format(selectedFlumeAgent.get('name')); + self.sendFlumeAgentCommandToServer(command, context, selectedFlumeAgent); + }); + } + }, + + /** + * Send stop command for selected Flume Agent + * @method stopFlumeAgent + */ + stopFlumeAgent: function () { + var selectedFlumeAgent = this.get('selectedFlumeAgent'); + if (selectedFlumeAgent && selectedFlumeAgent.get('status') === 'STARTED') { + var self = this; + App.showConfirmationPopup(function () { + var command = 'STOP'; + var context = Em.I18n.t('services.service.summary.flume.stop.context').format(selectedFlumeAgent.get('name')); + self.sendFlumeAgentCommandToServer(command, context, selectedFlumeAgent); + }); + } + }, + + /** + * Send command for Flume Agent to server + * @param {string} command + * @param {string} context + * @param {Object} agent + * @method sendFlumeAgentCommandToServer + */ + sendFlumeAgentCommandToServer: function (command, context, agent) { + App.ajax.send({ + name: 'service.flume.agent.command', + sender: this, + data: { + command: command, + context: context, + agentName: agent.get('name'), + host: agent.get('host.hostName') + }, + success: 'commandSuccessCallback' + }); + }, + + /** + * Callback, that shows Background operations popup if request was successful + */ + commandSuccessCallback: function () { + console.log('Send request for refresh configs successfully'); + // load data (if we need to show this background operations popup) from persist + App.router.get('applicationController').dataLoading().done(function (showPopup) { + if (showPopup) { + App.router.get('backgroundOperationsController').showPopup(); + } + }); + }, + nagiosUrl: function(){ return App.router.get('clusterController.nagiosUrl'); }.property('App.router.clusterController.nagiosUrl'), http://git-wip-us.apache.org/repos/asf/ambari/blob/68147d53/ambari-web/app/messages.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/messages.js b/ambari-web/app/messages.js index 6ef14fa..0d3fe77 100644 --- a/ambari-web/app/messages.js +++ b/ambari-web/app/messages.js @@ -1100,6 +1100,10 @@ Em.I18n.translations = { 'services.service.summary.storm.tasks': 'Tasks', 'services.service.summary.storm.nimbus.uptime': 'Nimbus uptime', 'services.service.summary.storm.topologies': 'Topologies', + 'services.service.summary.flume.startAgent': 'Start Agent', + 'services.service.summary.flume.stopAgent': 'Stop Agent', + 'services.service.summary.flume.stop.context': 'Stop Flume Agent {0}', + 'services.service.summary.flume.start.context': 'Start Flume Agent {0}', 'services.service.info.metrics.flume.channelFillPercent':'Channel Fill Percentage', 'services.service.info.metrics.flume.channelSize':'Channel Size', http://git-wip-us.apache.org/repos/asf/ambari/blob/68147d53/ambari-web/app/styles/application.less ---------------------------------------------------------------------- diff --git a/ambari-web/app/styles/application.less b/ambari-web/app/styles/application.less index 4b2445a..54cf714 100644 --- a/ambari-web/app/styles/application.less +++ b/ambari-web/app/styles/application.less @@ -6086,9 +6086,8 @@ i.icon-asterisks { #flume-summary { text-align:left !important; max-height: 490px; - overflow: scroll; #flume-agents-table { - margin-top: 7px; + margin: 0; width: 100%; .highlight { td, th { @@ -6129,4 +6128,15 @@ i.icon-asterisks { background: url( data:image/png;base64,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) no-repeat right 50%; } } + .flume-agents-actions { + margin: 0 5px 5px 0; + a { + text-decoration: none; + } + } + .scrollable-container { + max-height: 450px; + width: 100%; + overflow-y: scroll; + } } http://git-wip-us.apache.org/repos/asf/ambari/blob/68147d53/ambari-web/app/templates/main/service/info/summary.hbs ---------------------------------------------------------------------- diff --git a/ambari-web/app/templates/main/service/info/summary.hbs b/ambari-web/app/templates/main/service/info/summary.hbs index 23286e9..e488656 100644 --- a/ambari-web/app/templates/main/service/info/summary.hbs +++ b/ambari-web/app/templates/main/service/info/summary.hbs @@ -60,7 +60,11 @@ {{template "templates/main/service/info/summary/hue"}} {{/if}} {{#if view.serviceStatus.flume}} - {{view App.MainDashboardServiceFlumeView serviceBinding="view.service"}} + <tr> + <td> + {{view App.MainDashboardServiceFlumeView serviceBinding="view.service"}} + </td> + </tr> {{/if}} {{#if view.serviceStatus.falcon}} {{template "templates/main/service/info/summary/falcon"}} http://git-wip-us.apache.org/repos/asf/ambari/blob/68147d53/ambari-web/app/templates/main/service/services/flume.hbs ---------------------------------------------------------------------- diff --git a/ambari-web/app/templates/main/service/services/flume.hbs b/ambari-web/app/templates/main/service/services/flume.hbs index 6d1e363..ce904f2 100644 --- a/ambari-web/app/templates/main/service/services/flume.hbs +++ b/ambari-web/app/templates/main/service/services/flume.hbs @@ -17,49 +17,63 @@ }} <!-- Flume Agents --> -<tr> - <td> <div id="flume-summary"> - <a href="#" {{action filterHosts view.flumeHandlerComponent}}>{{view.summaryHeader}}</a> - <table class="table table-hover table-bordered table-striped" id="flume-agents-table"> - <thead> - {{#view view.sortView contentBinding="view.filteredContent" class="label-row"}} - {{view view.parentView.statusSort}} - {{view view.parentView.agentSort}} - {{view view.parentView.hostSort}} - {{view view.parentView.sourceSort}} - {{view view.parentView.channelSort}} - {{view view.parentView.sinkSort}} - <td></td> - {{/view}} - </thead> - <tbody> - {{#each agent in view.pageContent}} - <tr {{action showAgentInfo agent target="view"}}> - <td class="agent-status"> - <span {{bindAttr class="agent.healthClass"}}></span> - </td> - <td class="agent-name"> - {{agent.name}} - </td> - <td class="agent-host-name"> - {{agent.host.hostName}} - </td> - <td> - {{agent.sourcesCount}} - </td> - <td> - {{agent.channelsCount}} - </td> - <td> - {{agent.sinksCount}} - </td> - <td> - </td> - </tr> - {{/each}} - </tbody> - </table> + <a href="#" {{action filterHosts view.flumeHandlerComponent}}>{{view.summaryHeader}}</a> + <div class="btn-group display-inline-block flume-agents-actions pull-right"> + <a {{bindAttr class=":btn :dropdown-toggle view.isActionsDisabled:disabled"}} data-toggle="dropdown" href="javascript:void(null)">{{t common.actions}} + <span class="caret"></span> + </a> + <ul class="pull-left dropdown-menu"> + <li {{bindAttr class="view.isStartAgentDisabled:disabled"}}> + <a href="javascript:void(null)" + {{bindAttr class="view.isStartAgentDisabled:disabled"}} + {{action startFlumeAgent target="controller"}}> + {{t services.service.summary.flume.startAgent}}</a> + </li> + <li {{bindAttr class="view.isStopAgentDisabled:disabled"}}> + <a href="javascript:void(null)" + {{bindAttr class="view.isStopAgentDisabled:disabled"}} + {{action stopFlumeAgent target="controller"}}> + {{t services.service.summary.flume.stopAgent}}</a> + </li> + </ul> + </div> + <div class="scrollable-container"> + <table class="table table-hover table-bordered table-striped" id="flume-agents-table"> + <thead> + {{#view view.sortView contentBinding="view.filteredContent" class="label-row"}} + {{view view.parentView.statusSort}} + {{view view.parentView.agentSort}} + {{view view.parentView.hostSort}} + {{view view.parentView.sourceSort}} + {{view view.parentView.channelSort}} + {{view view.parentView.sinkSort}} + {{/view}} + </thead> + <tbody> + {{#each agent in view.pageContent}} + <tr {{action showAgentInfo agent target="view"}}> + <td class="agent-status"> + <span {{bindAttr class="agent.healthClass"}}></span> + </td> + <td class="agent-name"> + {{agent.name}} + </td> + <td class="agent-host-name"> + {{agent.host.hostName}} + </td> + <td> + {{agent.sourcesCount}} + </td> + <td> + {{agent.channelsCount}} + </td> + <td> + {{agent.sinksCount}} + </td> + </tr> + {{/each}} + </tbody> + </table> + </div> </div> - </td> -</tr> http://git-wip-us.apache.org/repos/asf/ambari/blob/68147d53/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 a35061c..f5af8c3 100644 --- a/ambari-web/app/utils/ajax/ajax.js +++ b/ambari-web/app/utils/ajax/ajax.js @@ -141,6 +141,29 @@ var urls = { 'real': '/clusters/{clusterName}/config_groups?ConfigGroup/tag={serviceName}&fields=*', 'mock': '/data/configurations/config_group.json' }, + 'service.flume.agent.command': { + 'real': '/clusters/{clusterName}/requests', + 'mock': '', + 'format': function (data) { + return { + type: 'POST', + data: JSON.stringify({ + "RequestInfo": { + "command": data.command, + "context": data.context, + "flume_handler": data.agentName + }, + "Requests/resource_filters": [ + { + "service_name": "FLUME", + "component_name": "FLUME_HANDLER", + "hosts": data.host + } + ] + }) + } + } + }, 'reassign.stop_services': { 'real': '/clusters/{clusterName}/services', 'mock': '', http://git-wip-us.apache.org/repos/asf/ambari/blob/68147d53/ambari-web/app/views/main/service/services/flume.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/views/main/service/services/flume.js b/ambari-web/app/views/main/service/services/flume.js index d869920..a42d074 100644 --- a/ambari-web/app/views/main/service/services/flume.js +++ b/ambari-web/app/views/main/service/services/flume.js @@ -24,6 +24,12 @@ App.MainDashboardServiceFlumeView = App.TableView.extend({ pagination: false, + isActionsDisabled: true, + + isStartAgentDisabled: true, + + isStopAgentDisabled: true, + content: function () { return this.get('service.agents'); }.property('service.agents.length'), @@ -82,8 +88,22 @@ App.MainDashboardServiceFlumeView = App.TableView.extend({ }), didInsertElement: function () { + this.set('controller.selectedFlumeAgent', null); this.filter(); }, + + /** + * Change classes for dropdown DOM elements after status change of selected agent + */ + setActionsDropdownClasses: function () { + var selectedFlumeAgent = this.get('controller.selectedFlumeAgent'); + this.set('isActionsDisabled', !selectedFlumeAgent); + if (selectedFlumeAgent) { + this.set('isStartAgentDisabled', selectedFlumeAgent.get('status') !== 'INSTALLED'); + this.set('isStopAgentDisabled', selectedFlumeAgent.get('status') !== 'STARTED'); + } + }.observes('controller.selectedFlumeAgent', 'controller.selectedFlumeAgent.status'), + /** * Action handler from flume tepmlate. * Highlight selected row and show metrics graphs of selected agent. @@ -91,9 +111,11 @@ App.MainDashboardServiceFlumeView = App.TableView.extend({ * @method showAgentInfo * @param {object} event */ - showAgentInfo: function(event){ + showAgentInfo: function (event) { + var agent = event.context; + this.set('controller.selectedFlumeAgent', agent); this.toggleHighlight($(event.currentTarget)); - this.get('parentView').setMetric(event.context); + this.get('parentView').setMetric(agent); }, /** * Highlight current row and remove highlight from previously selected item.
