浏览代码

AMBARI-6351 Remove synchronous calls with commands to server. (Max Shepel via atkach)

atkach 11 年之前
父节点
当前提交
087e00b4ae

+ 3 - 2
ambari-web/app/controllers/main/host/add_controller.js

@@ -394,7 +394,8 @@ App.AddHostController = App.WizardController.extend({
    * send request to server in order to install services
    * @param isRetry
    */
-  installServices: function (isRetry) {
+  installServices: function (isRetry, callback) {
+    callback = callback || Em.K;
     this.set('content.cluster.oldRequestsId', []);
     var clusterName = this.get('content.cluster.name');
     var hostNames = [];
@@ -426,7 +427,7 @@ App.AddHostController = App.WizardController.extend({
       },
       success: 'installServicesSuccessCallback',
       error: 'installServicesErrorCallback'
-    });
+    }).then(callback, callback);
     return true;
   }
 });

+ 38 - 27
ambari-web/app/controllers/main/host/details.js

@@ -266,9 +266,11 @@ App.MainHostDetailsController = Em.Controller.extend({
         return Em.I18n.t('hosts.host.deleteComponent.popup.msg1').format(displayName);
       }.property(),
       onPrimary: function () {
-        self._doDeleteHostComponent(component);
-        self.set('redrawComponents', true);
-        this.hide();
+        var popup = this;
+        self._doDeleteHostComponent(component, function () {
+          self.set('redrawComponents', true);
+          popup.hide();
+        });
       }
     });
   },
@@ -288,7 +290,8 @@ App.MainHostDetailsController = Em.Controller.extend({
    *          when components failed to get deleted.
    * @method _doDeleteHostComponent
    */
-  _doDeleteHostComponent: function (component) {
+  _doDeleteHostComponent: function (component, callback) {
+    callback = callback || Em.K;
     App.ajax.send({
       name: (Em.isNone(component)) ? 'host.host_components.delete' : 'host.host_component.delete',
       sender: this,
@@ -298,8 +301,7 @@ App.MainHostDetailsController = Em.Controller.extend({
       },
       success: '_doDeleteHostComponentSuccessCallback',
       error: '_doDeleteHostComponentErrorCallback'
-    });
-    return this.get('_deletedHostComponentResult');
+    }).then(callback, callback);
   },
 
   /**
@@ -323,11 +325,11 @@ App.MainHostDetailsController = Em.Controller.extend({
    * @param {object} errorThrown
    * @method _doDeleteHostComponentErrorCallback
    */
-  _doDeleteHostComponentErrorCallback: function (xhr, textStatus, errorThrown) {
+  _doDeleteHostComponentErrorCallback: function (xhr, textStatus, errorThrown, data) {
     console.log('Error deleting host component');
     console.log(textStatus);
     console.log(errorThrown);
-    this.set('_deletedHostComponentResult', {xhr: xhr, url: url, method: 'DELETE'});
+    this.set('_deletedHostComponentResult', {xhr: xhr, url: data.url, method: 'DELETE'});
   },
 
   /**
@@ -1491,28 +1493,37 @@ App.MainHostDetailsController = Em.Controller.extend({
         self.set('fromDeleteHost', true);
         var allComponents = self.get('content.hostComponents');
         var deleteError = null;
-        allComponents.forEach(function (component) {
+        var dfd = $.Deferred();
+        var popup = this;
+        allComponents.forEach(function (component, index) {
+          var length = allComponents.get('length');
           if (!deleteError) {
-            deleteError = self._doDeleteHostComponent(component);
+            self._doDeleteHostComponent(component, function () {
+              deleteError = self.get('_deletedHostComponentResult');
+              if (index == length - 1) {
+                dfd.resolve();
+              }
+            });
+          }
+        });
+        dfd.done(function () {
+          if (!deleteError) {
+            App.ajax.send({
+              name: 'host.delete',
+              sender: popup,
+              data: {
+                hostName: self.get('content.hostName')
+              },
+              success: 'deleteHostSuccessCallback',
+              error: 'deleteHostErrorCallback'
+            });
+          }
+          else {
+            popup.hide();
+            deleteError.xhr.responseText = "{\"message\": \"" + deleteError.xhr.statusText + "\"}";
+            App.ajax.defaultErrorHandler(deleteError.xhr, deleteError.url, deleteError.method, deleteError.xhr.status);
           }
         });
-        if (!deleteError) {
-          App.ajax.send({
-            name: 'host.delete',
-            sender: this,
-            data: {
-              hostName: self.get('content.hostName')
-            },
-            success: 'deleteHostSuccessCallback',
-            error: 'deleteHostErrorCallback'
-          });
-
-        }
-        else {
-          this.hide();
-          deleteError.xhr.responseText = "{\"message\": \"" + deleteError.xhr.statusText + "\"}";
-          App.ajax.defaultErrorHandler(deleteError.xhr, deleteError.url, deleteError.method, deleteError.xhr.status);
-        }
       },
       deleteHostSuccessCallback: function (data) {
         var dialogSelf = this;

+ 35 - 24
ambari-web/app/controllers/main/service/add_controller.js

@@ -377,33 +377,22 @@ App.AddServiceController = App.WizardController.extend({
     App.router.get('updateController').updateAll();
   },
 
-  installServices: function (isRetry) {
+  installServices: function (isRetry, callback) {
     this.set('content.cluster.oldRequestsId', []);
-    var clusterName = this.get('content.cluster.name');
-    var data;
-    var name;
     this.installAdditionalClients();
     if (isRetry) {
-      this.getFailedHostComponents();
-      console.log('failedHostComponents', this.get('failedHostComponents'));
-      name = 'wizard.install_services.installer_controller.is_retry';
-      data = {
-        "RequestInfo": {
-          "context" : Em.I18n.t('requestInfo.installComponents'),
-          "query": "HostRoles/component_name.in(" + this.get('failedHostComponents').join(',') + ")"
-        },
-        "Body": {
-          "HostRoles": {
-            "state": "INSTALLED"
-          }
-        }
-      };
-      data = JSON.stringify(data);
+      this.getFailedHostComponents(callback);
     }
     else {
-      name = 'wizard.install_services.installer_controller.not_is_retry';
-      data = '{"RequestInfo": {"context" :"' + Em.I18n.t('requestInfo.installServices') + '"}, "Body": {"ServiceInfo": {"state": "INSTALLED"}}}';
+      var clusterName = this.get('content.cluster.name');
+      var name = 'wizard.install_services.installer_controller.not_is_retry';
+      var data = '{"RequestInfo": {"context" :"' + Em.I18n.t('requestInfo.installServices') + '"}, "Body": {"ServiceInfo": {"state": "INSTALLED"}}}';
+      this.installServicesRequest(clusterName, name, data, callback);
     }
+  },
+
+  installServicesRequest: function (clusterName, name, data, callback) {
+    callback = callback || Em.K;
     App.ajax.send({
       name: name,
       sender: this,
@@ -413,7 +402,7 @@ App.AddServiceController = App.WizardController.extend({
       },
       success: 'installServicesSuccessCallback',
       error: 'installServicesErrorCallback'
-    });
+    }).then(callback, callback);
   },
 
   /**
@@ -449,13 +438,14 @@ App.AddServiceController = App.WizardController.extend({
    */
   failedHostComponents: [],
 
-  getFailedHostComponents: function() {
+  getFailedHostComponents: function(callback) {
+    callback = this.sendInstallServicesRequest(callback);
     App.ajax.send({
       name: 'wizard.install_services.add_service_controller.get_failed_host_components',
       sender: this,
       success: 'getFailedHostComponentsSuccessCallback',
       error: 'getFailedHostComponentsErrorCallback'
-    });
+    }).then(callback, callback);
   },
 
   /**
@@ -476,6 +466,27 @@ App.AddServiceController = App.WizardController.extend({
 
   getFailedHostComponentsErrorCallback: function(request, ajaxOptions, error) {
     console.warn(error);
+  },
+
+  sendInstallServicesRequest: function (callback) {
+    var name;
+    var data;
+    var clusterName = this.get('content.cluster.name');
+    console.log('failedHostComponents', this.get('failedHostComponents'));
+    name = 'wizard.install_services.installer_controller.is_retry';
+    data = {
+      "RequestInfo": {
+        "context" : Em.I18n.t('requestInfo.installComponents'),
+        "query": "HostRoles/component_name.in(" + this.get('failedHostComponents').join(',') + ")"
+      },
+      "Body": {
+        "HostRoles": {
+          "state": "INSTALLED"
+        }
+      }
+    };
+    data = JSON.stringify(data);
+    this.installServicesRequest(clusterName, name, data, callback);
   }
 
 });

+ 3 - 3
ambari-web/app/controllers/wizard.js

@@ -311,14 +311,14 @@ App.WizardController = Em.Controller.extend(App.LocalStorage, {
    * Invoke installation of selected services to the server and saves the request id returned by the server.
    * @param isRetry
    */
-  installServices: function (isRetry) {
-
+  installServices: function (isRetry, callback) {
     // clear requests since we are installing services
     // and we don't want to get tasks for previous install attempts
     this.set('content.cluster.oldRequestsId', []);
     var clusterName = this.get('content.cluster.name');
     var data;
     var name;
+    callback = callback || Em.K;
     if (isRetry) {
       name = 'wizard.install_services.installer_controller.is_retry';
       data = '{"RequestInfo": {"context" :"' + Em.I18n.t('requestInfo.installComponents') + '"}, "Body": {"HostRoles": {"state": "INSTALLED"}}}';
@@ -337,7 +337,7 @@ App.WizardController = Em.Controller.extend(App.LocalStorage, {
       },
       success: 'installServicesSuccessCallback',
       error: 'installServicesErrorCallback'
-    });
+    }).then(callback, callback);
   },
 
   installServicesSuccessCallback: function (jsonData) {

+ 37 - 26
ambari-web/app/controllers/wizard/step8_controller.js

@@ -883,30 +883,12 @@ App.WizardStep8Controller = Em.Controller.extend({
     // delete any existing clusters to start from a clean slate
     // before creating a new cluster in install wizard
     // TODO: modify for multi-cluster support
-    if (this.get('content.controllerName') == 'installerController' && (!App.get('testMode'))) {
-      this.deleteClusters(this.getExistingClusterNames());
-    }
-    if (this.get('wizardController').getDBProperty('configsToUpdate')) {
-      this.updateConfigurations(this.get('wizardController').getDBProperty('configsToUpdate'));
-    }
-    this.setLocalRepositories();
-    this.createCluster();
-    this.createSelectedServices();
-    if (this.get('content.controllerName') !== 'addHostController') {
-      this.createConfigurations();
-      this.applyConfigurationsToCluster();
-    }
-    this.createComponents();
-    this.registerHostsToCluster();
-    if (App.get('supports.hostOverridesInstaller')) {
-      this.createConfigurationGroups();
+    var clusterNames = this.getExistingClusterNames();
+    if (this.get('content.controllerName') == 'installerController' && (!App.get('testMode')) && clusterNames.length) {
+      this.deleteClusters(clusterNames);
+    } else {
+      this.deleteClustersSuccessCallback(null, null, {isLast: true});
     }
-    this.createMasterHostComponents();
-    this.createSlaveAndClientsHostComponents();
-    this.createAdditionalHostComponents();
-
-    this.set('ajaxQueueLength', this.get('ajaxRequestsQueue.queue.length'));
-    this.get('ajaxRequestsQueue').start();
   },
 
   /**
@@ -954,18 +936,47 @@ App.WizardStep8Controller = Em.Controller.extend({
    * @method deleteClusters
    */
   deleteClusters: function (clusterNames) {
-    clusterNames.forEach(function (clusterName) {
+    clusterNames.forEach(function (clusterName, index) {
       App.ajax.send({
         name: 'wizard.step8.delete_cluster',
         sender: this,
         data: {
-          name: clusterName
-        }
+          name: clusterName,
+          isLast: index == clusterNames.length - 1
+        },
+        success: 'deleteClustersCallback',
+        error: 'deleteClustersCallback'
       });
     }, this);
 
   },
 
+  deleteClustersCallback: function (response, request, data) {
+    if (data.isLast) {
+      if (this.get('wizardController').getDBProperty('configsToUpdate')) {
+        this.updateConfigurations(this.get('wizardController').getDBProperty('configsToUpdate'));
+      }
+      this.setLocalRepositories();
+      this.createCluster();
+      this.createSelectedServices();
+      if (this.get('content.controllerName') !== 'addHostController') {
+        this.createConfigurations();
+        this.applyConfigurationsToCluster();
+      }
+      this.createComponents();
+      this.registerHostsToCluster();
+      if (App.get('supports.hostOverridesInstaller')) {
+        this.createConfigurationGroups();
+      }
+      this.createMasterHostComponents();
+      this.createSlaveAndClientsHostComponents();
+      this.createAdditionalHostComponents();
+
+      this.set('ajaxQueueLength', this.get('ajaxRequestsQueue.queue.length'));
+      this.get('ajaxRequestsQueue').start();
+    }
+  },
+
   /**
    * Updates local repositories for the Ambari server.
    * @method setLocalRepositories

+ 65 - 40
ambari-web/app/controllers/wizard/step9_controller.js

@@ -167,6 +167,39 @@ App.WizardStep9Controller = Em.Controller.extend({
    */
   currentOpenTaskRequestId: 0,
 
+  /**
+   * True if stage transition is completed.
+   * On true, polling will be stopped.
+   * @type {bool}s
+   */
+  parseHostInfo: false,
+
+  isPolling: true,
+
+  changeParseHostInfo: function (value) {
+    this.set('parseHostInfo', value);
+    this.parseHostInfoPolling();
+  },
+
+  parseHostInfoPolling: function () {
+    var self = this;
+    var result = this.get('parseHostInfo');
+    if (!this.get('isPolling')) {
+      if (this.get('content.cluster.status') === 'INSTALL FAILED') {
+        this.isAllComponentsInstalled();
+      }
+      return;
+    }
+    if (result !== true) {
+      window.setTimeout(function () {
+        if (self.get('currentOpenTaskId')) {
+          self.loadCurrentTaskLog();
+        }
+        self.doPolling();
+      }, this.get('POLL_INTERVAL'));
+    }
+  },
+
   /**
    * Observer function: Updates {status} field of the controller.
    * @method updateStatus
@@ -425,11 +458,11 @@ App.WizardStep9Controller = Em.Controller.extend({
    * @return {$.ajax|null}
    * @method launchStartServices
    */
-  launchStartServices: function () {
+  launchStartServices: function (callback) {
     var data = {};
     var name = '';
     var servicesList = [];
-
+    callback = callback || Em.K;
     if (this.get('content.controllerName') === 'addHostController') {
       name = 'wizard.step9.add_host.launch_start_services';
       var hostnames = [];
@@ -484,7 +517,7 @@ App.WizardStep9Controller = Em.Controller.extend({
       },
       success: 'launchStartServicesSuccessCallback',
       error: 'launchStartServicesErrorCallback'
-    });
+    }).then(callback, callback);
   },
 
   /**
@@ -736,20 +769,22 @@ App.WizardStep9Controller = Em.Controller.extend({
    * INSTALLED -> STARTED
    * INSTALLED -> START_FAILED
    * @param polledData json data retrieved from API
-   * @returns {bool} true if polling should stop; false otherwise
-   * @method finishState
+   * @method setFinishState
    */
-  finishState: function (polledData) {
+  setFinishState: function (polledData) {
     if (this.get('content.cluster.status') === 'INSTALLED') {
-      return this.isServicesStarted(polledData);
+      this.changeParseHostInfo(this.isServicesStarted(polledData));
+      return;
     } else if (this.get('content.cluster.status') === 'PENDING') {
-      return this.isServicesInstalled(polledData);
+      this.setIsServicesInstalled(polledData);
+      return;
     } else if (this.get('content.cluster.status') === 'INSTALL FAILED' || this.get('content.cluster.status') === 'START FAILED'
       || this.get('content.cluster.status') === 'STARTED') {
       this.set('progress', '100');
-      return true;
+      this.changeParseHostInfo(true);
+      return;
     }
-    return false;
+    this.changeParseHostInfo(true);
   },
 
   /**
@@ -782,11 +817,10 @@ App.WizardStep9Controller = Em.Controller.extend({
   },
 
   /**
-   * @param polledData Josn data retrieved from API
-   * @returns {bool} Has "Install All Services" request completed successfully
-   * @method isServicesInstalled
+   * @param polledData Json data retrieved from API
+   * @method setIsServicesInstalled
    */
-  isServicesInstalled: function (polledData) {
+  setIsServicesInstalled: function (polledData) {
     var clusterStatus = {};
     if (!polledData.someProperty('Tasks.status', 'PENDING') && !polledData.someProperty('Tasks.status', 'QUEUED') && !polledData.someProperty('Tasks.status', 'IN_PROGRESS')) {
       clusterStatus = {
@@ -806,14 +840,20 @@ App.WizardStep9Controller = Em.Controller.extend({
         this.set('progress', '34');
         if (this.get('content.controllerName') === 'installerController') {
           this.isAllComponentsInstalled();
+          this.saveInstalledHosts(this);
+          this.changeParseHostInfo(true);
+          return;
         } else {
-          this.launchStartServices();
+          var self = this;
+          this.launchStartServices(function () {
+            self.saveInstalledHosts(self);
+            self.changeParseHostInfo(true);
+          });
+          return;
         }
       }
-      this.saveInstalledHosts(this);
-      return true;
     }
-    return false;
+    this.changeParseHostInfo(false);
   },
 
   /**
@@ -839,11 +879,9 @@ App.WizardStep9Controller = Em.Controller.extend({
   /**
    * Parses the Json data retrieved from API and sets the task on the host of {hosts} array binded to template
    * @param polledData Json data retrieved from API
-   * @returns {bool} True if stage transition is completed.
-   * On true, polling will be stopped.
-   * @method parseHostInfo
+   * @method setParseHostInfo
    */
-  parseHostInfo: function (polledData) {
+  setParseHostInfo: function (polledData) {
     console.log('TRACE: Entering host info function');
     var self = this;
     var totalProgress = 0;
@@ -856,7 +894,8 @@ App.WizardStep9Controller = Em.Controller.extend({
       // determine the current install status.
       // Also, we don't want to keep polling if it is not the
       // current requestId.
-      return false;
+      this.changeParseHostInfo(false);
+      return;
     }
     this.replacePolledData(tasksData);
     var tasksHostMap = {};
@@ -898,7 +937,7 @@ App.WizardStep9Controller = Em.Controller.extend({
     totalProgress = Math.floor(totalProgress / this.get('hosts.length'));
     this.set('progress', totalProgress.toString());
     console.log("INFO: right now the progress is: " + this.get('progress'));
-    return this.finishState(tasksData);
+    this.setFinishState(tasksData);
   },
 
   /**
@@ -1010,25 +1049,11 @@ App.WizardStep9Controller = Em.Controller.extend({
    * @method getLogsByRequestSuccessCallback
    */
   getLogsByRequestSuccessCallback: function (data, opt, params) {
-    var self = this;
     var parsedData = jQuery.parseJSON(data);
     console.log("TRACE: In success function for the GET logs data");
     console.log("TRACE: Step9 -> The value is: ", parsedData);
-    var result = this.parseHostInfo(parsedData);
-    if (!params.polling) {
-      if (this.get('content.cluster.status') === 'INSTALL FAILED') {
-        this.isAllComponentsInstalled();
-      }
-      return;
-    }
-    if (result !== true) {
-      window.setTimeout(function () {
-        if (self.get('currentOpenTaskId')) {
-          self.loadCurrentTaskLog();
-        }
-        self.doPolling();
-      }, this.get('POLL_INTERVAL'));
-    }
+    this.set('isPolling', params.polling);
+    this.setParseHostInfo(parsedData);
   },
 
   /**

+ 16 - 12
ambari-web/app/routes/add_host_routes.js

@@ -264,12 +264,13 @@ module.exports = App.WizardRoute.extend({
       if(App.supports.hostOverrides){
         addHostController.applyConfigGroup();
       }
-      addHostController.installServices();
-      addHostController.setInfoForStep9();
-      // We need to do recovery based on whether we are in Add Host or Installer wizard
-      addHostController.saveClusterState('ADD_HOSTS_INSTALLING_3');
-      wizardStep8Controller.set('servicesInstalled', true);
-      router.transitionTo('step6');
+      addHostController.installServices(false, function () {
+        addHostController.setInfoForStep9();
+        // We need to do recovery based on whether we are in Add Host or Installer wizard
+        addHostController.saveClusterState('ADD_HOSTS_INSTALLING_3');
+        wizardStep8Controller.set('servicesInstalled', true);
+        router.transitionTo('step6');
+      });
     }
   }),
 
@@ -297,13 +298,16 @@ module.exports = App.WizardRoute.extend({
       if (wizardStep9Controller.get('showRetry')) {
         if (wizardStep9Controller.get('content.cluster.status') === 'INSTALL FAILED') {
           var isRetry = true;
-          addHostController.installServices(isRetry);
-          addHostController.setInfoForStep9();
-          wizardStep9Controller.resetHostsForRetry();
-          // We need to do recovery based on whether we are in Add Host or Installer wizard
-          addHostController.saveClusterState('ADD_HOSTS_INSTALLING_3');
+          addHostController.installServices(isRetry, function () {
+            addHostController.setInfoForStep9();
+            wizardStep9Controller.resetHostsForRetry();
+            // We need to do recovery based on whether we are in Add Host or Installer wizard
+            addHostController.saveClusterState('ADD_HOSTS_INSTALLING_3');
+            wizardStep9Controller.navigateStep();
+          });
+        } else {
+          wizardStep9Controller.navigateStep();
         }
-        wizardStep9Controller.navigateStep();
       }
     },
     unroutePath: function() {

+ 15 - 11
ambari-web/app/routes/add_service_routes.js

@@ -249,12 +249,13 @@ module.exports = App.WizardRoute.extend({
     next: function (router) {
       var addServiceController = router.get('addServiceController');
       var wizardStep8Controller = router.get('wizardStep8Controller');
-      addServiceController.installServices();
-      addServiceController.setInfoForStep9();
+      addServiceController.installServices(false, function () {
+        addServiceController.setInfoForStep9();
 
-      addServiceController.saveClusterState('ADD_SERVICES_INSTALLING_3');
-      wizardStep8Controller.set('servicesInstalled', true);
-      router.transitionTo('step6');
+        addServiceController.saveClusterState('ADD_SERVICES_INSTALLING_3');
+        wizardStep8Controller.set('servicesInstalled', true);
+        router.transitionTo('step6');
+      });
     }
   }),
 
@@ -281,13 +282,16 @@ module.exports = App.WizardRoute.extend({
       if (wizardStep9Controller.get('showRetry')) {
         if (wizardStep9Controller.get('content.cluster.status') === 'INSTALL FAILED') {
           var isRetry = true;
-          addServiceController.installServices(isRetry);
-          addServiceController.setInfoForStep9();
-          wizardStep9Controller.resetHostsForRetry();
-          // We need to do recovery based on whether we are in Add Host or Installer wizard
-          addServiceController.saveClusterState('ADD_SERVICES_INSTALLING_3');
+          addServiceController.installServices(isRetry, function () {
+            addServiceController.setInfoForStep9();
+            wizardStep9Controller.resetHostsForRetry();
+            // We need to do recovery based on whether we are in Add Host or Installer wizard
+            addServiceController.saveClusterState('ADD_SERVICES_INSTALLING_3');
+            wizardStep9Controller.navigateStep();
+          });
+        } else {
+          wizardStep9Controller.navigateStep();
         }
-        wizardStep9Controller.navigateStep();
       }
     },
     unroutePath: function() {

+ 16 - 12
ambari-web/app/routes/installer.js

@@ -338,12 +338,13 @@ module.exports = Em.Route.extend({
       var installerController = router.get('installerController');
       var wizardStep8Controller = router.get('wizardStep8Controller');
       // invoke API call to install selected services
-      installerController.installServices();
-      installerController.setInfoForStep9();
-      // We need to do recovery based on whether we are in Add Host or Installer wizard
-      installerController.saveClusterState('CLUSTER_INSTALLING_3');
-      wizardStep8Controller.set('servicesInstalled', true);
-      router.transitionTo('step9');
+      installerController.installServices(false, function () {
+        installerController.setInfoForStep9();
+        // We need to do recovery based on whether we are in Add Host or Installer wizard
+        installerController.saveClusterState('CLUSTER_INSTALLING_3');
+        wizardStep8Controller.set('servicesInstalled', true);
+        router.transitionTo('step9');
+      });
     }
   }),
 
@@ -368,13 +369,16 @@ module.exports = Em.Route.extend({
       if (wizardStep9Controller.get('showRetry')) {
         if (wizardStep9Controller.get('content.cluster.status') === 'INSTALL FAILED') {
           var isRetry = true;
-          installerController.installServices(isRetry);
-          installerController.setInfoForStep9();
-          wizardStep9Controller.resetHostsForRetry();
-          // We need to do recovery based on whether we are in Add Host or Installer wizard
-          installerController.saveClusterState('CLUSTER_INSTALLING_3');
+          installerController.installServices(isRetry, function () {
+            installerController.setInfoForStep9();
+            wizardStep9Controller.resetHostsForRetry();
+            // We need to do recovery based on whether we are in Add Host or Installer wizard
+            installerController.saveClusterState('CLUSTER_INSTALLING_3');
+            wizardStep9Controller.navigateStep();
+          });
+        } else {
+          wizardStep9Controller.navigateStep();
         }
-        wizardStep9Controller.navigateStep();
       }
     },
     unroutePath: function () {

+ 4 - 21
ambari-web/app/utils/ajax/ajax.js

@@ -375,8 +375,7 @@ var urls = {
     'mock': '',
     'format': function() {
       return {
-        type: 'DELETE',
-        async: false
+        type: 'DELETE'
       }
     }
   },
@@ -386,8 +385,7 @@ var urls = {
     'mock': '',
     'format': function() {
       return {
-        type: 'DELETE',
-        async: false
+        type: 'DELETE'
       }
     }
   },
@@ -409,7 +407,6 @@ var urls = {
     'format': function(data) {
       return {
         type: 'PUT',
-        async: false,
         data: data.data
       }
     }
@@ -584,12 +581,7 @@ var urls = {
   'host.delete': {
     'real': '/clusters/{clusterName}/hosts/{hostName}',
     'mock': '',
-    'type': 'DELETE',
-    'format': function() {
-      return {
-        async: false
-      }
-    }
+    'type': 'DELETE'
   },
   'hosts.metrics': {
     'real': '/clusters/{clusterName}/hosts?fields={metricName}',
@@ -1189,7 +1181,6 @@ var urls = {
     'format': function (data) {
       return {
         type: 'PUT',
-        async: false,
         data: data.data
       };
     }
@@ -1200,7 +1191,6 @@ var urls = {
     'format': function (data) {
       return {
         type: 'PUT',
-        async: false,
         data: data.data
       };
     }
@@ -1269,7 +1259,6 @@ var urls = {
     'format': function(data) {
       return {
         type: 'PUT',
-        async: false,
         data: data.data
       };
     }
@@ -1280,7 +1269,6 @@ var urls = {
     'type': 'PUT',
     'format': function (data) {
       return {
-        async: false,
         data: data.data
       };
     }
@@ -1291,7 +1279,6 @@ var urls = {
     'type': 'PUT',
     'format': function (data) {
       return {
-        async: false,
         data: data.data
       };
     }
@@ -1330,7 +1317,6 @@ var urls = {
     'format': function (data) {
       var d = {
         type: 'PUT',
-        async: false,
         data: data.data
       };
       if (App.testMode) {
@@ -1345,7 +1331,6 @@ var urls = {
     'format': function (data) {
       var d = {
         type: 'PUT',
-        async: false,
         data: data.data
       };
       if (App.testMode) {
@@ -1360,7 +1345,6 @@ var urls = {
     'format': function (data) {
       return {
         type: 'PUT',
-        async: false,
         data: data.data
       };
     }
@@ -1382,8 +1366,7 @@ var urls = {
     'mock': '',
     'format': function() {
       return {
-        type: 'DELETE',
-        async: false
+        type: 'DELETE'
       };
     }
   },