You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by al...@apache.org on 2015/04/10 20:06:53 UTC

ambari git commit: AMBARI-10333. The stop service confirmation dialog should show a warning if some other services depends on the one to be stopped (Di Li via alejandro)

Repository: ambari
Updated Branches:
  refs/heads/trunk 3133b1db4 -> 83df8c2a9


AMBARI-10333. The stop service confirmation dialog should show a warning if some other services depends on the one to be stopped (Di Li via alejandro)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/83df8c2a
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/83df8c2a
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/83df8c2a

Branch: refs/heads/trunk
Commit: 83df8c2a99ee2d68aa287d9a1db1dfd0cc423033
Parents: 3133b1d
Author: Alejandro Fernandez <af...@hortonworks.com>
Authored: Fri Apr 10 11:05:12 2015 -0700
Committer: Alejandro Fernandez <af...@hortonworks.com>
Committed: Fri Apr 10 11:05:12 2015 -0700

----------------------------------------------------------------------
 ambari-web/app/controllers/main/service/item.js | 50 ++++++++++++-
 ambari-web/app/messages.js                      |  3 +-
 .../test/controllers/main/service/item_test.js  | 76 ++++++++++++++++++++
 3 files changed, 127 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/83df8c2a/ambari-web/app/controllers/main/service/item.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/main/service/item.js b/ambari-web/app/controllers/main/service/item.js
index 8f817d2..4518efb 100644
--- a/ambari-web/app/controllers/main/service/item.js
+++ b/ambari-web/app/controllers/main/service/item.js
@@ -164,12 +164,16 @@ App.MainServiceItemController = Em.Controller.extend({
     var self = this;
     var serviceDisplayName = this.get('content.displayName');
     var isMaintenanceOFF = this.get('content.passiveState') === 'OFF';
+    
+    var msg = isMaintenanceOFF && serviceHealth == 'INSTALLED'? Em.I18n.t('services.service.stop.warningMsg.turnOnMM').format(serviceDisplayName) : null;
+    msg = self.addAdditionalWarningMessage(serviceHealth, msg, serviceDisplayName);
+    
     var bodyMessage = Em.Object.create({
       putInMaintenance: (serviceHealth == 'INSTALLED' && isMaintenanceOFF) || (serviceHealth == 'STARTED' && !isMaintenanceOFF),
       turnOnMmMsg: serviceHealth == 'INSTALLED' ? Em.I18n.t('passiveState.turnOnFor').format(serviceDisplayName) : Em.I18n.t('passiveState.turnOffFor').format(serviceDisplayName),
       confirmMsg: serviceHealth == 'INSTALLED'? Em.I18n.t('services.service.stop.confirmMsg').format(serviceDisplayName) : Em.I18n.t('services.service.start.confirmMsg').format(serviceDisplayName),
       confirmButton: serviceHealth == 'INSTALLED'? Em.I18n.t('services.service.stop.confirmButton') : Em.I18n.t('services.service.start.confirmButton'),
-      additionalWarningMsg:  isMaintenanceOFF && serviceHealth == 'INSTALLED'? Em.I18n.t('services.service.stop.warningMsg.turnOnMM').format(serviceDisplayName) : null
+      additionalWarningMsg:  msg
     });
 
     return App.showConfirmationFeedBackPopup(function(query, runMmOperation) {
@@ -178,6 +182,50 @@ App.MainServiceItemController = Em.Controller.extend({
     }, bodyMessage);
   },
 
+  addAdditionalWarningMessage: function(serviceHealth, msg, serviceDisplayName){
+    var servicesAffectedDisplayNames = [];
+    var servicesAffected = [];
+    
+    if(serviceHealth == 'INSTALLED'){
+      //To stop a service, display dependencies message...
+      var currentService = this.get('content.serviceName');
+      console.debug("Service to be stopped:", currentService);
+
+      var stackServices = App.StackService.find();
+      stackServices.forEach(function(service){
+        if(service.get('isInstalled') || service.get('isSelected')){ //only care about services installed...
+          var stackServiceDisplayName = service.get("displayName");
+          console.debug("Checking service dependencies for " + stackServiceDisplayName);
+          var requiredServices = service.get('requiredServices'); //services required in order to have the current service be functional...
+          if (!!requiredServices && requiredServices.length) { //only care about services with a non-empty requiredServices list.
+            console.debug("Service dependencies for " + stackServiceDisplayName, requiredServices);
+
+            requiredServices.forEach(function(_requiredService){
+              if (currentService === _requiredService) { //the service to be stopped is a required service by some other services...
+                console.debug(currentService + " is a service dependency for " + stackServiceDisplayName);
+                if(servicesAffected.indexOf(service) == -1 ) {
+                  servicesAffected.push(service);
+                  servicesAffectedDisplayNames.push(stackServiceDisplayName);
+                }
+              }
+            },this);
+          }
+        }
+      },this);
+      
+      var names = servicesAffectedDisplayNames.join();
+      if(names){
+        //only display this line with a non-empty dependency list
+        var dependenciesMsg = Em.I18n.t('services.service.stop.warningMsg.dependent.services').format(serviceDisplayName,names);
+        if(msg)
+          msg = msg + " " + dependenciesMsg;
+        else
+          msg = dependenciesMsg;
+      }
+    }
+    
+    return msg;
+  },
 
   startStopWithMmode: function(serviceHealth, query, runMmOperation) {
     var self = this;

http://git-wip-us.apache.org/repos/asf/ambari/blob/83df8c2a/ambari-web/app/messages.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/messages.js b/ambari-web/app/messages.js
index cc92d2d..4d7a811 100644
--- a/ambari-web/app/messages.js
+++ b/ambari-web/app/messages.js
@@ -1727,7 +1727,8 @@ Em.I18n.translations = {
   'services.service.stop.confirmMsg' : 'You are about to stop {0}',
   'services.service.stop.confirmButton': 'Confirm Stop',
   'services.service.start.confirmButton' : 'Confirm Start',
-  'services.service.stop.warningMsg.turnOnMM': 'This will generate alerts as the service is stopped. To suppress alerts, turn on Maintenance Mode for {0} prior to stopping',
+  'services.service.stop.warningMsg.turnOnMM': 'This will generate alerts as the service is stopped. To suppress alerts, turn on Maintenance Mode for {0} prior to stopping.',
+  'services.service.stop.warningMsg.dependent.services': 'Stopping {0} may impair the functioning of its dependent service(s): {1}.',
   'services.service.restartAll.confirmButton': 'Confirm Restart All',
   'services.service.restartAll.confirmMsg': 'You are about to restart {0}',
   'services.service.restartAll.warningMsg.turnOnMM': 'This will trigger alerts as the service is restarted. To suppress alerts, turn on Maintenance Mode for {0} prior to running restart all',

http://git-wip-us.apache.org/repos/asf/ambari/blob/83df8c2a/ambari-web/test/controllers/main/service/item_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/controllers/main/service/item_test.js b/ambari-web/test/controllers/main/service/item_test.js
index 7d57570..b6e969b 100644
--- a/ambari-web/test/controllers/main/service/item_test.js
+++ b/ambari-web/test/controllers/main/service/item_test.js
@@ -407,6 +407,46 @@ describe('App.MainServiceItemController', function () {
     });
 
     describe("modal messages", function() {
+      
+      beforeEach(function () {
+        sinon.stub(App.StackService, 'find').returns([
+          Em.Object.create({
+            serviceName: 'HDFS',
+            displayName: 'HDFS',
+            isInstalled: true,
+            isSelected: true,
+            requiredServices:["ZOOKEEPER"] 
+          }),
+          Em.Object.create({
+            serviceName: 'HIVE',
+            displayName: 'Hive',
+            isInstalled: true,
+            isSelected: true
+          }),
+          Em.Object.create({
+            serviceName: 'HBASE',
+            displayName: 'HBase',
+            isInstalled: true,
+            isSelected: true,
+            requiredServices:["HDFS", "ZOOKEEPER"]
+          }),
+          Em.Object.create({
+            serviceName: 'YARN',
+            displayName: 'YARN',
+            isInstalled: true,
+            isSelected: true,
+            requiredServices:["HDFS"]
+          }),
+          Em.Object.create({
+            serviceName: 'SPARK',
+            displayName: 'Spark',
+            isInstalled: true,
+            isSelected: true,
+            requiredServices:["HIVE"]
+          })
+        ]);
+      });
+      
       it ("should confirm stop if serviceHealth is INSTALLED", function() {
         mainServiceItemController.startStopPopup(event, "INSTALLED");
         expect(Em.I18n.t.calledWith('services.service.stop.confirmMsg')).to.be.ok;
@@ -418,6 +458,42 @@ describe('App.MainServiceItemController', function () {
         expect(Em.I18n.t.calledWith('services.service.start.confirmMsg')).to.be.ok;
         expect(Em.I18n.t.calledWith('services.service.start.confirmButton')).to.be.ok;
       });
+      
+      it ("should not display a dependent list if it is to start a service", function() {
+        var mainServiceItemController = App.MainServiceItemController.create(
+            {content: {serviceName: "HDFS", passiveState:'OFF'}});
+        mainServiceItemController.startStopPopup(event, "");
+        expect(Em.I18n.t.calledWith('services.service.stop.warningMsg.dependent.services')).to.not.be.ok;
+      });
+      
+      it ("should display dependent list if other services depend on the one to be stopped", function() {
+        var mainServiceItemController = App.MainServiceItemController.create(
+            {content: {serviceName: "HDFS", passiveState:'OFF'}});
+        mainServiceItemController.startStopPopup(event, "INSTALLED");
+        expect(Em.I18n.t.calledWith('services.service.stop.warningMsg.turnOnMM')).to.be.ok;
+        expect(Em.I18n.t.calledWith('services.service.stop.warningMsg.dependent.services')).to.be.ok;
+        
+        var dependencies = Em.I18n.t('services.service.stop.warningMsg.dependent.services').format("HDFS", "HBase,YARN")
+        var msg = Em.I18n.t('services.service.stop.warningMsg.turnOnMM').format("HDFS");
+        var fullMsg = mainServiceItemController.addAdditionalWarningMessage("INSTALLED", msg, "HDFS");
+        expect(fullMsg).to.be.equal(msg + " " + dependencies);
+      });
+
+      it ("should display the dependent service if another service depends on the one to be stopped", function() {
+        var mainServiceItemController = App.MainServiceItemController.create(
+            {content: {serviceName: "HIVE", passiveState:'OFF'}});
+        mainServiceItemController.startStopPopup(event, "INSTALLED");
+        expect(Em.I18n.t.calledWith('services.service.stop.warningMsg.dependent.services')).to.be.ok;
+        
+        var dependencies = Em.I18n.t('services.service.stop.warningMsg.dependent.services').format("HIVE", "Spark")
+        var msg = Em.I18n.t('services.service.stop.warningMsg.turnOnMM').format("HIVE");
+        var fullMsg = mainServiceItemController.addAdditionalWarningMessage("INSTALLED", msg, "HIVE");
+        expect(fullMsg).to.be.equal(msg + " " + dependencies);
+      });
+      
+      afterEach(function () {
+        App.StackService.find.restore();
+      });
     });
   });