You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by nc...@apache.org on 2016/01/21 20:21:00 UTC

[01/22] ambari git commit: AMBARI-14724. Provide option to +Add Oozie Server in Service Actions menu (akovalenko)

Repository: ambari
Updated Branches:
  refs/heads/branch-dev-patch-upgrade fc402ebc5 -> abc961a13


AMBARI-14724. Provide option to +Add Oozie Server in Service Actions menu (akovalenko)


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

Branch: refs/heads/branch-dev-patch-upgrade
Commit: 8b7aa920bb7d34361e4b2ee2059c547fe01ca238
Parents: a7a9796
Author: Aleksandr Kovalenko <ak...@hortonworks.com>
Authored: Tue Jan 19 18:34:08 2016 +0200
Committer: Aleksandr Kovalenko <ak...@hortonworks.com>
Committed: Wed Jan 20 19:00:23 2016 +0200

----------------------------------------------------------------------
 ambari-web/app/controllers/main/service/item.js | 176 +++++++++++--------
 .../app/mixins/common/configs/configs_saver.js  |   4 +
 ambari-web/app/views/main/service/item.js       | 120 +++++++------
 ambari-web/test/views/main/service/item_test.js |  16 +-
 4 files changed, 184 insertions(+), 132 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/8b7aa920/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 2c1d4cc..59559eb 100644
--- a/ambari-web/app/controllers/main/service/item.js
+++ b/ambari-web/app/controllers/main/service/item.js
@@ -45,6 +45,20 @@ App.MainServiceItemController = Em.Controller.extend(App.SupportClientConfigsDow
   },
 
   /**
+   * Map of service names and lists of sites they need to load
+   */
+  serviceConfigsMap: {
+    'OOZIE': ['oozie-env']
+  },
+
+  /**
+   * Configs loaded to use for service actions menu
+   *
+   * format: {config-type: {property-name1: property-value1, property-name2: property-value2, ...}}
+   */
+  configs: {},
+
+  /**
    * @type {boolean}
    * @default true
    */
@@ -56,42 +70,11 @@ App.MainServiceItemController = Em.Controller.extend(App.SupportClientConfigsDow
    */
   isServicesInfoLoaded: false,
 
-  initHosts: function() {
-    if (App.get('components.masters').length !== 0) {
-      ['HBASE_MASTER', 'HIVE_METASTORE', 'ZOOKEEPER_SERVER', 'FLUME_HANDLER', 'HIVE_SERVER', 'RANGER_KMS_SERVER', 'NIMBUS'].forEach(function(componentName) {
-        this.loadHostsWithoutComponent(componentName);
-      }, this);
-    }
-  }.observes('App.components.masters', 'content.hostComponents.length'),
-
-  loadHostsWithoutComponent: function (componentName) {
-    var self = this;
-    var hostsWithComponent = App.HostComponent.find().filterProperty('componentName', componentName).mapProperty('hostName');
-
-    var hostsWithoutComponent = App.get('allHostNames').filter(function(hostName) {
-      return !hostsWithComponent.contains(hostName);
-    });
-
-    self.set('add' + componentName, function() {
-      App.get('router.mainAdminKerberosController').getKDCSessionState(function() {
-        self.addComponent(componentName);
-      });
-    });
-
-    Em.defineProperty(self, 'addDisabledTooltip-' + componentName, Em.computed('isAddDisabled-' + componentName, 'addDisabledMsg-' + componentName, function() {
-      if (self.get('isAddDisabled-' + componentName)) {
-        return self.get('addDisabledMsg-' + componentName);
-      }
-    }));
-
-    Em.defineProperty(self, 'isAddDisabled-' + componentName, Em.computed('hostsWithoutComponent-' + componentName, function() {
-      return self.get('hostsWithoutComponent-' + componentName).length === 0 ? 'disabled' : '';
-    }));
-
-    var disabledMsg = Em.I18n.t('services.summary.allHostsAlreadyRunComponent').format(componentName);
-    self.set('hostsWithoutComponent-' + componentName, hostsWithoutComponent);
-    self.set('addDisabledMsg-' + componentName, disabledMsg);
-  },
+  /**
+   * Define whether configs for service actions menu were loaded
+   * @type {Boolean}
+   */
+  isServiceConfigsLoaded: false,
 
   /**
    * flag to control router switch between service summary and configs
@@ -123,6 +106,48 @@ App.MainServiceItemController = Em.Controller.extend(App.SupportClientConfigsDow
   }.property('content.serviceName'),
 
   /**
+   * Load all config tags for loading configs
+   */
+  loadConfigs: function(){
+    if (this.get('serviceConfigsMap')[this.get('content.serviceName')]) {
+      this.set('isServiceConfigsLoaded', false);
+      App.ajax.send({
+        name: 'config.tags',
+        sender: this,
+        success: 'onLoadConfigsTags',
+        error: 'onTaskError'
+      });
+    } else {
+      this.set('isServiceConfigsLoaded', true);
+    }
+  },
+
+  /**
+   * Load all configs for sites from <code>serviceConfigsMap</code> for current service
+   * @param data
+   */
+  onLoadConfigsTags: function (data) {
+    var self = this;
+    var sitesToLoad = this.get('serviceConfigsMap')[this.get('content.serviceName')];
+    var loadedSites = data.Clusters.desired_configs;
+    var siteTagsToLoad = [];
+    for (var site in loadedSites) {
+      if (sitesToLoad.contains(site)) {
+        siteTagsToLoad.push({
+          siteName: site,
+          tagName: loadedSites[site].tag
+        });
+      }
+    }
+    App.router.get('configurationController').getConfigsByTags(siteTagsToLoad).done(function (configs) {
+      configs.forEach(function (site) {
+        self.get('configs')[site.type] = site.properties;
+      });
+      self.set('isServiceConfigsLoaded', true);
+    });
+  },
+
+  /**
    * Common method for ajax (start/stop service) responses
    * @param data
    * @param ajaxOptions
@@ -779,60 +804,59 @@ App.MainServiceItemController = Em.Controller.extend(App.SupportClientConfigsDow
     var component = App.StackServiceComponent.find().findProperty('componentName', componentName);
     var componentDisplayName = component.get('displayName');
 
-    self.loadHostsWithoutComponent(componentName);
+    App.get('router.mainAdminKerberosController').getKDCSessionState(function () {
+      return App.ModalPopup.show({
+        primary: Em.computed.ifThenElse('anyHostsWithoutComponent', Em.I18n.t('hosts.host.addComponent.popup.confirm'), undefined),
 
-    return App.ModalPopup.show({
-      primary: Em.computed.ifThenElse('anyHostsWithoutComponent', Em.I18n.t('hosts.host.addComponent.popup.confirm'), undefined),
+        header: Em.I18n.t('popup.confirmation.commonHeader'),
 
-      header: Em.I18n.t('popup.confirmation.commonHeader'),
+        addComponentMsg: Em.I18n.t('hosts.host.addComponent.msg').format(componentDisplayName),
 
-      addComponentMsg: Em.I18n.t('hosts.host.addComponent.msg').format(componentDisplayName),
+        selectHostMsg: Em.computed.i18nFormat('services.summary.selectHostForComponent', 'componentDisplayName'),
 
-      selectHostMsg: Em.computed.i18nFormat('services.summary.selectHostForComponent', 'componentDisplayName'),
+        thereIsNoHostsMsg: Em.computed.i18nFormat('services.summary.allHostsAlreadyRunComponent', 'componentDisplayName'),
 
-      thereIsNoHostsMsg: Em.computed.i18nFormat('services.summary.allHostsAlreadyRunComponent', 'componentDisplayName'),
+        hostsWithoutComponent: function () {
+          var hostsWithComponent = App.HostComponent.find().filterProperty('componentName', componentName).mapProperty('hostName');
+          var result = App.get('allHostNames');
 
-      hostsWithoutComponent: function() {
-        return self.get("hostsWithoutComponent-" + this.get('componentName'));
-      }.property('componentName', 'self.hostsWithoutComponent-' + this.get('componentName')),
+          hostsWithComponent.forEach(function (host) {
+            result = result.without(host);
+          });
 
-      anyHostsWithoutComponent: Em.computed.gt('hostsWithoutComponent.length', 0),
+          return result;
+        }.property(),
 
-      selectedHost: null,
+        anyHostsWithoutComponent: Em.computed.gt('hostsWithoutComponent.length', 0),
 
-      componentName: componentName,
+        selectedHost: null,
 
-      componentDisplayName: componentDisplayName,
+        componentName: componentName,
 
-      bodyClass: Em.View.extend({
-        templateName: require('templates/main/service/add_host_popup')
-      }),
+        componentDisplayName: componentDisplayName,
 
-      onPrimary: function () {
-        var selectedHost = this.get('selectedHost');
-
-        // Install
-        if(['HIVE_METASTORE', 'RANGER_KMS_SERVER', 'NIMBUS'].contains(component.get('componentName')) && !!selectedHost){
-          App.router.get('mainHostDetailsController').addComponentWithCheck(
-            {
-              context: component,
-              selectedHost: selectedHost
-            }
-          );
-        } else {
-          self.installHostComponentCall(selectedHost, component);
-        }
+        bodyClass: Em.View.extend({
+          templateName: require('templates/main/service/add_host_popup')
+        }),
 
-        // Remove host from 'without' collection to immediate recalculate add menu item state
-        var hostsWithoutComponent = this.get('hostsWithoutComponent');
-        var index = hostsWithoutComponent.indexOf(this.get('selectedHost'));
-        if (index > -1) {
-          hostsWithoutComponent.splice(index, 1);
-        }
+        onPrimary: function () {
+          var selectedHost = this.get('selectedHost');
 
-        self.set('hostsWithoutComponent-' + this.get('componentName'), hostsWithoutComponent);
-        this.hide();
-      }
+          // Install
+          if (['HIVE_METASTORE', 'RANGER_KMS_SERVER', 'NIMBUS'].contains(component.get('componentName')) && !!selectedHost) {
+            App.router.get('mainHostDetailsController').addComponentWithCheck(
+                {
+                  context: component,
+                  selectedHost: selectedHost
+                }
+            );
+          } else {
+            self.installHostComponentCall(selectedHost, component);
+          }
+
+          this.hide();
+        }
+      });
     });
   },
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/8b7aa920/ambari-web/app/mixins/common/configs/configs_saver.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/mixins/common/configs/configs_saver.js b/ambari-web/app/mixins/common/configs/configs_saver.js
index 383e4d0..d2b2623 100644
--- a/ambari-web/app/mixins/common/configs/configs_saver.js
+++ b/ambari-web/app/mixins/common/configs/configs_saver.js
@@ -619,6 +619,10 @@ App.ConfigsSaverMixin = Em.Mixin.create({
       App.QuickViewLinks.proto().set('content', currentService);
       App.QuickViewLinks.proto().loadTags();
     }
+
+    //  update configs for service actions
+    App.router.get('mainServiceItemController').loadConfigs();
+
     this.showSaveConfigsPopup(header, flag, message, messageClass, value, status, urlParams);
     this.clearAllRecommendations();
   },

http://git-wip-us.apache.org/repos/asf/ambari/blob/8b7aa920/ambari-web/app/views/main/service/item.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/main/service/item.js b/ambari-web/app/views/main/service/item.js
index cb9782c..659a0a5 100644
--- a/ambari-web/app/views/main/service/item.js
+++ b/ambari-web/app/views/main/service/item.js
@@ -41,52 +41,58 @@ App.MainServiceItemView = Em.View.extend({
 
    addActionMap: function() {
      return [
-      {
-        cssClass: 'icon-plus',
-        'label': '{0} {1}'.format(Em.I18n.t('add'), Em.I18n.t('dashboard.services.hbase.masterServer')),
-        service: 'HBASE',
-        component: 'HBASE_MASTER'
-      },
-      {
-       cssClass: 'icon-plus',
-       'label': '{0} {1}'.format(Em.I18n.t('add'), Em.I18n.t('dashboard.services.hive.metastore')),
-       service: 'HIVE',
-       component: 'HIVE_METASTORE',
-       isHidden: !App.get('isHadoop22Stack')
-      },
-      {
-       cssClass: 'icon-plus',
-       'label': '{0} {1}'.format(Em.I18n.t('add'), Em.I18n.t('dashboard.services.hive.server2')),
-       service: 'HIVE',
-       component: 'HIVE_SERVER',
-       isHidden: !App.get('isHadoop22Stack')
-      },
-      {
-        cssClass: 'icon-plus',
-        'label': '{0} {1}'.format(Em.I18n.t('add'), Em.I18n.t('dashboard.services.zookeeper.server')),
-        service: 'ZOOKEEPER',
-        component: 'ZOOKEEPER_SERVER'
-      },
-      {
-        cssClass: 'icon-plus',
-        'label': '{0} {1}'.format(Em.I18n.t('add'), Em.I18n.t('dashboard.services.flume.agentLabel')),
-        service: 'FLUME',
-        component: 'FLUME_HANDLER'
-      },
-      {
-        cssClass: 'icon-plus',
-        'label': '{0} {1}'.format(Em.I18n.t('add'), App.format.role('RANGER_KMS_SERVER')),
-        service: 'RANGER_KMS',
-        component: 'RANGER_KMS_SERVER'
-      },
-      {
-        cssClass: 'icon-plus',
-        'label': '{0} {1}'.format(Em.I18n.t('add'), App.format.role('NIMBUS')),
-        service: 'STORM',
-        component: 'NIMBUS'
-      }
-    ]
-  },
+       {
+         cssClass: 'icon-plus',
+         'label': '{0} {1}'.format(Em.I18n.t('add'), Em.I18n.t('dashboard.services.hbase.masterServer')),
+         service: 'HBASE',
+         component: 'HBASE_MASTER'
+       },
+       {
+         cssClass: 'icon-plus',
+         'label': '{0} {1}'.format(Em.I18n.t('add'), Em.I18n.t('dashboard.services.hive.metastore')),
+         service: 'HIVE',
+         component: 'HIVE_METASTORE',
+         isHidden: !App.get('isHadoop22Stack')
+       },
+       {
+         cssClass: 'icon-plus',
+         'label': '{0} {1}'.format(Em.I18n.t('add'), Em.I18n.t('dashboard.services.hive.server2')),
+         service: 'HIVE',
+         component: 'HIVE_SERVER',
+         isHidden: !App.get('isHadoop22Stack')
+       },
+       {
+         cssClass: 'icon-plus',
+         'label': '{0} {1}'.format(Em.I18n.t('add'), Em.I18n.t('dashboard.services.zookeeper.server')),
+         service: 'ZOOKEEPER',
+         component: 'ZOOKEEPER_SERVER'
+       },
+       {
+         cssClass: 'icon-plus',
+         'label': '{0} {1}'.format(Em.I18n.t('add'), Em.I18n.t('dashboard.services.flume.agentLabel')),
+         service: 'FLUME',
+         component: 'FLUME_HANDLER'
+       },
+       {
+         cssClass: 'icon-plus',
+         'label': '{0} {1}'.format(Em.I18n.t('add'), App.format.role('RANGER_KMS_SERVER')),
+         service: 'RANGER_KMS',
+         component: 'RANGER_KMS_SERVER'
+       },
+       {
+         cssClass: 'icon-plus',
+         'label': '{0} {1}'.format(Em.I18n.t('add'), App.format.role('NIMBUS')),
+         service: 'STORM',
+         component: 'NIMBUS'
+       },
+       {
+         cssClass: 'icon-plus',
+         'label': '{0} {1}'.format(Em.I18n.t('add'), App.format.role('OOZIE_SERVER')),
+         service: 'OOZIE',
+         component: 'OOZIE_SERVER'
+       }
+     ]
+   },
   /**
    * Create option for MOVE_COMPONENT or ROLLING_RESTART task.
    *
@@ -103,7 +109,7 @@ App.MainServiceItemView = Em.View.extend({
   isMaintenanceSet: false,
 
   observeMaintenance: function() {
-    if (!this.get('isMaintenanceSet') && this.get('controller.isServicesInfoLoaded')) {
+    if (!this.get('isMaintenanceSet') && this.get('controller.isServicesInfoLoaded') && this.get('controller.isServiceConfigsLoaded')) {
       this.observeMaintenanceOnce();
     }
     Em.run.once(this, 'clearIsMaintenanceSet');
@@ -200,15 +206,24 @@ App.MainServiceItemView = Em.View.extend({
               component: hawqMasterComponent.get('componentName'),
               command: customCommandToStopCluster
             }
-          }))
+          }));
         }
       }
 
       self.addActionMap().filterProperty('service', serviceName).forEach(function(item) {
         if (App.get('components.addableToHost').contains(item.component)) {
-          item.action = 'add' + item.component;
-          item.disabled = self.get('controller.isAddDisabled-' + item.component);
-          item.tooltip = self.get('controller.addDisabledTooltip' + item.component);
+
+          var isEnabled = App.HostComponent.find().filterProperty('componentName', item.component).length < App.get('allHostNames.length');
+
+          if (item.component === 'OOZIE_SERVER') {
+            isEnabled = isEnabled && !(Em.isEmpty(self.get('controller.configs.oozie-env.oozie_database')) || self.get('controller.configs.oozie-env.oozie_database') === 'New Derby Database');
+          }
+
+          item.action = 'addComponent';
+          item.disabled = isEnabled ? '' : 'disabled';
+          item.tooltip = isEnabled ? '' : Em.I18n.t('services.summary.allHostsAlreadyRunComponent').format(item.component);
+          item.context = item.component;
+
           options.push(item);
         }
       });
@@ -282,10 +297,11 @@ App.MainServiceItemView = Em.View.extend({
     this.get('controller').setStartStopState();
   },
 
-  maintenanceObsFields: ['isStopDisabled', 'isClientsOnlyService', 'content.isRestartRequired', 'isServicesInfoLoaded'],
+  maintenanceObsFields: ['isStopDisabled', 'isClientsOnlyService', 'content.isRestartRequired', 'isServicesInfoLoaded', 'isServiceConfigsLoaded'],
 
   willInsertElement: function () {
     var self = this;
+    this.get('controller').loadConfigs();
     this.get('maintenanceObsFields').forEach(function (field) {
       self.addObserver('controller.' + field, self, 'observeMaintenance');
     });

http://git-wip-us.apache.org/repos/asf/ambari/blob/8b7aa920/ambari-web/test/views/main/service/item_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/views/main/service/item_test.js b/ambari-web/test/views/main/service/item_test.js
index af94f01..9feb187 100644
--- a/ambari-web/test/views/main/service/item_test.js
+++ b/ambari-web/test/views/main/service/item_test.js
@@ -84,24 +84,28 @@ describe('App.MainServiceItemView', function () {
       {
         isMaintenanceSet: true,
         isServicesInfoLoaded: true,
+        isServiceConfigsLoaded: true,
         observeMaintenanceOnceCallCount: 0,
         title: 'actions array set, services info loaded'
       },
       {
         isMaintenanceSet: true,
         isServicesInfoLoaded: false,
+        isServiceConfigsLoaded: true,
         observeMaintenanceOnceCallCount: 0,
         title: 'actions array set, services info not loaded'
       },
       {
         isMaintenanceSet: false,
         isServicesInfoLoaded: true,
+        isServiceConfigsLoaded: true,
         observeMaintenanceOnceCallCount: 1,
         title: 'actions array not set, services info loaded'
       },
       {
         isMaintenanceSet: false,
         isServicesInfoLoaded: false,
+        isServiceConfigsLoaded: true,
         observeMaintenanceOnceCallCount: 0,
         title: 'actions array not set, services info not loaded'
       }
@@ -119,7 +123,8 @@ describe('App.MainServiceItemView', function () {
       it(item.title, function () {
         view.setProperties({
           'isMaintenanceSet': item.isMaintenanceSet,
-          'controller.isServicesInfoLoaded': item.isServicesInfoLoaded
+          'controller.isServicesInfoLoaded': item.isServicesInfoLoaded,
+          'controller.isServiceConfigsLoaded': item.isServiceConfigsLoaded
         });
         view.observeMaintenance();
         expect(view.observeMaintenanceOnce.callCount).to.equal(item.observeMaintenanceOnceCallCount);
@@ -206,7 +211,7 @@ describe('App.MainServiceItemView', function () {
             {"action": "restartAllHostComponents", "context": "ZOOKEEPER", "label": "Restart All", "cssClass": "icon-repeat", "disabled": false},
             {"action": "runSmokeTest", "label": "Run Service Check", "cssClass": "icon-thumbs-up-alt", "disabled": false},
             {"action": "turnOnOffPassive", "context": "Turn On Maintenance Mode for ZooKeeper", "label": "Turn On Maintenance Mode", "cssClass": "icon-medkit", "disabled": false},
-            {"cssClass": "icon-plus", "label": "Add ZooKeeper Server", "service": "ZOOKEEPER", "component": "ZOOKEEPER_SERVER", "action": "addZOOKEEPER_SERVER", "disabled": "disabled", tooltip: ''},
+            {"cssClass": "icon-plus", "label": "Add ZooKeeper Server", "service": "ZOOKEEPER", "component": "ZOOKEEPER_SERVER", "action": "addComponent", "disabled": "", tooltip: ''},
             {"action": "downloadClientConfigs", "label": "Download Client Configs", "cssClass": "icon-download-alt", "isHidden": false, "disabled": false, "hasSubmenu": false, "submenuOptions": []}
           ]
         },
@@ -319,7 +324,7 @@ describe('App.MainServiceItemView', function () {
             {"action": "rollingRestart", "label": "Restart Flumes", "cssClass": "icon-time", "disabled": false, "context": "FLUME_HANDLER"},
             {"action": "runSmokeTest", "label": "Run Service Check", "cssClass": "icon-thumbs-up-alt", "disabled": false},
             {"action": "turnOnOffPassive", "context": "Turn On Maintenance Mode for Flume", "label": "Turn On Maintenance Mode", "cssClass": "icon-medkit", "disabled": false},
-            {"cssClass": "icon-plus", "label": "Add Flume Component", "service": "FLUME", "component": "FLUME_HANDLER", "action": "addFLUME_HANDLER", "disabled": '', tooltip: ''},
+            {"cssClass": "icon-plus", "label": "Add Flume Component", "service": "FLUME", "component": "FLUME_HANDLER", "action": "addComponent", "disabled": '', tooltip: ''},
             {"action": "downloadClientConfigs", "label": "Download Client Configs", "cssClass": "icon-download-alt", "isHidden": true, "disabled": false, "hasSubmenu": false, "submenuOptions": []}
           ]
         },
@@ -355,7 +360,7 @@ describe('App.MainServiceItemView', function () {
             {"action": "rollingRestart", "label": "Restart RegionServers", "cssClass": "icon-time", "disabled": false, "context": "HBASE_REGIONSERVER"},
             {"action": "runSmokeTest", "label": "Run Service Check", "cssClass": "icon-thumbs-up-alt", "disabled": false},
             {"action": "turnOnOffPassive", "context": "Turn On Maintenance Mode for HBase", "label": "Turn On Maintenance Mode", "cssClass": "icon-medkit", "disabled": false},
-            {"cssClass": "icon-plus", "label": "Add HBase Master", "service": "HBASE", "component": "HBASE_MASTER", "action": "addHBASE_MASTER", "disabled": '', tooltip: ''},
+            {"cssClass": "icon-plus", "label": "Add HBase Master", "service": "HBASE", "component": "HBASE_MASTER", "action": "addComponent", "disabled": '', tooltip: ''},
             {"action": "downloadClientConfigs", "label": "Download Client Configs", "cssClass": "icon-download-alt", "isHidden": false, "disabled": false, "hasSubmenu": false, "submenuOptions": []}
           ]
         },
@@ -382,6 +387,7 @@ describe('App.MainServiceItemView', function () {
             {"action": "reassignMaster", "context": "OOZIE_SERVER", "label": "Move Oozie Server", "cssClass": "icon-share-alt", "disabled": false},
             {"action": "runSmokeTest", "label": "Run Service Check", "cssClass": "icon-thumbs-up-alt", "disabled": false},
             {"action": "turnOnOffPassive", "context": "Turn On Maintenance Mode for Oozie", "label": "Turn On Maintenance Mode", "cssClass": "icon-medkit", "disabled": false},
+            {"cssClass": "icon-plus", "label": "Add Oozie Server", "service": "OOZIE", "component": "OOZIE_SERVER", "action": "addComponent", "disabled": "disabled", tooltip: Em.I18n.t('services.summary.allHostsAlreadyRunComponent').format('OOZIE_SERVER')},
             {"action": "downloadClientConfigs", "label": "Download Client Configs", "cssClass": "icon-download-alt", "isHidden": false, "disabled": false, "hasSubmenu": false, "submenuOptions": []}
           ]
         },
@@ -449,6 +455,8 @@ describe('App.MainServiceItemView', function () {
             return ["HDFS", "MAPREDUCE2", "YARN", "HIVE", "HBASE", "PIG", "SQOOP", "OOZIE", "ZOOKEEPER", "FALCON", "STORM", "FLUME", "SLIDER", "KNOX", "KAFKA"];
           case 'components.addableToHost':
             return ["DATANODE", "HDFS_CLIENT", "MAPREDUCE2_CLIENT", "NODEMANAGER", "YARN_CLIENT", "TEZ_CLIENT", "GANGLIA_MONITOR", "HCAT", "HIVE_CLIENT", "HIVE_METASTORE", "HIVE_SERVER", "WEBHCAT_SERVER", "HBASE_CLIENT", "HBASE_MASTER", "HBASE_REGIONSERVER", "PIG", "SQOOP", "OOZIE_CLIENT", "OOZIE_SERVER", "ZOOKEEPER_CLIENT", "ZOOKEEPER_SERVER", "FALCON_CLIENT", "SUPERVISOR", "FLUME_HANDLER", "METRICS_MONITOR", "KAFKA_BROKER", "KERBEROS_CLIENT", "KNOX_GATEWAY", "SLIDER", "SPARK_CLIENT"];
+          case 'allHostNames.length':
+            return 2;
           default:
             return Em.get(App, k);
         }


[17/22] ambari git commit: AMBARI-14710. AMBARI-14710 : Add retry logic for REST calls between Ambari and Ranger (aonishuk)

Posted by nc...@apache.org.
AMBARI-14710. AMBARI-14710 : Add retry logic for REST calls between Ambari and Ranger (aonishuk)


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

Branch: refs/heads/branch-dev-patch-upgrade
Commit: 1217a56dcfba4ffec9ec87c4baa12790b31b45a2
Parents: 3c45529
Author: Andrew Onishuk <ao...@hortonworks.com>
Authored: Thu Jan 21 16:11:29 2016 +0200
Committer: Andrew Onishuk <ao...@hortonworks.com>
Committed: Thu Jan 21 16:11:29 2016 +0200

----------------------------------------------------------------------
 .../resource_management/libraries/functions/ranger_functions.py    | 2 +-
 .../resource_management/libraries/functions/ranger_functions_v2.py | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/1217a56d/ambari-common/src/main/python/resource_management/libraries/functions/ranger_functions.py
----------------------------------------------------------------------
diff --git a/ambari-common/src/main/python/resource_management/libraries/functions/ranger_functions.py b/ambari-common/src/main/python/resource_management/libraries/functions/ranger_functions.py
index c59dc8d..e302235 100644
--- a/ambari-common/src/main/python/resource_management/libraries/functions/ranger_functions.py
+++ b/ambari-common/src/main/python/resource_management/libraries/functions/ranger_functions.py
@@ -207,7 +207,7 @@ class Rangeradmin:
     except TimeoutError:
       raise Fail("Connection to Ranger Admin failed. Reason - timeout")
 
-  @safe_retry(times=5, sleep_time=8, backoff_factor=1.5, err_class=Fail, return_on_fail=None)
+  @safe_retry(times=15, sleep_time=8, backoff_factor=1.5, err_class=Fail, return_on_fail=None)
   def check_ranger_login_urllib2(self, url):
     """
     :param url: ranger admin host url

http://git-wip-us.apache.org/repos/asf/ambari/blob/1217a56d/ambari-common/src/main/python/resource_management/libraries/functions/ranger_functions_v2.py
----------------------------------------------------------------------
diff --git a/ambari-common/src/main/python/resource_management/libraries/functions/ranger_functions_v2.py b/ambari-common/src/main/python/resource_management/libraries/functions/ranger_functions_v2.py
index a72be33..6624c89 100644
--- a/ambari-common/src/main/python/resource_management/libraries/functions/ranger_functions_v2.py
+++ b/ambari-common/src/main/python/resource_management/libraries/functions/ranger_functions_v2.py
@@ -170,7 +170,7 @@ class RangeradminV2:
     except TimeoutError:
       raise Fail("Connection to Ranger Admin failed. Reason - timeout")
 
-  @safe_retry(times=5, sleep_time=8, backoff_factor=1.5, err_class=Fail, return_on_fail=None)
+  @safe_retry(times=15, sleep_time=8, backoff_factor=1.5, err_class=Fail, return_on_fail=None)
   def check_ranger_login_urllib2(self, url):
     """
     :param url: ranger admin host url


[22/22] ambari git commit: Merge branch 'trunk' into branch-dev-patch-upgrade

Posted by nc...@apache.org.
Merge branch 'trunk' into branch-dev-patch-upgrade


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

Branch: refs/heads/branch-dev-patch-upgrade
Commit: abc961a13a15cdced7bb3678e4ac67364ba656aa
Parents: fc402eb 77ea2eb
Author: Nate Cole <nc...@hortonworks.com>
Authored: Thu Jan 21 14:20:49 2016 -0500
Committer: Nate Cole <nc...@hortonworks.com>
Committed: Thu Jan 21 14:20:49 2016 -0500

----------------------------------------------------------------------
 .../python/resource_management/TestScript.py    |   4 +-
 .../src/main/python/ambari_commons/firewall.py  |   6 +-
 .../libraries/functions/get_lzo_packages.py     |   5 +-
 .../libraries/functions/package_conditions.py   |  64 ++++
 .../libraries/functions/ranger_functions.py     |   2 +-
 .../libraries/functions/ranger_functions_v2.py  |   2 +-
 .../libraries/script/script.py                  |  21 +-
 .../2.1.1/services/AMBARI_METRICS/metainfo.xml  |   1 +
 .../metrics/timeline/PhoenixHBaseAccessor.java  |   2 +-
 .../aggregators/TimelineMetricReadHelper.java   |   4 +-
 .../server/checks/AbstractCheckDescriptor.java  |   4 +
 .../ambari/server/checks/CheckDescription.java  |   7 +
 .../HiveDynamicServiceDiscoveryCheck.java       |   2 +-
 .../checks/HiveMultipleMetastoreCheck.java      |   2 +-
 .../server/checks/HostMaintenanceModeCheck.java |   2 +-
 .../checks/HostsMasterMaintenanceCheck.java     |   2 +-
 .../server/checks/InstallPackagesCheck.java     |   2 +-
 ...apReduce2JobHistoryStatePreservingCheck.java |   2 +-
 .../server/checks/PreviousUpgradeCompleted.java | 144 +++++++++
 .../server/checks/RangerPasswordCheck.java      |   2 +-
 .../checks/SecondaryNamenodeDeletedCheck.java   |   2 +-
 .../checks/ServicesMaintenanceModeCheck.java    |   2 +-
 .../ServicesMapReduceDistributedCacheCheck.java |   2 +-
 .../ServicesNamenodeHighAvailabilityCheck.java  |   2 +-
 .../checks/ServicesNamenodeTruncateCheck.java   |   2 +-
 .../ServicesTezDistributedCacheCheck.java       |   2 +-
 .../checks/ServicesYarnWorkPreservingCheck.java |   2 +-
 .../server/checks/StormRestAPIDeletedCheck.java |   2 +-
 .../checks/YarnRMHighAvailabilityCheck.java     |   2 +-
 .../YarnTimelineServerStatePreservingCheck.java |   2 +-
 .../AmbariManagementControllerImpl.java         |   9 +
 .../ambari/server/orm/dao/ClusterDAO.java       |  19 ++
 .../server/orm/dao/HostRoleCommandDAO.java      |   9 +
 .../apache/ambari/server/state/ServiceImpl.java |  28 +-
 .../ambari/server/state/ServiceOsSpecific.java  |  17 +-
 .../server/topology/ClusterTopologyImpl.java    |   7 +-
 .../server/upgrade/SchemaUpgradeHelper.java     |   1 +
 .../server/upgrade/UpgradeCatalog240.java       | 298 +++++++++++++++++++
 .../0.1.0/package/scripts/metrics_monitor.py    |   4 +-
 .../0.96.0.2.0/configuration/hbase-env.xml      |   2 +-
 .../HBASE/0.96.0.2.0/package/scripts/hbase.py   |   3 +-
 .../0.96.0.2.0/package/scripts/hbase_client.py  |   4 +-
 .../0.96.0.2.0/package/scripts/hbase_master.py  |   3 +-
 .../package/scripts/hbase_regionserver.py       |   3 +-
 .../0.96.0.2.0/package/scripts/params_linux.py  |   5 -
 .../package/scripts/phoenix_queryserver.py      |   3 +-
 .../common-services/HDFS/2.1.0.2.0/metainfo.xml |   4 +
 .../HDFS/2.1.0.2.0/package/scripts/datanode.py  |   4 +-
 .../2.1.0.2.0/package/scripts/hdfs_client.py    |   4 +-
 .../2.1.0.2.0/package/scripts/journalnode.py    |   4 +-
 .../HDFS/2.1.0.2.0/package/scripts/namenode.py  |   4 +-
 .../2.1.0.2.0/package/scripts/nfsgateway.py     |   2 +-
 .../2.1.0.2.0/package/scripts/params_linux.py   |   4 -
 .../HDFS/2.1.0.2.0/package/scripts/snamenode.py |   2 +-
 .../2.1.0.2.0/package/scripts/zkfc_slave.py     |   2 +-
 .../HIVE/0.12.0.2.0/metainfo.xml                |   4 +
 .../0.12.0.2.0/package/scripts/hcat_client.py   |   2 +-
 .../0.12.0.2.0/package/scripts/hive_client.py   |   2 +-
 .../package/scripts/hive_metastore.py           |   2 +-
 .../0.12.0.2.0/package/scripts/hive_server.py   |   2 +-
 .../0.12.0.2.0/package/scripts/mysql_server.py  |   2 +-
 .../0.12.0.2.0/package/scripts/params_linux.py  |  18 +-
 .../package/scripts/params_windows.py           |   2 -
 .../package/scripts/webhcat_server.py           |   2 +-
 .../KERBEROS/1.10.3-10/metainfo.xml             |   6 +
 .../package/scripts/kerberos_client.py          |   2 +-
 .../common-services/PXF/3.0.0/metainfo.xml      |   6 +
 .../PXF/3.0.0/package/scripts/params.py         |  31 +-
 .../PXF/3.0.0/package/scripts/pxf_constants.py  |  26 ++
 .../PXF/3.0.0/package/scripts/pxf_utils.py      |  49 +++
 .../PXF/3.0.0/package/scripts/service_check.py  | 266 +++++++++++++++++
 .../SQOOP/1.4.4.2.0/metainfo.xml                |   1 +
 .../custom_actions/scripts/install_packages.py  |  17 +-
 .../stacks/HDP/2.1/services/HIVE/metainfo.xml   |   4 +
 .../stacks/HDP/2.2/services/HBASE/metainfo.xml  |   2 +
 .../stacks/HDP/2.2/services/HDFS/metainfo.xml   |   4 +
 .../stacks/HDP/2.2/services/HIVE/metainfo.xml   |   5 +
 .../stacks/HDP/2.2/services/OOZIE/metainfo.xml  |   1 +
 .../stacks/HDP/2.2/services/SQOOP/metainfo.xml  |   1 +
 .../HDP/2.2/upgrades/nonrolling-upgrade-2.3.xml |   6 +
 .../HDP/2.2/upgrades/nonrolling-upgrade-2.4.xml |   6 +
 .../stacks/HDP/2.2/upgrades/upgrade-2.3.xml     |   3 +
 .../stacks/HDP/2.2/upgrades/upgrade-2.4.xml     |   3 +
 .../stacks/HDP/2.3/role_command_order.json      |   6 +-
 .../stacks/HDP/2.3/services/HDFS/metainfo.xml   |   3 +
 .../stacks/HDP/2.3/services/HIVE/metainfo.xml   |   7 +
 .../stacks/HDP/2.3/services/OOZIE/metainfo.xml  |   1 +
 .../stacks/HDP/2.3/upgrades/config-upgrade.xml  |  17 ++
 .../HDP/2.3/upgrades/nonrolling-upgrade-2.3.xml |   6 +
 .../HDP/2.3/upgrades/nonrolling-upgrade-2.4.xml |   9 +
 .../stacks/HDP/2.3/upgrades/upgrade-2.3.xml     |   5 +
 .../stacks/HDP/2.3/upgrades/upgrade-2.4.xml     |   5 +
 .../stacks/HDP/2.4/upgrades/config-upgrade.xml  |  23 ++
 .../server/checks/UpgradeCheckOrderTest.java    |  26 +-
 .../AmbariManagementControllerImplTest.java     |   5 +
 .../timeline/AMSPropertyProviderTest.java       | 179 ++++++++++-
 .../ambari/server/state/CheckHelperTest.java    |   2 +
 .../server/state/cluster/ClusterTest.java       |  19 +-
 .../topology/ClusterTopologyImplTest.java       |  28 +-
 .../server/upgrade/UpgradeCatalog240Test.java   | 130 ++++++++
 .../src/test/python/TestAmbariServer.py         |   4 +-
 .../configs/install_packages_config.json        |   4 +-
 .../stacks/2.0.6/configs/hbase_no_phx.json      |   2 +-
 .../stacks/2.0.6/configs/hbase_with_phx.json    |   2 +-
 .../python/stacks/2.3/configs/pxf_default.json  |   2 +-
 .../ams/single_host_component_metrics_h1.json   |  21 ++
 .../ams/single_host_component_metrics_h2.json   |  22 ++
 ambari-web/app/assets/test/tests.js             |  43 +++
 ambari-web/app/controllers/main/service/item.js | 176 ++++++-----
 .../app/mixins/common/configs/configs_saver.js  |   4 +
 .../mixins/common/widgets/time_range_mixin.js   |  32 +-
 ambari-web/app/router.js                        |   3 +
 ambari-web/app/utils/ajax/ajax.js               |   6 +-
 ambari-web/app/utils/ajax/ajax_queue.js         |  29 +-
 ambari-web/app/utils/helper.js                  |   2 +-
 .../app/views/common/chart/linear_time.js       |  18 +-
 .../app/views/common/custom_date_popup.js       |   7 +-
 .../app/views/common/select_custom_date_view.js |   4 +-
 ambari-web/app/views/main/service/item.js       | 120 ++++----
 ambari-web/package.json                         |   2 +-
 ambari-web/test/controllers/application_test.js |  24 +-
 .../global/background_operations_test.js        |  19 +-
 .../global/cluster_controller_test.js           |  71 ++---
 .../global/update_controller_test.js            |  23 +-
 .../global/user_settings_controller_test.js     |   4 -
 ambari-web/test/controllers/installer_test.js   |  10 -
 .../progress_controller_test.js                 |  11 +-
 .../progress_popup_controller_test.js           |  43 +--
 .../resourceManager/step3_controller_test.js    |  11 +-
 .../controllers/main/admin/kerberos_test.js     |  30 +-
 .../admin/stack_and_upgrade_controller_test.js  | 175 ++++-------
 .../main/alert_definitions_controller_test.js   |   9 +-
 .../add_alert_definition_controller_test.js     |  20 +-
 .../alerts/alert_instances_controller_test.js   |  21 +-
 .../definitions_configs_controller_test.js      |  10 +-
 .../definitions_details_controller_test.js      |  37 +--
 ...anage_alert_notifications_controller_test.js |  15 +-
 .../controllers/main/charts/heatmap_test.js     |  61 +---
 .../dashboard/config_history_controller_test.js |  26 +-
 .../main/host/add_controller_test.js            |  42 ++-
 .../test/controllers/main/host/details_test.js  | 197 ++++++------
 ambari-web/test/controllers/main/host_test.js   |  14 +-
 .../main/service/add_controller_test.js         |  75 +----
 .../main/service/info/config_test.js            |  21 +-
 .../main/service/info/summary_test.js           | 107 +------
 .../test/controllers/main/service/item_test.js  |  27 +-
 .../service/reassign/step1_controller_test.js   |  27 +-
 .../service/reassign/step4_controller_test.js   | 201 ++++++-------
 .../service/reassign/step6_controller_test.js   |  24 +-
 .../service/reassign/step7_controller_test.js   |  53 ++--
 .../test/controllers/main/service_test.js       |  31 +-
 .../controllers/main/views_controller_test.js   |   9 +-
 ambari-web/test/controllers/main_test.js        |  25 +-
 .../test/controllers/wizard/step2_test.js       |  11 +-
 .../test/controllers/wizard/step3_test.js       |  95 ++----
 .../test/controllers/wizard/step6_test.js       |   9 -
 .../test/controllers/wizard/step7_test.js       |  18 +-
 .../test/controllers/wizard/step8_test.js       |  85 ++----
 .../test/controllers/wizard/step9_test.js       |  31 +-
 ambari-web/test/controllers/wizard_test.js      |   8 +-
 ambari-web/test/helpers.js                      |  77 +++++
 .../common/table_server_view_mixin_test.js      |   1 +
 .../test/mixins/common/widget_mixin_test.js     |  91 +++---
 .../common/widgets/export_metrics_mixin_test.js |  15 +-
 .../common/widgets/time_range_mixin_test.js     |  10 +-
 .../host_components/decommissionable_test.js    |  25 +-
 .../host_components/install_component_test.js   |  97 +++---
 .../wizard/wizardProgressPageController_test.js |  24 +-
 ambari-web/test/models/cluster_states_test.js   |   2 -
 ambari-web/test/models/host_test.js             |   4 -
 ambari-web/test/router_test.js                  |  40 +--
 ambari-web/test/utils/ajax/ajax_queue_test.js   |   8 -
 ambari-web/test/utils/ajax/ajax_test.js         |  17 +-
 .../test/utils/batch_scheduled_requests_test.js |  71 -----
 .../test/utils/host_progress_popup_test.js      |   2 -
 ambari-web/test/utils/updater_test.js           | 149 +++++-----
 .../test/views/common/chart/linear_time_test.js |  16 +-
 .../common/configs/config_history_flow_test.js  |  12 +-
 .../test/views/common/controls_view_test.js     |   9 +-
 .../test/views/common/quick_link_view_test.js   |  59 ++--
 .../common/select_custom_date_view_test.js      |  49 +++
 .../common/widget/gauge_widget_view_test.js     |  24 +-
 .../common/widget/graph_widget_view_test.js     |  12 +-
 .../common/widget/number_widget_view_test.js    |  24 +-
 .../stack_upgrade/upgrade_group_view_test.js    |  16 +-
 .../stack_upgrade/upgrade_wizard_view_test.js   | 107 ++++---
 .../admin/stack_upgrade/version_view_test.js    |  85 +++---
 .../test/views/main/dashboard/widget_test.js    |  11 +-
 .../main/dashboard/widgets/namenode_cpu_test.js |  31 +-
 .../test/views/main/dashboard/widgets_test.js   |  18 +-
 .../host_component_views/datanode_view_test.js  |  15 +-
 .../decommissionable_test.js                    |  28 +-
 ambari-web/test/views/main/service/item_test.js |  16 +-
 .../views/main/service/services/ranger_test.js  |  10 -
 194 files changed, 3023 insertions(+), 2076 deletions(-)
----------------------------------------------------------------------



[11/22] ambari git commit: AMBARI-14733: HAWQ Service check should be executed after HAWQ SEGMENTS are started. (bhuvnesh2703 via jaoki)

Posted by nc...@apache.org.
AMBARI-14733: HAWQ Service check should be executed after HAWQ SEGMENTS are started. (bhuvnesh2703 via jaoki)


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

Branch: refs/heads/branch-dev-patch-upgrade
Commit: 03a0f9f508a3a32e21f4124f89b6ab9badd873ad
Parents: 109311d
Author: Jun Aoki <ja...@apache.org>
Authored: Wed Jan 20 14:54:28 2016 -0800
Committer: Jun Aoki <ja...@apache.org>
Committed: Wed Jan 20 14:54:28 2016 -0800

----------------------------------------------------------------------
 .../src/main/resources/stacks/HDP/2.3/role_command_order.json  | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/03a0f9f5/ambari-server/src/main/resources/stacks/HDP/2.3/role_command_order.json
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/stacks/HDP/2.3/role_command_order.json b/ambari-server/src/main/resources/stacks/HDP/2.3/role_command_order.json
index 1b6eefc..f164ab2 100755
--- a/ambari-server/src/main/resources/stacks/HDP/2.3/role_command_order.json
+++ b/ambari-server/src/main/resources/stacks/HDP/2.3/role_command_order.json
@@ -10,10 +10,10 @@
     "PHOENIX_QUERY_SERVER-START": ["HBASE_MASTER-START"],
     "ATLAS_SERVICE_CHECK-SERVICE_CHECK": ["ATLAS_SERVER-START"],
     "SPARK_THRIFTSERVER-START" : ["NAMENODE-START", "HIVE_METASTORE-START"],
-    "HAWQMASTER-START" : ["NAMENODE-START", "DATANODE-START"],
-    "HAWQSTANDBY-START" : ["NAMENODE-START", "DATANODE-START", "HAWQMASTER-START"],
+    "HAWQMASTER-START" : ["NAMENODE-START", "DATANODE-START", "NODEMANAGER-START"],
+    "HAWQSTANDBY-START" : ["HAWQMASTER-START"],
     "HAWQSEGMENT-START" : ["HAWQMASTER-START", "HAWQSTANDBY-START"],
-    "HAWQ_SERVICE_CHECK-SERVICE_CHECK" : ["HAWQMASTER-START", "HDFS_SERVICE_CHECK-SERVICE_CHECK"],
+    "HAWQ_SERVICE_CHECK-SERVICE_CHECK" : ["HAWQSEGMENT-START", "HDFS_SERVICE_CHECK-SERVICE_CHECK", "YARN_SERVICE_CHECK-SERVICE_CHECK"],
     "KNOX_GATEWAY-START" : ["RANGER_USERSYNC-START", "NAMENODE-START"],
     "KAFKA_BROKER-START" : ["ZOOKEEPER_SERVER-START", "RANGER_USERSYNC-START", "NAMENODE-START"],
     "NIMBUS-START" : ["ZOOKEEPER_SERVER-START", "RANGER_USERSYNC-START", "NAMENODE-START"],


[04/22] ambari git commit: AMBARI-14741. Ambari Web Unit Test failure on trunk (App.WizardStep8Controller) (onechiporenko)

Posted by nc...@apache.org.
http://git-wip-us.apache.org/repos/asf/ambari/blob/ddf479ef/ambari-web/test/controllers/main/host/details_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/controllers/main/host/details_test.js b/ambari-web/test/controllers/main/host/details_test.js
index a108c8d..51e649c 100644
--- a/ambari-web/test/controllers/main/host/details_test.js
+++ b/ambari-web/test/controllers/main/host/details_test.js
@@ -24,6 +24,7 @@ require('models/host_component');
 require('models/host_stack_version');
 var batchUtils = require('utils/batch_scheduled_requests');
 var hostsManagement = require('utils/hosts');
+var testHelpers = require('test/helpers');
 var controller;
 
 function getController() {
@@ -36,17 +37,9 @@ function getController() {
 describe('App.MainHostDetailsController', function () {
 
   beforeEach(function () {
-    sinon.stub(App.ajax, 'send').returns({
-      then: Em.K,
-      complete: Em.K
-    });
     controller = getController();
   });
 
-  afterEach(function () {
-    App.ajax.send.restore();
-  });
-
   App.TestAliases.testAsComputedFilterBy(getController(), 'serviceNonClientActiveComponents', 'serviceActiveComponents', 'isClient', false);
 
   describe('#routeHome()', function () {
@@ -140,14 +133,12 @@ describe('App.MainHostDetailsController', function () {
   describe("#pullNnCheckPointTime()", function() {
     it("valid request is sent", function() {
       controller.pullNnCheckPointTime('host1');
-      expect(App.ajax.send.calledWith({
-        name: 'common.host_component.getNnCheckPointTime',
-        sender: controller,
-        data: {
-          host: 'host1'
-        },
-        success: 'parseNnCheckPointTime'
-      })).to.be.true;
+      var args = testHelpers.findAjaxRequest('name', 'common.host_component.getNnCheckPointTime');
+      expect(args[0]).to.exists;
+      expect(args[0].sender).to.be.eql(controller);
+      expect(args[0].data).to.be.eql({
+        host: 'host1'
+      });
     });
   });
 
@@ -166,11 +157,14 @@ describe('App.MainHostDetailsController', function () {
       });
 
       it('1st call endpoint is valid', function () {
-        expect(App.ajax.send.getCall(0).args[0].name).to.be.equal('common.host.host_component.update');
+        var args = testHelpers.findAjaxRequest('name', 'common.host.host_component.update');
+        expect(args).to.exists;
       });
 
       it('1st call data is valid', function () {
-        expect(App.ajax.send.getCall(0).args[0].data).to.be.eql({
+        var args = testHelpers.findAjaxRequest('name', 'common.host.host_component.update');
+        expect(args[0]).to.exists;
+        expect(args[0].data).to.be.eql({
           "hostName": "host1",
           "context": {},
           "component": component,
@@ -201,11 +195,14 @@ describe('App.MainHostDetailsController', function () {
       });
 
       it('1st call endpoint is valid', function () {
-        expect(App.ajax.send.getCall(0).args[0].name).to.be.equal('common.host.host_components.update');
+        var args = testHelpers.findAjaxRequest('name', 'common.host.host_components.update');
+        expect(args).exists;
       });
 
       it('1st call data is valid', function () {
-        expect(App.ajax.send.getCall(0).args[0].data).to.be.eql({
+        var args = testHelpers.findAjaxRequest('name', 'common.host.host_components.update');
+        expect(args[0]).exists;
+        expect(args[0].data).to.be.eql({
           "hostName": "host1",
           "context": {},
           "component": component,
@@ -231,14 +228,12 @@ describe('App.MainHostDetailsController', function () {
     beforeEach(function () {
       sinon.stub(controller, 'mimicWorkStatusChange', Em.K);
       sinon.stub(controller, 'showBackgroundOperationsPopup', Em.K);
-      sinon.stub(App, 'get').withArgs('testMode').returns(false);
       controller.sendComponentCommandSuccessCallback({}, {}, params);
     });
 
     afterEach(function () {
       controller.showBackgroundOperationsPopup.restore();
       controller.mimicWorkStatusChange.restore();
-      App.get.restore();
     });
 
     it('mimicWorkStatusChange is not called', function () {
@@ -466,7 +461,8 @@ describe('App.MainHostDetailsController', function () {
       var popup = controller.upgradeComponent({context: Em.Object.create()});
       expect(App.showConfirmationPopup.calledOnce).to.be.true;
       popup.onPrimary();
-      expect(App.ajax.send.calledOnce).to.be.true;
+      var args = testHelpers.findAjaxRequest('name', 'host.host_component.upgrade');
+      expect(args).exists;
     });
   });
 
@@ -475,9 +471,7 @@ describe('App.MainHostDetailsController', function () {
     beforeEach(function () {
       sinon.spy(App, "showConfirmationPopup");
       sinon.stub(batchUtils, "restartHostComponents", Em.K);
-      sinon.stub(controller, 'checkNnLastCheckpointTime', function(callback) {
-        callback();
-      });
+      sinon.stub(controller, 'checkNnLastCheckpointTime', Em.clb);
     });
     afterEach(function () {
       App.showConfirmationPopup.restore();
@@ -636,15 +630,12 @@ describe('App.MainHostDetailsController', function () {
           }
         }
       }});
-      expect(App.ajax.send.calledWith({
-        name: 'admin.get.all_configurations',
-        sender: controller,
-        data: {
-          urlParams: '(type=oozie-env&tag=tag)'
-        },
-        success: 'onLoadOozieConfigs',
-        error: 'onLoadConfigsErrorCallback'
-      })).to.be.true;
+      var args = testHelpers.findAjaxRequest('name', 'admin.get.all_configurations');
+      expect(args[0]).exists;
+      expect(args[0].sender).to.be.eql(controller);
+      expect(args[0].data).to.be.eql({
+        urlParams: '(type=oozie-env&tag=tag)'
+      });
     });
   });
 
@@ -657,14 +648,12 @@ describe('App.MainHostDetailsController', function () {
           }
         }
       }});
-      expect(App.ajax.send.calledWith({
-        name: 'admin.get.all_configurations',
-        sender: controller,
-        data: {
-          urlParams: '(type=storm-site&tag=tag)'
-        },
-        success: 'onLoadStormConfigs'
-      })).to.be.true;
+      var args = testHelpers.findAjaxRequest('name', 'admin.get.all_configurations');
+      expect(args[0]).exists;
+      expect(args[0].sender).to.be.eql(controller);
+      expect(args[0].data).to.be.eql({
+        urlParams: '(type=storm-site&tag=tag)'
+      });
     });
   });
 
@@ -730,14 +719,12 @@ describe('App.MainHostDetailsController', function () {
           }
         }
       }});
-      expect(App.ajax.send.calledWith({
-        name: 'admin.get.all_configurations',
-        sender: controller,
-        data: {
-          urlParams: '(type=hive-site&tag=tag)|(type=webhcat-site&tag=tag)|(type=hive-env&tag=tag)|(type=core-site&tag=tag)'
-        },
-        success: 'onLoadHiveConfigs'
-      })).to.be.true;
+      var args = testHelpers.findAjaxRequest('name', 'admin.get.all_configurations');
+      expect(args[0]).exists;
+      expect(args[0].sender).to.be.eql(controller);
+      expect(args[0].data).to.be.eql({
+        urlParams: '(type=hive-site&tag=tag)|(type=webhcat-site&tag=tag)|(type=hive-env&tag=tag)|(type=core-site&tag=tag)'
+      });
     });
   });
 
@@ -756,14 +743,12 @@ describe('App.MainHostDetailsController', function () {
           }
         }
       }});
-      expect(App.ajax.send.calledWith({
-        name: 'admin.get.all_configurations',
-        sender: controller,
-        data: {
-          urlParams: '(type=core-site&tag=tag)|(type=hdfs-site&tag=tag)|(type=kms-env&tag=tag)'
-        },
-        success: 'onLoadRangerConfigs'
-      })).to.be.true;
+      var args = testHelpers.findAjaxRequest('name', 'admin.get.all_configurations');
+      expect(args[0]).exists;
+      expect(args[0].sender).to.be.eql(controller);
+      expect(args[0].data).to.be.eql({
+        urlParams: '(type=core-site&tag=tag)|(type=hdfs-site&tag=tag)|(type=kms-env&tag=tag)'
+      });
     });
   });
 
@@ -902,14 +887,16 @@ describe('App.MainHostDetailsController', function () {
         host: {}
       });
       controller.sendRefreshComponentConfigsCommand(component, {});
-      expect(App.ajax.send.calledOnce).to.be.true;
+      var args = testHelpers.findAjaxRequest('name', 'host.host_component.refresh_configs');
+      expect(args[0]).exists;
     });
   });
 
   describe('#loadConfigs()', function () {
     it('Query should be sent', function () {
       controller.loadConfigs();
-      expect(App.ajax.send.calledOnce).to.be.true;
+      var args = testHelpers.findAjaxRequest('name', 'config.tags');
+      expect(args).exists;
     });
   });
 
@@ -1031,12 +1018,13 @@ describe('App.MainHostDetailsController', function () {
 
     it('url params is empty', function () {
       expect(controller.loadConfigsSuccessCallback()).to.be.false;
-      expect(App.ajax.send.called).to.be.false;
+      var args = testHelpers.findAjaxRequest('name', 'reassign.load_configs');
+      expect(args).not.exists;
     });
     it('url params are correct', function () {
       mockUrlParams = ['param1'];
-      expect(controller.loadConfigsSuccessCallback()).to.be.true;
-      expect(App.ajax.send.calledOnce).to.be.true;
+      var args = testHelpers.findAjaxRequest('name', 'reassign.load_configs');
+      expect(args).exists;
     });
   });
 
@@ -1263,15 +1251,18 @@ describe('App.MainHostDetailsController', function () {
   describe("#saveConfigsBatch()", function () {
     it("no groups", function () {
       controller.saveConfigsBatch([]);
-      expect(App.ajax.send.called).to.be.false;
+      var args = testHelpers.filterAjaxRequests('name', 'common.service.configurations');
+      expect(args).to.be.empty;
     });
     it("configs is empty", function () {
       controller.saveConfigsBatch([{}]);
-      expect(App.ajax.send.called).to.be.false;
+      var args = testHelpers.filterAjaxRequests('name', 'common.service.configurations');
+      expect(args).to.be.empty;
     });
     it("configs is correct", function () {
       controller.saveConfigsBatch([{'properties': {'site': {}}, 'properties_attributes': {'site': {}}}]);
-      expect(App.ajax.send.calledOnce).to.be.true;
+      var args = testHelpers.filterAjaxRequests('name', 'common.service.configurations');
+      expect(args).to.have.property('length').equal(1);
     });
   });
 
@@ -1582,7 +1573,8 @@ describe('App.MainHostDetailsController', function () {
       var popup = controller.installComponent(event);
       expect(App.ModalPopup.show.calledOnce).to.be.true;
       popup.onPrimary();
-      expect(App.ajax.send.called).to.be.true;
+      var args = testHelpers.findAjaxRequest('name', 'common.host.host_component.update');
+      expect(args).exists;
     });
   });
 
@@ -1695,14 +1687,16 @@ describe('App.MainHostDetailsController', function () {
   describe('#doDecommission()', function () {
     it('Query should be sent', function () {
       controller.doDecommission('', '', '', '');
-      expect(App.ajax.send.calledOnce).to.be.true;
+      var args = testHelpers.findAjaxRequest('name', 'host.host_component.decommission_slave');
+      expect(args).exists;
     });
   });
 
   describe('#doDecommissionRegionServer()', function () {
     it('Query should be sent', function () {
       controller.doDecommissionRegionServer('', '', '', '');
-      expect(App.ajax.send.calledOnce).to.be.true;
+      var args = testHelpers.findAjaxRequest('name', 'host.host_component.recommission_and_restart');
+      expect(args).exists;
     });
   });
 
@@ -1743,7 +1737,9 @@ describe('App.MainHostDetailsController', function () {
       expect(result).to.be.an('object');
     });
     it('request is sent with correct data', function () {
-      expect(App.ajax.send.getCall(0).args[0].data.hostNames).to.equal('host1');
+      var args = testHelpers.findAjaxRequest('name', 'host.region_servers.in_inservice');
+      expect(args[0]).exists;
+      expect(args[0].data.hostNames).to.be.equal('host1');
     });
   });
 
@@ -1834,7 +1830,8 @@ describe('App.MainHostDetailsController', function () {
   describe('#doRecommissionAndStart()', function () {
     it('Query should be sent', function () {
       controller.doRecommissionAndStart('', '', '', '');
-      expect(App.ajax.send.calledOnce).to.be.true;
+      var args = testHelpers.findAjaxRequest('name', 'host.host_component.recommission_and_restart');
+      expect(args).exists;
     });
   });
 
@@ -1991,7 +1988,8 @@ describe('App.MainHostDetailsController', function () {
   describe('#hostPassiveModeRequest()', function () {
     it('Query should be sent', function () {
       controller.hostPassiveModeRequest('', '');
-      expect(App.ajax.send.calledOnce).to.be.true;
+      var args = testHelpers.findAjaxRequest('name', 'bulk_request.hosts.passive_state');
+      expect(args).exists;
     });
   });
 
@@ -2618,7 +2616,8 @@ describe('App.MainHostDetailsController', function () {
       var popup = controller.executeCustomCommand({context: Em.Object.create()});
       expect(App.showConfirmationPopup.calledOnce).to.be.true;
       popup.onPrimary();
-      expect(App.ajax.send.calledOnce).to.be.true;
+      var args = testHelpers.findAjaxRequest('name', 'service.item.executeCustomCommand');
+      expect(args).exists;
     });
   });
 
@@ -2627,8 +2626,9 @@ describe('App.MainHostDetailsController', function () {
       controller.set('content.hostName', 'host1');
       var component = Em.Object.create({componentName: 'COMP'});
       controller._doDeleteHostComponent(component);
-      expect(App.ajax.send.getCall(0).args[0].name).to.be.equal('common.delete.host_component');
-      expect(App.ajax.send.getCall(0).args[0].data).to.be.eql({
+      var args = testHelpers.findAjaxRequest('name', 'common.delete.host_component');
+      expect(args[0]).exists;
+      expect(args[0].data).to.be.eql({
         componentName: 'COMP',
         hostName: 'host1'
       });
@@ -2636,8 +2636,9 @@ describe('App.MainHostDetailsController', function () {
     it('all components', function () {
       controller.set('content.hostName', 'host1');
       controller._doDeleteHostComponent(null);
-      expect(App.ajax.send.getCall(0).args[0].name).to.be.equal('common.delete.host');
-      expect(App.ajax.send.getCall(0).args[0].data).to.be.eql({
+      var args = testHelpers.findAjaxRequest('name', 'common.delete.host');
+      expect(args[0]).exists;
+      expect(args[0].data).to.be.eql({
         componentName: '',
         hostName: 'host1'
       });
@@ -2723,16 +2724,7 @@ describe('App.MainHostDetailsController', function () {
       controller.mimicWorkStatusChange.restore();
       controller.showBackgroundOperationsPopup.restore();
     });
-    it('testMode is true', function () {
-      App.set('testMode', true);
-
-      controller.upgradeComponentSuccessCallback({}, {}, {component: "COMP"});
-      expect(controller.mimicWorkStatusChange.calledWith("COMP", App.HostComponentStatus.starting, App.HostComponentStatus.started)).to.be.true;
-      expect(controller.showBackgroundOperationsPopup.calledOnce).to.be.true;
-    });
     it('testMode is false', function () {
-      App.set('testMode', false);
-
       controller.upgradeComponentSuccessCallback({}, {}, {component: "COMP"});
       expect(controller.mimicWorkStatusChange.called).to.be.false;
       expect(controller.showBackgroundOperationsPopup.calledOnce).to.be.true;
@@ -2822,12 +2814,10 @@ describe('App.MainHostDetailsController', function () {
     beforeEach(function () {
       sinon.stub(controller, 'showBackgroundOperationsPopup', Em.K);
       sinon.stub(controller, 'mimicWorkStatusChange', Em.K);
-      sinon.stub(App, 'get').withArgs('testMode').returns(false);
     });
     afterEach(function () {
       controller.mimicWorkStatusChange.restore();
       controller.showBackgroundOperationsPopup.restore();
-      App.get.restore();
     });
 
     it('testMode is false', function () {
@@ -2877,7 +2867,9 @@ describe('App.MainHostDetailsController', function () {
         componentName: 'COMP1'
       });
       controller.updateComponentPassiveState(component, 'state', 'message');
-      expect(App.ajax.send.getCall(0).args[0].data).to.be.eql({
+      var args = testHelpers.findAjaxRequest('name', 'common.host.host_component.passive');
+      expect(args[0]).exists;
+      expect(args[0].data).to.be.eql({
         "hostName": "host1",
         "componentName": "COMP1",
         "component": component,
@@ -3174,16 +3166,17 @@ describe('App.MainHostDetailsController', function () {
       beforeEach(function () {
         controller.set('content.hostComponents', Em.A([]));
         controller.doDeleteHost(Em.K);
+        this.args = testHelpers.findAjaxRequest('name', 'common.delete.host');
       });
 
       it('fromDeleteHost is true', function () {
         expect(controller.get('fromDeleteHost')).to.be.true;
       });
       it('1st request is to delete host', function () {
-        expect(App.ajax.send.getCall(0).args[0].name).to.be.equal('common.delete.host');
+        expect(this.args[0]).exists;
       });
       it('1st request is done with valid hostName', function () {
-        expect(App.ajax.send.getCall(0).args[0].data.hostName).to.be.equal('host1');
+        expect(this.args[0].data.hostName).to.be.equal('host1');
       });
     });
 
@@ -3205,10 +3198,12 @@ describe('App.MainHostDetailsController', function () {
         expect(controller.get('fromDeleteHost')).to.be.true;
       });
       it('1st request is to delete host', function () {
-        expect(App.ajax.send.getCall(0).args[0].name).to.be.equal('common.delete.host');
+        var args = testHelpers.findAjaxRequest('name', 'common.delete.host');
+        expect(args[0]).exists;
       });
       it('1st request is done with valid hostName', function () {
-        expect(App.ajax.send.getCall(0).args[0].data.hostName).to.be.equal('host1');
+        var args = testHelpers.findAjaxRequest('name', 'common.delete.host');
+        expect(args[0].data.hostName).to.be.equal('host1');
       });
 
     });
@@ -3311,14 +3306,12 @@ describe('App.MainHostDetailsController', function () {
     it("call App.ajax.send", function () {
       controller.set('content.hostName', 'host1');
       controller.installVersion({context: {}});
-      expect(App.ajax.send.getCall(0).args[0]).to.eql({
-        name: 'host.stack_versions.install',
-        sender: controller,
-        data: {
-          hostName: 'host1',
-          version: {}
-        },
-        success: 'installVersionSuccessCallback'
+      var args = testHelpers.findAjaxRequest('name', 'host.stack_versions.install');
+      expect(args[0]).exists;
+      expect(args[0].sender).to.be.eql(controller);
+      expect(args[0].data).to.be.eql({
+        hostName: 'host1',
+        version: {}
       });
     });
   });

http://git-wip-us.apache.org/repos/asf/ambari/blob/ddf479ef/ambari-web/test/controllers/main/host_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/controllers/main/host_test.js b/ambari-web/test/controllers/main/host_test.js
index 386434b..1242374 100644
--- a/ambari-web/test/controllers/main/host_test.js
+++ b/ambari-web/test/controllers/main/host_test.js
@@ -25,11 +25,15 @@ describe('MainHostController', function () {
 
   var hostController, db;
 
-  describe('#getRegExp()', function() {
-    before(function() {
-      hostController = App.MainHostController.create({});
-    });
+  beforeEach(function () {
+    hostController = App.MainHostController.create({});
+  });
 
+  afterEach(function () {
+    hostController.destroy();
+  });
+
+  describe('#getRegExp()', function() {
     var message = '`{0}` should convert to `{1}`',
       tests = [
         { value: '.*', expected: '.*' },
@@ -55,7 +59,6 @@ describe('MainHostController', function () {
 
   describe('#getQueryParameters', function() {
     beforeEach(function() {
-      hostController = App.MainHostController.create({});
       sinon.spy(hostController, 'getRegExp');
       sinon.stub(App.db, 'getFilterConditions', function() {
         return [{
@@ -88,7 +91,6 @@ describe('MainHostController', function () {
       db = {mainHostController: [
         {name: 'hostName', status: 'sorting'}
       ]};
-      hostController = App.MainHostController.create({});
       sinon.stub(App.db, 'getSortingStatuses', function (k) {
         return db[k];
       });

http://git-wip-us.apache.org/repos/asf/ambari/blob/ddf479ef/ambari-web/test/controllers/main/service/add_controller_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/controllers/main/service/add_controller_test.js b/ambari-web/test/controllers/main/service/add_controller_test.js
index 3c7639c..5621ff4 100644
--- a/ambari-web/test/controllers/main/service/add_controller_test.js
+++ b/ambari-web/test/controllers/main/service/add_controller_test.js
@@ -20,6 +20,7 @@ var App = require('app');
 require('controllers/wizard');
 require('controllers/main/service/add_controller');
 var addServiceController = null;
+var testHelpers = require('test/helpers');
 
 describe('App.AddServiceController', function() {
 
@@ -27,68 +28,6 @@ describe('App.AddServiceController', function() {
     addServiceController = App.AddServiceController.create({});
   });
 
-  describe('#installAdditionalClients', function() {
-
-    var t = {
-      additionalClients: {
-        componentName: "TEZ_CLIENT",
-        hostNames: ["hostName1", "hostName2"]
-      },
-      additionalClientsWithoutHosts: {
-        componentName: "TEZ_CLIENT",
-        hostNames: []
-      },
-      RequestInfo: {
-        "context": Em.I18n.t('requestInfo.installHostComponent') + ' ' + App.format.role("TEZ_CLIENT"),
-        "query": "HostRoles/component_name=TEZ_CLIENT&HostRoles/host_name.in(hostName1,hostName2)"
-      },
-      Body: {
-        HostRoles: {
-          state: 'INSTALLED'
-        }
-      }
-    };
-
-    beforeEach(function () {
-      sinon.spy($, 'ajax');
-      sinon.stub(App, 'get', function(k) {
-        if ('clusterName' === k) return 'tdk';
-        return Em.get(App, k);
-      });
-      addServiceController.set('installClietsQueue', App.ajaxQueue.create())
-    });
-
-    afterEach(function () {
-      $.ajax.restore();
-      App.get.restore();
-    });
-
-    describe('send request to install client', function () {
-
-      beforeEach(function () {
-        addServiceController.set("content.additionalClients", [t.additionalClients]);
-        addServiceController.installAdditionalClients();
-      });
-
-      it('1 request is sent', function () {
-        expect($.ajax.calledOnce).to.equal(true);
-      });
-      it('data.Body is valid', function () {
-        expect(JSON.parse($.ajax.args[0][0].data).Body).to.deep.eql(t.Body);
-      });
-      it('data.RequestInfo is valid', function () {
-        expect(JSON.parse($.ajax.args[0][0].data).RequestInfo).to.eql(t.RequestInfo);
-      });
-
-    });
-
-    it('should not send request to install client', function () {
-      addServiceController.set("content.additionalClients", [t.additionalClientsWithoutHosts]);
-      expect($.ajax.called).to.be.false;
-    });
-
-  });
-
   describe('#generateDataForInstallServices', function() {
     var tests = [{
       selected: ["YARN","HBASE"],
@@ -204,17 +143,8 @@ describe('App.AddServiceController', function() {
       }
     ];
 
-    beforeEach(function () {
-      sinon.stub(App.ajax, 'send', function () {
-        return {
-          promise: Em.K
-        };
-      });
-    });
-
     afterEach(function () {
       addServiceController.getDBProperty.restore();
-      App.ajax.send.restore();
     });
 
     cases.forEach(function (item) {
@@ -223,10 +153,11 @@ describe('App.AddServiceController', function() {
         beforeEach(function () {
           sinon.stub(addServiceController, 'getDBProperty').withArgs('hosts').returns(item.hosts);
           addServiceController.loadHosts();
+          this.args = testHelpers.findAjaxRequest('name', 'hosts.confirmed');
         });
 
         it('request is ' + (item.isAjaxRequestSent ? '' : 'not') + ' sent', function () {
-          expect(App.ajax.send.calledOnce).to.equal(item.isAjaxRequestSent);
+          expect(Em.isNone(this.args)).to.be.equal(!item.isAjaxRequestSent);
         });
       });
     });

http://git-wip-us.apache.org/repos/asf/ambari/blob/ddf479ef/ambari-web/test/controllers/main/service/info/config_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/controllers/main/service/info/config_test.js b/ambari-web/test/controllers/main/service/info/config_test.js
index 9ebd914..fd7b23a 100644
--- a/ambari-web/test/controllers/main/service/info/config_test.js
+++ b/ambari-web/test/controllers/main/service/info/config_test.js
@@ -20,6 +20,7 @@ var App = require('app');
 require('controllers/main/service/info/configs');
 var batchUtils = require('utils/batch_scheduled_requests');
 var mainServiceInfoConfigsController = null;
+var testHelpers = require('test/helpers');
 
 function getController() {
   return App.MainServiceInfoConfigsController.create({
@@ -471,16 +472,15 @@ describe("App.MainServiceInfoConfigsController", function () {
       sinon.stub(App.router, 'getClusterName', function() {
         return 'clName';
       });
-      sinon.stub(App.ajax, "send", Em.K);
     });
     afterEach(function () {
-      App.ajax.send.restore();
       App.router.getClusterName.restore();
     });
     it("ajax request to put cluster cfg", function () {
       mainServiceInfoConfigsController.set('stepConfigs', sc);
       expect(mainServiceInfoConfigsController.putChangedConfigurations([]));
-      expect(App.ajax.send.calledOnce).to.be.true;
+      var args = testHelpers.findAjaxRequest('name', 'common.across.services.configurations');
+      expect(args[0]).exists;
     });
     it('values should be parsed', function () {
       mainServiceInfoConfigsController.set('stepConfigs', sc);
@@ -624,16 +624,12 @@ describe("App.MainServiceInfoConfigsController", function () {
       }]
     };
 
-    beforeEach(function() {
-      sinon.spy($,"ajax");
-    });
-    afterEach(function() {
-      $.ajax.restore();
-    });
-
     it("updates configs groups", function() {
       mainServiceInfoConfigsController.putConfigGroupChanges(t.data);
-      expect(JSON.parse($.ajax.args[0][0].data)).to.deep.equal(t.request);
+      var args = testHelpers.findAjaxRequest('name', 'config_groups.update_config_group');
+      expect(args[0]).exists;
+      var data = JSON.parse(App.ajax.fakeGetUrl('config_groups.update_config_group').format(args[0].data).data);
+      expect(data).to.deep.equal(t.request);
     });
   });
 
@@ -770,7 +766,6 @@ describe("App.MainServiceInfoConfigsController", function () {
     describe('#bodyClass', function () {
       beforeEach(function() {
         sinon.stub(App.StackService, 'find').returns([{dependentServiceNames: []}]);
-        sinon.stub(App.ajax, 'send', Em.K);
         // default implementation
         bodyView = mainServiceInfoConfigsController.showSaveConfigsPopup().get('bodyClass').create({
           parentView: Em.View.create()
@@ -778,13 +773,13 @@ describe("App.MainServiceInfoConfigsController", function () {
       });
 
       afterEach(function() {
-        App.ajax.send.restore();
         App.StackService.find.restore();
       });
 
       describe('#componentsFilterSuccessCallback', function () {
         it('check components with unknown state', function () {
           bodyView = mainServiceInfoConfigsController.showSaveConfigsPopup('', true, '', {}, '', 'unknown', '').get('bodyClass').create({
+            didInsertElement: Em.K,
             parentView: Em.View.create()
           });
           bodyView.componentsFilterSuccessCallback({

http://git-wip-us.apache.org/repos/asf/ambari/blob/ddf479ef/ambari-web/test/controllers/main/service/info/summary_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/controllers/main/service/info/summary_test.js b/ambari-web/test/controllers/main/service/info/summary_test.js
index 868cf67..51dd595 100644
--- a/ambari-web/test/controllers/main/service/info/summary_test.js
+++ b/ambari-web/test/controllers/main/service/info/summary_test.js
@@ -18,7 +18,7 @@
 
 var App = require('app');
 require('controllers/main/service/info/summary');
-
+var testHelpers = require('test/helpers');
 function getController() {
   return App.MainServiceInfoSummaryController.create();
 }
@@ -134,102 +134,6 @@ App.TestAliases.testAsComputedOr(getController(), 'showTimeRangeControl', ['!isS
 
   });
 
-  describe('#getRangerPluginsStatus', function () {
-
-    var data = {
-        'Clusters': {
-          'desired_configs': {
-            'ranger-hdfs-plugin-properties': {
-              'tag': 'version1'
-            },
-            'hive-env': {
-              'tag': 'version2'
-            },
-            'ranger-hbase-plugin-properties': {
-              'tag': 'version3'
-            }
-          }
-        }
-      },
-      cases = [
-        {
-          isPreviousRangerConfigsCallFailed: false,
-          ajaxRequestSent: true,
-          title: 'initial case'
-        },
-        {
-          isPreviousRangerConfigsCallFailed: true,
-          hdfsTag: 'version1',
-          hiveTag: 'version2',
-          hbaseTag: 'version3',
-          ajaxRequestSent: true,
-          title: 'previous call failed'
-        },
-        {
-          isPreviousRangerConfigsCallFailed: false,
-          hdfsTag: 'version2',
-          hiveTag: 'version2',
-          hbaseTag: 'version3',
-          ajaxRequestSent: true,
-          title: 'configs changed'
-        },
-        {
-          isPreviousRangerConfigsCallFailed: false,
-          hdfsTag: 'version1',
-          hiveTag: 'version2',
-          hbaseTag: 'version3',
-          ajaxRequestSent: false,
-          title: 'configs unchanged'
-        }
-      ];
-
-    beforeEach(function () {
-      sinon.stub(App.ajax, 'send', Em.K);
-      sinon.stub(App.Service, 'find').returns([
-        Em.Object.create({
-          serviceName: 'HDFS'
-        }),
-        Em.Object.create({
-          serviceName: 'HIVE'
-        }),
-        Em.Object.create({
-          serviceName: 'HBASE'
-        }),
-        Em.Object.create({
-          serviceName: 'YARN'
-        })
-      ]);
-    });
-
-    afterEach(function () {
-      App.ajax.send.restore();
-      App.Service.find.restore();
-    });
-
-    cases.forEach(function (item) {
-      describe(item.title, function () {
-
-        beforeEach(function () {
-          controller.set('isPreviousRangerConfigsCallFailed', item.isPreviousRangerConfigsCallFailed);
-          controller.get('rangerPlugins').findProperty('serviceName', 'HDFS').tag = item.hdfsTag;
-          controller.get('rangerPlugins').findProperty('serviceName', 'HBASE').tag = item.hbaseTag;
-          controller.getRangerPluginsStatus(data);
-        });
-
-        it('1 request is ' + item.ajaxRequestSent + ' sent', function () {
-          expect(App.ajax.send.calledOnce).to.equal(item.ajaxRequestSent);
-        });
-
-        if (item.ajaxRequestSent) {
-          it('request does not contains `ranger-yarn-plugin-properties`', function () {
-            expect(App.ajax.send.getCall(0).args[0].data.urlParams.contains('ranger-yarn-plugin-properties')).to.be.false;
-          });
-        }
-      });
-    });
-
-  });
-
   describe('#getRangerPluginsStatusSuccess', function () {
 
     beforeEach(function () {
@@ -281,19 +185,14 @@ App.TestAliases.testAsComputedOr(getController(), 'showTimeRangeControl', ['!isS
   });
 
   describe("#getActiveWidgetLayout() for Enhanced Dashboard", function () {
-    before(function () {
-      sinon.stub(App.ajax, 'send');
-    });
-    after(function () {
-      App.ajax.send.restore();
-    });
+
     it("make GET call", function () {
       var _controller = App.MainServiceInfoSummaryController.create({
         isServiceWithEnhancedWidgets: true,
         content: Em.Object.create({serviceName: 'HDFS'})
       });
       _controller.getActiveWidgetLayout();
-      expect(App.ajax.send.getCall(0).args[0].name).to.equal('widgets.layouts.active.get');
+      expect(testHelpers.findAjaxRequest('name', 'widgets.layouts.active.get')).to.exists;
     });
   });
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/ddf479ef/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 55d27f7..e361bc7 100644
--- a/ambari-web/test/controllers/main/service/item_test.js
+++ b/ambari-web/test/controllers/main/service/item_test.js
@@ -27,6 +27,7 @@ require('controllers/global/cluster_controller');
 require('controllers/main/service/reassign_controller');
 require('controllers/main/service/item');
 var batchUtils = require('utils/batch_scheduled_requests');
+var testHelpers = require('test/helpers');
 
 describe('App.MainServiceItemController', function () {
 
@@ -977,12 +978,10 @@ describe('App.MainServiceItemController', function () {
   describe("#runSmokeTestPrimary", function () {
     beforeEach(function () {
       sinon.stub(App, 'get').withArgs('clusterName').returns('myCluster');
-      sinon.spy($, 'ajax');
     });
 
     afterEach(function () {
       App.get.restore();
-      $.ajax.restore();
     });
 
     var tests = [
@@ -1026,11 +1025,13 @@ describe('App.MainServiceItemController', function () {
           mainServiceItemController.set("runSmokeTestErrorCallBack", Em.K);
           mainServiceItemController.set("runSmokeTestSuccessCallBack", Em.K);
           mainServiceItemController.runSmokeTestPrimary(test.data.query);
-          this.data = JSON.parse($.ajax.args[0][0].data);
+          this.args = testHelpers.findAjaxRequest('name', 'service.item.smoke')[0];
+          this.data = this.args.data;
+          this.data = JSON.parse(App.ajax.fakeGetUrl('service.item.smoke').format(this.data).data);
         });
 
         it('ajax request is sent', function () {
-          expect($.ajax.calledOnce).to.equal(true);
+          expect(this.args).exists;
         });
 
         it('RequestInfo.context is valid', function () {
@@ -1284,22 +1285,16 @@ describe('App.MainServiceItemController', function () {
 
     beforeEach(function() {
       mainServiceItemController = App.MainServiceItemController.create({});
-      sinon.stub(App.ajax, 'send');
-    });
-    afterEach(function() {
-      App.ajax.send.restore();
     });
 
     it("App.ajax.send should be called", function() {
       mainServiceItemController.deleteServiceCall('S1');
-      expect(App.ajax.send.getCall(0).args[0]).to.eql({
-        name : 'service.item.delete',
-        sender: mainServiceItemController,
-        data : {
-          serviceName : 'S1'
-        },
-        success : 'deleteServiceCallSuccessCallback'
-      })
+      var args = testHelpers.findAjaxRequest('name', 'service.item.delete');
+      expect(args[0]).exists;
+      expect(args[0].sender).to.be.eql(mainServiceItemController);
+      expect(args[0].data).to.be.eql({
+        serviceName : 'S1'
+      });
     });
   });
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/ddf479ef/ambari-web/test/controllers/main/service/reassign/step1_controller_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/controllers/main/service/reassign/step1_controller_test.js b/ambari-web/test/controllers/main/service/reassign/step1_controller_test.js
index f4a9714..a43d91f 100644
--- a/ambari-web/test/controllers/main/service/reassign/step1_controller_test.js
+++ b/ambari-web/test/controllers/main/service/reassign/step1_controller_test.js
@@ -20,6 +20,7 @@ var App = require('app');
 
 require('controllers/main/service/reassign/step1_controller');
 require('models/host_component');
+var testHelpers = require('test/helpers');
 
 describe('App.ReassignMasterWizardStep1Controller', function () {
 
@@ -34,19 +35,17 @@ describe('App.ReassignMasterWizardStep1Controller', function () {
 
   describe('#loadConfigTags', function() {
     beforeEach(function() {
-      sinon.stub(App.ajax, 'send', Em.K);
       this.stub = sinon.stub(App.router, 'get');
     });
 
     afterEach(function() {
-      App.ajax.send.restore();
       this.stub.restore();
     });
 
     it('tests loadConfigTags', function() {
       controller.loadConfigsTags();
-
-      expect(App.ajax.send.calledOnce).to.be.true;
+      var args = testHelpers.findAjaxRequest('name', 'config.tags');
+      expect(args).exists;
     });
 
     it('tests saveDatabaseType with type', function() {
@@ -203,29 +202,25 @@ describe('App.ReassignMasterWizardStep1Controller', function () {
   describe("#onLoadConfigsTags()", function () {
     beforeEach(function () {
       this.mock = sinon.stub(controller, 'getConfigUrlParams');
-      sinon.stub(App.ajax, 'send');
     });
     afterEach(function () {
       this.mock.restore();
-      App.ajax.send.restore();
     });
     it("empty params", function () {
       this.mock.returns([]);
       controller.onLoadConfigsTags();
-      expect(App.ajax.send.called).to.be.false;
+      var args = testHelpers.findAjaxRequest('name', 'reassign.load_configs');
+      expect(args).not.exists;
     });
     it("correct params", function () {
       this.mock.returns(['p1', 'p2']);
       controller.onLoadConfigsTags();
-      expect(App.ajax.send.calledWith({
-        name: 'reassign.load_configs',
-        sender: controller,
-        data: {
-          urlParams: 'p1|p2'
-        },
-        success: 'onLoadConfigs',
-        error: ''
-      })).to.be.true;
+      var args = testHelpers.findAjaxRequest('name', 'reassign.load_configs');
+      expect(args[0]).exists;
+      expect(args[0].sender).to.be.eql(controller);
+      expect(args[0].data).to.be.eql({
+        urlParams: 'p1|p2'
+      });
     });
   });
 });

http://git-wip-us.apache.org/repos/asf/ambari/blob/ddf479ef/ambari-web/test/controllers/main/service/reassign/step4_controller_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/controllers/main/service/reassign/step4_controller_test.js b/ambari-web/test/controllers/main/service/reassign/step4_controller_test.js
index e920ace..945718f 100644
--- a/ambari-web/test/controllers/main/service/reassign/step4_controller_test.js
+++ b/ambari-web/test/controllers/main/service/reassign/step4_controller_test.js
@@ -19,6 +19,7 @@
 var App = require('app');
 
 require('controllers/main/service/reassign/step4_controller');
+var testHelpers = require('test/helpers');
 
 describe('App.ReassignMasterWizardStep4Controller', function () {
 
@@ -29,13 +30,6 @@ describe('App.ReassignMasterWizardStep4Controller', function () {
     })
   });
 
-  beforeEach(function () {
-    sinon.stub(App.ajax, 'send', Em.K);
-  });
-  afterEach(function () {
-    App.ajax.send.restore();
-  });
-
   describe('#setAdditionalConfigs()', function () {
 
     beforeEach(function () {
@@ -149,8 +143,8 @@ describe('App.ReassignMasterWizardStep4Controller', function () {
 
     it('tests prepareDBCheckAction', function() {
       controller.prepareDBCheckAction();
-
-      expect(App.ajax.send.calledOnce).to.be.true;
+      var args = testHelpers.findAjaxRequest('name', 'cluster.custom_action.create');
+      expect(args).exists;
     });
 
   });
@@ -427,7 +421,8 @@ describe('App.ReassignMasterWizardStep4Controller', function () {
   describe('#stopServices()', function () {
     it('request is sent', function () {
       controller.stopServices();
-      expect(App.ajax.send.calledOnce).to.be.true;
+      var args = testHelpers.findAjaxRequest('name', 'common.services.update');
+      expect(args).exists;
     });
   });
 
@@ -486,13 +481,15 @@ describe('App.ReassignMasterWizardStep4Controller', function () {
     it('No host-components', function () {
       controller.set('hostComponents', []);
       controller.putHostComponentsInMaintenanceMode();
-      expect(App.ajax.send.called).to.be.false;
+      var args = testHelpers.findAjaxRequest('name', 'common.host.host_component.passive');
+      expect(args).not.exists;
       expect(controller.get('multiTaskCounter')).to.equal(0);
     });
     it('One host-components', function () {
       controller.set('hostComponents', [{}]);
       controller.putHostComponentsInMaintenanceMode();
-      expect(App.ajax.send.calledOnce).to.be.true;
+      var args = testHelpers.findAjaxRequest('name', 'common.host.host_component.passive');
+      expect(args).exists;
       expect(controller.get('multiTaskCounter')).to.equal(0);
     });
   });
@@ -544,7 +541,8 @@ describe('App.ReassignMasterWizardStep4Controller', function () {
   describe('#loadConfigsTags()', function () {
     it('request is sent', function () {
       controller.loadConfigsTags();
-      expect(App.ajax.send.calledOnce).to.be.true;
+      var args = testHelpers.findAjaxRequest('name', 'config.tags');
+      expect(args).exists;
     });
   });
 
@@ -700,6 +698,7 @@ describe('App.ReassignMasterWizardStep4Controller', function () {
       });
       controller.set('content.reassign.component_name', 'COMP1');
       controller.onLoadConfigsTags({});
+      this.args = testHelpers.findAjaxRequest('name', 'reassign.load_configs');
     });
 
     afterEach(function () {
@@ -707,7 +706,7 @@ describe('App.ReassignMasterWizardStep4Controller', function () {
     });
 
     it('request is sent', function () {
-      expect(App.ajax.send.calledOnce).to.be.true;
+      expect(this.args).exists;
     });
 
     it('getConfigUrlParams is called with correct data', function () {
@@ -770,6 +769,7 @@ describe('App.ReassignMasterWizardStep4Controller', function () {
     beforeEach(function () {
       sinon.stub(controller, 'getServiceConfigData', Em.K);
       controller.saveConfigsToServer([1]);
+      this.args = testHelpers.findAjaxRequest('name', 'common.across.services.configurations');
     });
     afterEach(function () {
       controller.getServiceConfigData.restore();
@@ -778,7 +778,7 @@ describe('App.ReassignMasterWizardStep4Controller', function () {
       expect(controller.getServiceConfigData.calledWith([1])).to.be.true;
     });
     it('request is sent', function () {
-      expect(App.ajax.send.calledOnce).to.be.true;
+      expect(this.args).exists;
     });
   });
 
@@ -966,12 +966,13 @@ describe('App.ReassignMasterWizardStep4Controller', function () {
     beforeEach(function () {
       sinon.stub(App.router, 'get').returns({"skip.service.checks": "false"});
       controller.startServices();
+      this.args = testHelpers.findAjaxRequest('name', 'common.services.update');
     });
     afterEach(function () {
       App.router.get.restore();
     });
     it('request is sent', function () {
-      expect(App.ajax.send.calledOnce).to.be.true;
+      expect(this.args).exists;
     });
   });
 
@@ -981,17 +982,20 @@ describe('App.ReassignMasterWizardStep4Controller', function () {
       controller.set('hostComponents', []);
       controller.set('content.reassignHosts.source', 'host1');
       controller.deleteHostComponents();
-      expect(App.ajax.send.called).to.be.false;
+      var args = testHelpers.findAjaxRequest('name', 'common.delete.host_component');
+      expect(args).not.exists;
     });
     it('delete two components', function () {
       controller.set('hostComponents', [1, 2]);
       controller.set('content.reassignHosts.source', 'host1');
       controller.deleteHostComponents();
-      expect(App.ajax.send.getCall(0).args[0].data).to.eql({
+      var args = testHelpers.filterAjaxRequests('name', 'common.delete.host_component');
+      expect(args).to.have.property('length').equal(2);
+      expect(args[0][0].data).to.eql({
         "hostName": "host1",
         "componentName": 1
       });
-      expect(App.ajax.send.getCall(1).args[0].data).to.eql({
+      expect(args[1][0].data).to.eql({
         "hostName": "host1",
         "componentName": 2
       });
@@ -1138,30 +1142,24 @@ describe('App.ReassignMasterWizardStep4Controller', function () {
     it('component_name is C1', function () {
       controller.set('content.reassign.component_name', 'C1');
       controller.cleanMySqlServer();
-      expect(App.ajax.send.calledWith({
-        name: 'service.mysql.clean',
-        sender: controller,
-        data: {
-          host: 'host1'
-        },
-        success: 'startPolling',
-        error: 'onTaskError'
-      })).to.be.true;
+      var args = testHelpers.findAjaxRequest('name', 'service.mysql.clean');
+      expect(args[0]).exists;
+      expect(args[0].sender).to.be.eql(controller);
+      expect(args[0].data).to.be.eql({
+        host: 'host1'
+      });
     });
 
     it('component_name is MYSQL_SERVER', function () {
       controller.set('content.reassign.component_name', 'MYSQL_SERVER');
       controller.set('content.reassignHosts.target', 'host2');
       controller.cleanMySqlServer();
-      expect(App.ajax.send.calledWith({
-        name: 'service.mysql.clean',
-        sender: controller,
-        data: {
-          host: 'host2'
-        },
-        success: 'startPolling',
-        error: 'onTaskError'
-      })).to.be.true;
+      var args = testHelpers.findAjaxRequest('name', 'service.mysql.clean');
+      expect(args[0]).exists;
+      expect(args[0].sender).to.be.eql(controller);
+      expect(args[0].data).to.be.eql({
+        host: 'host2'
+      });
     });
   });
 
@@ -1183,30 +1181,24 @@ describe('App.ReassignMasterWizardStep4Controller', function () {
     it('component_name is C1', function () {
       controller.set('content.reassign.component_name', 'C1');
       controller.configureMySqlServer();
-      expect(App.ajax.send.calledWith({
-        name: 'service.mysql.configure',
-        sender: controller,
-        data: {
-          host: 'host1'
-        },
-        success: 'startPolling',
-        error: 'onTaskError'
-      })).to.be.true;
+      var args = testHelpers.findAjaxRequest('name', 'service.mysql.configure');
+      expect(args[0]).exists;
+      expect(args[0].sender).to.be.eql(controller);
+      expect(args[0].data).to.be.eql({
+        host: 'host1'
+      });
     });
 
     it('component_name is MYSQL_SERVER', function () {
       controller.set('content.reassign.component_name', 'MYSQL_SERVER');
       controller.set('content.reassignHosts.target', 'host2');
       controller.configureMySqlServer();
-      expect(App.ajax.send.calledWith({
-        name: 'service.mysql.configure',
-        sender: controller,
-        data: {
-          host: 'host2'
-        },
-        success: 'startPolling',
-        error: 'onTaskError'
-      })).to.be.true;
+      var args = testHelpers.findAjaxRequest('name', 'service.mysql.configure');
+      expect(args[0]).exists;
+      expect(args[0].sender).to.be.eql(controller);
+      expect(args[0].data).to.be.eql({
+        host: 'host2'
+      });
     });
   });
 
@@ -1243,21 +1235,18 @@ describe('App.ReassignMasterWizardStep4Controller', function () {
     });
     it("valid request is sent", function() {
       controller.startMySqlServer();
-      expect(App.ajax.send.calledWith({
-        name: 'common.host.host_component.update',
-        sender: controller,
-        data: {
-          context: "Start MySQL Server",
-          hostName: 'host1',
-          serviceName: "HIVE",
-          componentName: "MYSQL_SERVER",
-          HostRoles: {
-            state: "STARTED"
-          }
-        },
-        success: 'startPolling',
-        error: 'onTaskError'
-      })).to.be.true;
+      var args = testHelpers.findAjaxRequest('name', 'common.host.host_component.update');
+      expect(args[0]).exists;
+      expect(args[0].sender).to.be.eql(controller);
+      expect(args[0].data).to.be.eql({
+        context: "Start MySQL Server",
+        hostName: 'host1',
+        serviceName: "HIVE",
+        componentName: "MYSQL_SERVER",
+        HostRoles: {
+          state: "STARTED"
+        }
+      });
     });
   });
 
@@ -1280,26 +1269,23 @@ describe('App.ReassignMasterWizardStep4Controller', function () {
         })
       }));
       controller.restartMySqlServer();
-      expect(App.ajax.send.calledWith({
-        name: 'restart.hostComponents',
-        sender: controller,
-        data: {
-          context: 'Restart MySql Server',
-          resource_filters: [{
-            component_name: "MYSQL_SERVER",
-            hosts: 'host1',
-            service_name: "HIVE"
-          }],
-          operation_level: {
-            level: "HOST_COMPONENT",
-            cluster_name: 'cl1',
-            service_name: "HIVE",
-            hostcomponent_name: "MYSQL_SERVER"
-          }
-        },
-        success: 'startPolling',
-        error: 'onTaskError'
-      })).to.be.true;
+      var args = testHelpers.findAjaxRequest('name', 'restart.hostComponents');
+      expect(args[0]).exists;
+      expect(args[0].sender).to.be.eql(controller);
+      expect(args[0].data).to.be.eql({
+        context: 'Restart MySql Server',
+        resource_filters: [{
+          component_name: "MYSQL_SERVER",
+          hosts: 'host1',
+          service_name: "HIVE"
+        }],
+        operation_level: {
+          level: "HOST_COMPONENT",
+          cluster_name: 'cl1',
+          service_name: "HIVE",
+          hostcomponent_name: "MYSQL_SERVER"
+        }
+      });
     });
   });
 
@@ -1312,24 +1298,21 @@ describe('App.ReassignMasterWizardStep4Controller', function () {
         })
       }));
       controller.startNewMySqlServer();
+      this.args = testHelpers.findAjaxRequest('name', 'common.host.host_component.update');
     });
 
     it('valid request is sent', function() {
-      expect(App.ajax.send.calledWith({
-        name: 'common.host.host_component.update',
-        sender: controller,
-        data: {
-          context: "Start MySQL Server",
-          hostName: 'host1',
-          serviceName: "HIVE",
-          componentName: "MYSQL_SERVER",
-          HostRoles: {
-            state: "STARTED"
-          }
-        },
-        success: 'startPolling',
-        error: 'onTaskError'
-      })).to.be.true;
+      expect(this.args[0]).exists;
+      expect(this.args[0].sender).to.be.eql(controller);
+      expect(this.args[0].data).to.be.eql({
+        context: "Start MySQL Server",
+        hostName: 'host1',
+        serviceName: "HIVE",
+        componentName: "MYSQL_SERVER",
+        HostRoles: {
+          state: "STARTED"
+        }
+      });
     });
   });
 
@@ -1598,17 +1581,15 @@ describe('App.ReassignMasterWizardStep4Controller', function () {
         preparedDBProperties: {}
       });
       controller.prepareDBCheckAction();
+      this.args = testHelpers.findAjaxRequest('name', 'cluster.custom_action.create');
     });
     afterEach(function () {
       App.router.get.restore();
       controller.getConnectionProperty.restore();
     });
     it('valid request is sent', function () {
-      var callArgs = App.ajax.send.getCall(0).args[0];
-      expect(callArgs.name).to.equal('cluster.custom_action.create');
-      expect(callArgs.success).to.equal('onCreateActionSuccess');
-      expect(callArgs.error).to.equal('onTaskError');
-      expect(callArgs.data).to.eql({
+      expect(this.args[0]).exists;
+      expect(this.args[0].data).to.eql({
         requestInfo: {
           "context": "Check host",
           "action": "check_host",

http://git-wip-us.apache.org/repos/asf/ambari/blob/ddf479ef/ambari-web/test/controllers/main/service/reassign/step6_controller_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/controllers/main/service/reassign/step6_controller_test.js b/ambari-web/test/controllers/main/service/reassign/step6_controller_test.js
index 9ab1144..5591347 100644
--- a/ambari-web/test/controllers/main/service/reassign/step6_controller_test.js
+++ b/ambari-web/test/controllers/main/service/reassign/step6_controller_test.js
@@ -20,6 +20,7 @@ App = require('app');
 
 require('controllers/main/service/reassign/step6_controller');
 var controller;
+var testHelpers = require('test/helpers');
 
 describe('App.ReassignMasterWizardStep6Controller', function () {
 
@@ -31,12 +32,7 @@ describe('App.ReassignMasterWizardStep6Controller', function () {
       }),
       startServices: Em.K
     });
-    sinon.stub(App.ajax, 'send', Em.K);
   });
-  afterEach(function () {
-    App.ajax.send.restore();
-  });
-
 
   describe('#initializeTasks()', function () {
     it('No commands', function () {
@@ -155,17 +151,20 @@ describe('App.ReassignMasterWizardStep6Controller', function () {
       controller.set('hostComponents', []);
       controller.set('content.reassignHosts.source', 'host1');
       controller.deleteHostComponents();
-      expect(App.ajax.send.called).to.be.false;
+      var args = testHelpers.findAjaxRequest('name', 'common.delete.host_component');
+      expect(args).not.exists;
     });
     it('delete two components', function () {
       controller.set('hostComponents', [1, 2]);
       controller.set('content.reassignHosts.source', 'host1');
       controller.deleteHostComponents();
-      expect(App.ajax.send.getCall(0).args[0].data).to.eql({
+      var args = testHelpers.filterAjaxRequests('name', 'common.delete.host_component');
+      expect(args).to.have.property('length').equal(2);
+      expect(args[0][0].data).to.eql({
         "hostName": "host1",
         "componentName": 1
       });
-      expect(App.ajax.send.getCall(1).args[0].data).to.eql({
+      expect(args[1][0].data).to.eql({
         "hostName": "host1",
         "componentName": 2
       });
@@ -201,7 +200,8 @@ describe('App.ReassignMasterWizardStep6Controller', function () {
   describe('#stopMysqlService()', function () {
     it('stopMysqlService', function () {
       controller.stopMysqlService();
-      expect(App.ajax.send.calledOnce).to.be.true;
+      var args = testHelpers.findAjaxRequest('name', 'common.host.host_component.update');
+      expect(args[0]).exists;
     });
   });
 
@@ -216,13 +216,15 @@ describe('App.ReassignMasterWizardStep6Controller', function () {
     it('No host-components', function () {
       controller.set('hostComponents', []);
       controller.putHostComponentsInMaintenanceMode();
-      expect(App.ajax.send.called).to.be.false;
+      var args = testHelpers.findAjaxRequest('name', 'common.host.host_component.passive');
+      expect(args).not.exists;
       expect(controller.get('multiTaskCounter')).to.equal(0);
     });
     it('One host-components', function () {
       controller.set('hostComponents', [{}]);
       controller.putHostComponentsInMaintenanceMode();
-      expect(App.ajax.send.calledOnce).to.be.true;
+      var args = testHelpers.findAjaxRequest('name', 'common.host.host_component.passive');
+      expect(args).exists;
       expect(controller.get('multiTaskCounter')).to.equal(0);
     });
   });

http://git-wip-us.apache.org/repos/asf/ambari/blob/ddf479ef/ambari-web/test/controllers/main/service/reassign/step7_controller_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/controllers/main/service/reassign/step7_controller_test.js b/ambari-web/test/controllers/main/service/reassign/step7_controller_test.js
index 238ebea..6f16f0f 100644
--- a/ambari-web/test/controllers/main/service/reassign/step7_controller_test.js
+++ b/ambari-web/test/controllers/main/service/reassign/step7_controller_test.js
@@ -20,11 +20,11 @@ App = require('app');
 
 require('controllers/main/service/reassign/step7_controller');
 var controller;
+var testHelpers = require('test/helpers');
 
 describe('App.ReassignMasterWizardStep7Controller', function () {
 
   beforeEach(function () {
-    sinon.stub(App.ajax, 'send', Em.K);
     controller = App.ReassignMasterWizardStep7Controller.create({
       content: Em.Object.create({
         reassign: Em.Object.create(),
@@ -32,9 +32,6 @@ describe('App.ReassignMasterWizardStep7Controller', function () {
       })
     });
   });
-  afterEach(function () {
-    App.ajax.send.restore();
-  });
 
   describe('#initializeTasks()', function () {
     it('should set isLoaded to true', function () {
@@ -49,30 +46,29 @@ describe('App.ReassignMasterWizardStep7Controller', function () {
     it("no host-components", function() {
       controller.set('hostComponents', []);
       controller.putHostComponentsInMaintenanceMode();
-      expect(App.ajax.send.called).to.be.false;
+      var args = testHelpers.findAjaxRequest('name', 'common.host.host_component.passive');
+      expect(args).not.exists;
       expect(controller.get('multiTaskCounter')).to.equal(0);
     });
     it("one host-component", function() {
       controller.set('hostComponents', ['C1']);
       controller.set('content.reassignHosts.target', 'host1');
       controller.putHostComponentsInMaintenanceMode();
-      expect(App.ajax.send.calledWith({
-        name: 'common.host.host_component.passive',
-        sender: controller,
-        data: {
-          hostName: 'host1',
-          passive_state: "ON",
-          componentName: 'C1'
-        },
-        success: 'onComponentsTasksSuccess',
-        error: 'onTaskError'
-      })).to.be.true;
+      var args = testHelpers.findAjaxRequest('name', 'common.host.host_component.passive');
+      expect(args[0]).exists;
+      expect(args[0].sender).to.be.eql(controller);
+      expect(args[0].data).to.be.eql({
+        hostName: 'host1',
+        passive_state: "ON",
+        componentName: 'C1'
+      });
       expect(controller.get('multiTaskCounter')).to.equal(0);
     });
     it("two host-components", function() {
       controller.set('hostComponents', ['C1', 'C2']);
       controller.putHostComponentsInMaintenanceMode();
-      expect(App.ajax.send.calledTwice).to.be.true;
+      var args = testHelpers.filterAjaxRequests('name', 'common.host.host_component.passive');
+      expect(args).to.have.property('length').equal(2);
       expect(controller.get('multiTaskCounter')).to.equal(0);
     });
   });
@@ -81,29 +77,28 @@ describe('App.ReassignMasterWizardStep7Controller', function () {
     it("no host-components", function() {
       controller.set('hostComponents', []);
       controller.deleteHostComponents();
-      expect(App.ajax.send.called).to.be.false;
+      var args = testHelpers.findAjaxRequest('name', 'common.delete.host_component');
+      expect(args).not.exists;
       expect(controller.get('multiTaskCounter')).to.equal(0);
     });
     it("one host-component", function() {
       controller.set('hostComponents', ['C1']);
       controller.set('content.reassignHosts.target', 'host1');
       controller.deleteHostComponents();
-      expect(App.ajax.send.calledWith({
-        name: 'common.delete.host_component',
-        sender: controller,
-        data: {
-          hostName: 'host1',
-          componentName: 'C1'
-        },
-        success: 'onComponentsTasksSuccess',
-        error: 'onDeleteHostComponentsError'
-      })).to.be.true;
+      var args = testHelpers.findAjaxRequest('name', 'common.delete.host_component');
+      expect(args[0]).exists;
+      expect(args[0].sender).to.be.eql(controller);
+      expect(args[0].data).to.be.eql({
+        hostName: 'host1',
+        componentName: 'C1'
+      });
       expect(controller.get('multiTaskCounter')).to.equal(0);
     });
     it("two host-components", function() {
       controller.set('hostComponents', ['C1', 'C2']);
       controller.deleteHostComponents();
-      expect(App.ajax.send.calledTwice).to.be.true;
+      var args = testHelpers.filterAjaxRequests('name', 'common.delete.host_component');
+      expect(args).to.have.property('length').equal(2);
       expect(controller.get('multiTaskCounter')).to.equal(0);
     });
   });

http://git-wip-us.apache.org/repos/asf/ambari/blob/ddf479ef/ambari-web/test/controllers/main/service_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/controllers/main/service_test.js b/ambari-web/test/controllers/main/service_test.js
index 0e7f464..60e0e4d 100644
--- a/ambari-web/test/controllers/main/service_test.js
+++ b/ambari-web/test/controllers/main/service_test.js
@@ -19,6 +19,7 @@
 var App = require('app');
 require('controllers/main/service');
 
+var testHelpers = require('test/helpers');
 var mainServiceController;
 
 function getController() {
@@ -82,6 +83,10 @@ describe('App.MainServiceController', function () {
     mainServiceController = getController();
   });
 
+  afterEach(function () {
+    mainServiceController.destroy();
+  });
+
   App.TestAliases.testAsComputedNotEqual(getController(), 'isStartStopAllClicked', 'App.router.backgroundOperationsController.allOperationsCount', 0);
 
   describe('#isStartAllDisabled', function () {
@@ -277,28 +282,23 @@ describe('App.MainServiceController', function () {
       query = 'some query';
 
     beforeEach(function() {
-      sinon.stub($, 'ajax', Em.K);
       sinon.stub(App, 'get', function(k) {
-        if ('testMode' === k) return false;
         if ('clusterName' === k) return 'tdk';
         return Em.get(App, k);
       });
       mainServiceController.allServicesCall(state, query);
-      this.params = $.ajax.args[0][0];
+      var args = testHelpers.findAjaxRequest('name', 'common.services.update');
+      this.params = App.ajax.fakeGetUrl('common.services.update').format(args[0].data);
       this.data = JSON.parse(this.params.data);
     });
 
     afterEach(function() {
-      $.ajax.restore();
       App.get.restore();
     });
 
     it('PUT request is sent', function() {
       expect(this.params.type).to.equal('PUT');
     });
-    it('request is sent to `/services`', function() {
-      expect(this.params.url.contains('/clusters/tdk/services?')).to.be.true;
-    });
     it('Body.ServiceInfo.state is ' + state, function() {
       expect(this.data.Body.ServiceInfo.state).to.equal(state);
     });
@@ -408,21 +408,4 @@ describe('App.MainServiceController', function () {
 
   });
 
-  describe('#restartHostComponents', function () {
-
-    beforeEach(function () {
-      sinon.stub(App.ajax, 'send', Em.K);
-    });
-
-    afterEach(function () {
-      App.ajax.send.restore();
-    });
-
-    it('should send ajax request', function () {
-      mainServiceController.restartHostComponents();
-      expect(App.ajax.send.calledOnce).to.be.true;
-    });
-
-  });
-
 });

http://git-wip-us.apache.org/repos/asf/ambari/blob/ddf479ef/ambari-web/test/controllers/main/views_controller_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/controllers/main/views_controller_test.js b/ambari-web/test/controllers/main/views_controller_test.js
index 85c7521..41384d3 100644
--- a/ambari-web/test/controllers/main/views_controller_test.js
+++ b/ambari-web/test/controllers/main/views_controller_test.js
@@ -18,6 +18,7 @@
 
 var App = require('app');
 require('controllers/main/views_controller');
+var testHelpers = require('test/helpers');
 
 var mainViewsController;
 describe('MainViewsController', function () {
@@ -28,24 +29,24 @@ describe('MainViewsController', function () {
 
   describe('#loadAmbariViews()', function () {
     beforeEach(function () {
-      sinon.stub(App.ajax, 'send', Em.K);
       this.stub = sinon.stub(App.router, 'get');
     });
     afterEach(function () {
       App.router.get.restore();
-      App.ajax.send.restore();
     });
 
     it('should load views if the user is logged in', function () {
       this.stub.withArgs('loggedIn').returns(true);
       mainViewsController.loadAmbariViews();
-      expect(App.ajax.send.calledOnce).to.be.true;
+      var args = testHelpers.findAjaxRequest('name', 'views.info');
+      expect(args).to.exists;
     });
 
     it('should not load views if the user is not logged in', function () {
       this.stub.withArgs('loggedIn').returns(false);
       mainViewsController.loadAmbariViews();
-      expect(App.ajax.send.notCalled).to.be.true;
+      var args = testHelpers.findAjaxRequest('name', 'views.info');
+      expect(args).to.not.exists;
     })
   });
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/ddf479ef/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 0061695..e367201 100644
--- a/ambari-web/test/controllers/main_test.js
+++ b/ambari-web/test/controllers/main_test.js
@@ -16,8 +16,8 @@
  * limitations under the License.
  */
 
-
 var App = require('app');
+var testHelpers = require('test/helpers');
 
 describe('App.MainController', function () {
   var mainController = App.MainController.create();
@@ -132,26 +132,13 @@ describe('App.MainController', function () {
   });
 
   describe('#getServerVersion', function() {
-    var res;
-    beforeEach(function () {
-      sinon.stub(App.ajax, 'send', function(data) {
-        res = JSON.parse(JSON.stringify(data));
-      });
-    });
-    afterEach(function () {
-      App.ajax.send.restore();
-    });
+
     it ('Should send data', function() {
       mainController.getServerVersion();
-      expect(res).to.be.eql({
-        "name": "ambari.service",
-        "sender": {},
-        "data": {
-          "fields": "?fields=RootServiceComponents/component_version,RootServiceComponents/properties/server.os_family&minimal_response=true"
-        },
-        "success": "getServerVersionSuccessCallback",
-        "error": "getServerVersionErrorCallback"
-      });
+      var args = testHelpers.findAjaxRequest('name', 'ambari.service');
+      expect(args[0]).to.exists;
+      expect(args[0].sender).to.be.eql(mainController);
+      expect(args[0].data.fields).to.be.eql('?fields=RootServiceComponents/component_version,RootServiceComponents/properties/server.os_family&minimal_response=true');
     });
   });
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/ddf479ef/ambari-web/test/controllers/wizard/step2_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/controllers/wizard/step2_test.js b/ambari-web/test/controllers/wizard/step2_test.js
index 1a67ca9..63887ab 100644
--- a/ambari-web/test/controllers/wizard/step2_test.js
+++ b/ambari-web/test/controllers/wizard/step2_test.js
@@ -21,6 +21,7 @@ require('controllers/wizard/step2_controller');
 require('models/host');
 require('models/host_component');
 require('messages');
+var testHelpers = require('test/helpers');
 var c;
 
 function getController() {
@@ -582,16 +583,12 @@ describe('App.WizardStep2Controller', function () {
   });
 
   describe('#setAmbariJavaHome', function() {
-    beforeEach(function() {
-      sinon.stub($, 'ajax', Em.K);
-    });
-    afterEach(function() {
-      $.ajax.restore();
-    });
+
     it('should do ajax-request', function() {
       var controller = App.WizardStep2Controller.create({onGetAmbariJavaHomeSuccess: Em.K, onGetAmbariJavaHomeError: Em.K});
       controller.setAmbariJavaHome();
-      expect($.ajax.calledOnce).to.equal(true);
+      var args = testHelpers.findAjaxRequest('name', 'ambari.service');
+      expect(args).exists;
     });
   });
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/ddf479ef/ambari-web/test/controllers/wizard/step3_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/controllers/wizard/step3_test.js b/ambari-web/test/controllers/wizard/step3_test.js
index 7b6684f..8c2fb6f 100644
--- a/ambari-web/test/controllers/wizard/step3_test.js
+++ b/ambari-web/test/controllers/wizard/step3_test.js
@@ -22,6 +22,7 @@ require('utils/ajax/ajax');
 require('utils/http_client');
 require('models/host');
 require('controllers/wizard/step3_controller');
+var testHelpers = require('test/helpers');
 
 function getController() {
   return App.WizardStep3Controller.create({
@@ -41,16 +42,12 @@ describe('App.WizardStep3Controller', function () {
     sinon.stub(App.db, 'getDisplayLength', Em.K);
     sinon.stub(App.db, 'getFilterConditions').returns([]);
     sinon.stub(App.router, 'send', Em.K);
-    sinon.stub(App.ajax, 'send', function () {
-      return {done: Em.K}
-    });
   });
 
   afterEach(function () {
     App.db.getDisplayLength.restore();
     App.router.send.restore();
     App.db.getFilterConditions.restore();
-    App.ajax.send.restore();
   });
 
   App.TestAliases.testAsComputedGt(getController(), 'isHostHaveWarnings', 'warnings.length', 0);
@@ -153,14 +150,6 @@ describe('App.WizardStep3Controller', function () {
 
   describe('#isWarningsBoxVisible', function () {
 
-    beforeEach(function () {
-      sinon.stub(App, 'get').withArgs('testMode').returns(false);
-    });
-
-    afterEach(function () {
-      App.get.restore();
-    });
-
     it('for "real" mode should be based on isRegistrationInProgress', function () {
       c.set('isRegistrationInProgress', false);
       expect(c.get('isWarningsBoxVisible')).to.equal(true);
@@ -259,25 +248,9 @@ describe('App.WizardStep3Controller', function () {
 
     afterEach(function () {
       c.navigateStep.restore();
-      App.set('testMode', false);
-    });
-
-    it('should set isLoaded to true', function () {
-      App.set('testMode', true);
-      c.set('content', {hosts: {}});
-      c.loadHosts();
-      expect(c.get('isLoaded')).to.equal(true);
-    });
-
-    it('should set bootStatus REGISTERED on testMode', function () {
-      App.set('testMode', true);
-      c.set('content', {hosts: {c: {name: 'name'}}});
-      c.loadHosts();
-      expect(c.get('hosts').everyProperty('bootStatus', 'REGISTERED')).to.equal(true);
     });
 
     it('should set bootStatus DONE on "real" mode and when installOptions.manualInstall is selected', function () {
-      App.set('testMode', false);
       c.set('content.installOptions', {manualInstall: true});
       c.set('content.hosts', {c: {name: 'name'}});
       c.loadHosts();
@@ -285,14 +258,12 @@ describe('App.WizardStep3Controller', function () {
     });
 
     it('should set bootStatus PENDING on "real" mode and when installOptions.manualInstall is not selected', function () {
-      App.set('testMode', false);
       c.set('content', {installOptions: {manualInstall: false}, hosts: {c: {name: 'name'}}});
       c.loadHosts();
       expect(c.get('hosts').everyProperty('bootStatus', 'PENDING')).to.equal(true);
     });
 
     it('should set bootStatus PENDING on "real" mode and when installOptions.manualInstall is not selected (2)', function () {
-      App.set('testMode', true);
       c.set('content', {hosts: {c: {name: 'name'}, d: {name: 'name1'}}});
       c.loadHosts();
       expect(c.get('hosts').everyProperty('isChecked', false)).to.equal(true);
@@ -754,14 +725,16 @@ describe('App.WizardStep3Controller', function () {
     it('shouldn\'t do nothing if stopBootstrap is true', function () {
       c.set('stopBootstrap', true);
       c.doBootstrap();
-      expect(App.ajax.send.called).to.equal(false);
+      var args = testHelpers.findAjaxRequest('name', 'wizard.step3.bootstrap');
+      expect(args).not.exists;
     });
 
     it('should increment numPolls if stopBootstrap is false', function () {
       c.set('numPolls', 0);
       c.set('stopBootstrap', false);
       c.doBootstrap();
-      expect(App.ajax.send.calledOnce).to.be.true;
+      var args = testHelpers.findAjaxRequest('name', 'wizard.step3.bootstrap');
+      expect(args).exists;
       expect(c.get('numPolls')).to.equal(1);
     });
 
@@ -796,13 +769,15 @@ describe('App.WizardStep3Controller', function () {
     it('shouldn\'t do nothing if stopBootstrap is true', function () {
       c.set('stopBootstrap', true);
       c.isHostsRegistered();
-      expect(App.ajax.send.called).to.equal(false);
+      var args = testHelpers.findAjaxRequest('name', 'wizard.step3.is_hosts_registered');
+      expect(args).not.exists;
     });
 
     it('should do ajax call if stopBootstrap is false', function () {
       c.set('stopBootstrap', false);
       c.isHostsRegistered();
-      expect(App.ajax.send.called).to.equal(true);
+      var args = testHelpers.findAjaxRequest('name', 'wizard.step3.is_hosts_registered');
+      expect(args).exists;
 
     });
   });
@@ -905,7 +880,8 @@ describe('App.WizardStep3Controller', function () {
 
     it('should call App.ajax.send', function () {
       c.getAllRegisteredHosts();
-      expect(App.ajax.send.calledOnce).to.equal(true);
+      var args = testHelpers.findAjaxRequest('name', 'wizard.step3.is_hosts_registered');
+      expect(args).exists;
     });
   });
 
@@ -1009,7 +985,8 @@ describe('App.WizardStep3Controller', function () {
 
     it('should do ajax request', function () {
       c.getHostInfo();
-      expect(App.ajax.send.calledOnce).to.equal(true);
+      var args = testHelpers.findAjaxRequest('name', 'wizard.step3.host_info');
+      expect(args).exists;
     });
 
   });
@@ -1277,17 +1254,12 @@ describe('App.WizardStep3Controller', function () {
   describe('#parseHostCheckWarnings', function () {
 
     beforeEach(function () {
-      sinon.stub(App, 'get', function (k) {
-        if ('testMode' === k) return false;
-        return Em.get(App, k);
-      });
       sinon.stub(c, 'filterHostsData', function (k) {
         return k;
       });
     });
 
     afterEach(function () {
-      App.get.restore();
       c.filterHostsData.restore();
     });
 
@@ -1775,17 +1747,12 @@ describe('App.WizardStep3Controller', function () {
   describe('#parseWarnings', function () {
 
     beforeEach(function () {
-      sinon.stub(App, 'get', function (k) {
-        if ('testMode' === k) return false;
-        return Em.get(App, k);
-      });
       sinon.stub(c, 'filterBootHosts', function (k) {
         return k;
       });
     });
 
     afterEach(function () {
-      App.get.restore();
       c.filterBootHosts.restore();
     });
 
@@ -2327,17 +2294,12 @@ describe('App.WizardStep3Controller', function () {
           setRegistrationInProgress: Em.K,
           startRegistration: Em.K
         });
-        sinon.stub(App, 'get', function (k) {
-          if ('testMode' === k) return false;
-          return Em.get(App, k);
-        });
         sinon.spy(c, 'startRegistration');
         c.navigateStep();
       });
 
 
       afterEach(function () {
-        App.get.restore();
         c.startRegistration.restore();
       });
 
@@ -2540,7 +2502,6 @@ describe('App.WizardStep3Controller', function () {
       sinon.spy(c, '_setHostDataWithSkipBootstrap');
       sinon.stub(App, 'get', function (k) {
         if ('skipBootstrap' === k) return skipBootstrap;
-        if ('testMode' === k) return false;
         return Em.get(App, k);
       });
       c.reopen({
@@ -2671,17 +2632,6 @@ describe('App.WizardStep3Controller', function () {
 
   describe('#doCheckJDK', function () {
 
-    beforeEach(function () {
-      sinon.stub(App, 'get', function (k) {
-        if ('testMode' === k) return false;
-        return Em.get(App, k);
-      });
-    });
-
-    afterEach(function () {
-      App.get.restore();
-    });
-
     it('should do request to the ambari-server', function () {
 
       var bootHosts = [
@@ -2696,24 +2646,14 @@ describe('App.WizardStep3Controller', function () {
         jdkLocation: jdkLocation
       });
       c.doCheckJDK();
-      expect(App.ajax.send.calledOnce).to.be.true;
+      var args = testHelpers.findAjaxRequest('name', 'wizard.step3.jdk_check');
+      expect(args).exists;
     });
 
   });
 
   describe('#doCheckJDKsuccessCallback', function () {
 
-    beforeEach(function () {
-      sinon.stub(App, 'get', function (k) {
-        if ('testMode' === k) return false;
-        return Em.get(App, k);
-      });
-    });
-
-    afterEach(function () {
-      App.get.restore();
-    });
-
     it('should set jdkRequestIndex if data provided', function () {
 
       var data = {
@@ -2742,7 +2682,8 @@ describe('App.WizardStep3Controller', function () {
       c.set('jdkRequestIndex', jdkRequestIndex);
       c.set('jdkCategoryWarnings', null);
       c.doCheckJDKsuccessCallback(data);
-      expect(App.ajax.send.calledOnce).to.be.true;
+      var args = testHelpers.findAjaxRequest('name', 'wizard.step3.jdk_check.get_results');
+      expect(args).exists;
     });
 
   });
@@ -2834,7 +2775,6 @@ describe('App.WizardStep3Controller', function () {
   describe('#getHostCheckTasksSuccess', function() {
 
     beforeEach(function() {
-      sinon.stub($, 'ajax', Em.K);
       sinon.stub(c, 'getHostInfo', Em.K);
       sinon.stub(c, 'parseHostNameResolution', Em.K);
       sinon.stub(c, 'getGeneralHostCheck', Em.K);
@@ -2843,7 +2783,6 @@ describe('App.WizardStep3Controller', function () {
     });
 
     afterEach(function() {
-      $.ajax.restore();
       c.getHostInfo.restore();
       c.parseHostNameResolution.restore();
       c.getGeneralHostCheck.restore();

http://git-wip-us.apache.org/repos/asf/ambari/blob/ddf479ef/ambari-web/test/controllers/wizard/step6_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/controllers/wizard/step6_test.js b/ambari-web/test/controllers/wizard/step6_test.js
index 4fdd642..61cf879 100644
--- a/ambari-web/test/controllers/wizard/step6_test.js
+++ b/ambari-web/test/controllers/wizard/step6_test.js
@@ -75,15 +75,6 @@ describe('App.WizardStep6Controller', function () {
 
   beforeEach(function () {
     controller = getController();
-    sinon.stub(App.ajax, 'send', function () {
-      return {
-        then: Em.K
-      };
-    });
-  });
-
-  afterEach(function () {
-    App.ajax.send.restore();
   });
 
   App.TestAliases.testAsComputedEqual(getController(), 'isAddHostWizard', 'content.controllerName', 'addHostController');

http://git-wip-us.apache.org/repos/asf/ambari/blob/ddf479ef/ambari-web/test/controllers/wizard/step7_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/controllers/wizard/step7_test.js b/ambari-web/test/controllers/wizard/step7_test.js
index e93d3f7..434a8ba 100644
--- a/ambari-web/test/controllers/wizard/step7_test.js
+++ b/ambari-web/test/controllers/wizard/step7_test.js
@@ -19,6 +19,7 @@
 var App = require('app');
 require('mixins/common/localStorage');
 require('controllers/wizard/step7_controller');
+var testHelpers = require('test/helpers');
 
 var installerStep7Controller,
   issuesFilterCases = [
@@ -108,17 +109,11 @@ function getController() {
 describe('App.InstallerStep7Controller', function () {
 
   beforeEach(function () {
-    sinon.stub(App.ajax, 'send', function () {
-      return {
-        then: Em.K
-      }
-    });
     sinon.stub(App.config, 'setPreDefinedServiceConfigs', Em.K);
     installerStep7Controller = getController();
   });
 
   afterEach(function() {
-    App.ajax.send.restore();
     App.config.setPreDefinedServiceConfigs.restore();
     installerStep7Controller.destroy();
   });
@@ -434,14 +429,16 @@ describe('App.InstallerStep7Controller', function () {
     it('should do ajax request for each received service name', function () {
       var serviceNames = ['s1', 's2', 's3'];
       installerStep7Controller.loadInstalledServicesConfigGroups(serviceNames);
-      expect(App.ajax.send.callCount).to.equal(serviceNames.length);
+      var args = testHelpers.filterAjaxRequests('name', 'config.tags_and_groups');
+      expect(args).to.have.property('length').equal(serviceNames.length);
     });
   });
 
   describe('#getConfigTags', function () {
     it('should do ajax-request', function () {
       installerStep7Controller.getConfigTags();
-      expect(App.ajax.send.calledOnce).to.equal(true);
+      var args = testHelpers.findAjaxRequest('name', 'config.tags');
+      expect(args).exists;
     });
   });
 
@@ -475,7 +472,8 @@ describe('App.InstallerStep7Controller', function () {
   describe('#checkMySQLHost', function () {
     it('should send query', function () {
       installerStep7Controller.checkMySQLHost();
-      expect(App.ajax.send.calledOnce).to.be.true;
+      var args = testHelpers.findAjaxRequest('name', 'ambari.service');
+      expect(args).exists;
     });
   });
 
@@ -2179,7 +2177,7 @@ describe('App.InstallerStep7Controller', function () {
 
     beforeEach(function () {
       installerStep7Controller.loadServiceConfigGroupOverrides(serviceConfigs, loadedGroupToOverrideSiteToTagMap, configGroups);
-      this.args = App.ajax.send.args[0][0].data;
+      this.args = testHelpers.findAjaxRequest('name', 'config.host_overrides')[0].data;
     });
 
     it('url params are valid', function () {

http://git-wip-us.apache.org/repos/asf/ambari/blob/ddf479ef/ambari-web/test/controllers/wizard/step8_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/controllers/wizard/step8_test.js b/ambari-web/test/controllers/wizard/step8_test.js
index 9eb5b1e..b40b91c 100644
--- a/ambari-web/test/controllers/wizard/step8_test.js
+++ b/ambari-web/test/controllers/wizard/step8_test.js
@@ -21,6 +21,7 @@ require('utils/ajax/ajax_queue');
 require('controllers/main/service/info/configs');
 require('controllers/wizard/step8_controller');
 var installerStep8Controller, configurationController;
+var testHelpers = require('test/helpers');
 
 var configs = Em.A([
   Em.Object.create({filename: 'hdfs-site.xml', name: 'p1', value: 'v1'}),
@@ -867,7 +868,6 @@ describe('App.WizardStep8Controller', function () {
 
     beforeEach(function () {
       sinon.stub(App, 'get').withArgs('currentStackName').returns('HDP');
-      sinon.stub(App.ajax, 'send', Em.K);
       sinon.stub(App.StackVersion, 'find', function() {
         return [
           Em.Object.create({state: 'CURRENT', repositoryVersion: {repositoryVersion: '2.3.0.0-2208'}})
@@ -876,14 +876,13 @@ describe('App.WizardStep8Controller', function () {
     });
 
     afterEach(function () {
-      App.ajax.send.restore();
       App.get.restore();
       App.StackVersion.find.restore();
     });
     it('should use current StackVersion', function() {
       installerStep8Controller.loadRepoInfo();
-      var data = App.ajax.send.args[0][0].data;
-      expect(data).to.eql({stackName: 'HDP', repositoryVersion: '2.3.0.0-2208'});
+      var args = testHelpers.findAjaxRequest('name', 'cluster.load_repo_version');
+      expect(args[0].data).to.eql({stackName: 'HDP', repositoryVersion: '2.3.0.0-2208'});
     });
   });
 
@@ -1172,20 +1171,13 @@ describe('App.WizardStep8Controller', function () {
 
   describe('#deleteClusters', function() {
 
-    beforeEach(function () {
-      sinon.stub(App.ajax, 'send', Em.K);
-    });
-
-    afterEach(function () {
-      App.ajax.send.restore();
-    });
-
     it('should call App.ajax.send for each provided clusterName', function() {
       var clusterNames = ['h1', 'h2', 'h3'];
       installerStep8Controller.deleteClusters(clusterNames);
-      expect(App.ajax.send.callCount).to.equal(clusterNames.length);
+      var args = testHelpers.filterAjaxRequests('name', 'common.delete.cluster');
+      expect(args).to.have.property('length').equal(clusterNames.length);
       clusterNames.forEach(function(n, i) {
-        expect(App.ajax.send.getCall(i).args[0].data).to.eql({name: n, isLast: i === clusterNames.length - 1});
+        expect(args[i][0].data).to.eql({name: n, isLast: i === clusterNames.length - 1});
       });
     });
 
@@ -1249,24 +1241,8 @@ describe('App.WizardStep8Controller', function () {
   });
 
   describe('#addRequestToAjaxQueue', function() {
-    describe('testMode = true', function() {
-      before(function() {
-        App.set('testMode', true);
-      });
-      after(function() {
-        App.set('testMode', false);
-      });
-      it('shouldn\'t do nothing', function() {
-        installerStep8Controller.set('ajaxRequestsQueue', App.ajaxQueue.create());
-        installerStep8Controller.get('ajaxRequestsQueue').clear();
-        installerStep8Controller.addRequestToAjaxQueue({});
-        expect(installerStep8Controller.get('ajaxRequestsQueue.queue.length')).to.equal(0);
-      });
-    });
-    describe('testMode = true', function() {
-      before(function() {
-        App.set('testMode', false);
-      });
+
+    describe('testMode = false', function() {
       it('should add request', function() {
         var clusterName = 'c1';
         installerStep8Controller.reopen({clusterName: clusterName});
@@ -1338,39 +1314,27 @@ describe('App.WizardStep8Controller', function () {
 
   describe('#applyInstalledServicesConfigurationGroup', function() {
     beforeEach(function() {
-      sinon.stub($, 'ajax', function () {
-        return {
-          then: Em.K,
-          retry: function () {
-            return {then: Em.K}
-          }
-        }
-      });
       sinon.stub(App.router, 'get', function() {
         return configurationController;
       });
     });
     afterEach(function() {
-      $.ajax.restore();
       App.router.get.restore();
     });
     it('should do ajax request for each config group', function() {
       var configGroups = [{ConfigGroup: {id:''}}, {ConfigGroup: {id:''}}];
       installerStep8Controller.applyInstalledServicesConfigurationGroup(configGroups);
-      expect($.ajax.callCount).to.equal(configGroups.length);
+      var args = testHelpers.filterAjaxRequests('name', 'config_groups.update_config_group');
+      expect(args).to.have.property('length').equal(configGroups.length);
     });
   });
 
   describe('#getExistingClusterNames', function() {
-    beforeEach(function() {
-      sinon.stub(App.ajax, 'send', Em.K);
-    });
-    afterEach(function() {
-      App.ajax.send.restore();
-    });
+
     it('should do ajax request', function() {
       installerStep8Controller.getExistingClusterNames();
-      expect(App.ajax.send.calledOnce).to.be.true;
+      var args = testHelpers.findAjaxRequest('name', 'wizard.step8.existing_cluster_names');
+      expect(args).exists;
     });
   });
 
@@ -1892,8 +1856,6 @@ describe('App.WizardStep8Controller', function () {
     describe('#createNotification', function () {
 
       beforeEach(function () {
-        var stub = sinon.stub(App, 'get');
-        stub.withArgs('testMode').returns(false);
         installerStep8Controller.clearStep();
         installerStep8Controller.set('content', {controllerName: 'installerController'});
         installerStep8Controller.set('configs', [
@@ -1910,21 +1872,14 @@ describe('App.WizardStep8Controller', function () {
           {name: 'some_p', value: 'some_v', serviceName: 'MISC', filename: 'alert_notification'}
         ]);
         installerStep8Controller.get('ajaxRequestsQueue').clear();
-        sinon.stub(App.ajax, 'send', function () {
-          return {complete: Em.K}
-        });
-      });
-
-      afterEach(function () {
-        App.get.restore();
-        App.ajax.send.restore();
       });
 
       it('should add request to queue', function () {
         installerStep8Controller.createNotification();
         expect(installerStep8Controller.get('ajaxRequestsQueue.queue.length')).to.equal(1);
         installerStep8Controller.get('ajaxRequestsQueue').runNextRequest();
-        expect(App.ajax.send.calledOnce).to.be.true;
+        var args = testHelpers.findAjaxRequest('name', 'alerts.create_alert_notification');
+        expect(args).exists;
       });
 
       describe('sent data should be valid', function () {
@@ -2443,7 +2398,6 @@ describe('App.WizardStep8Controller', function () {
 
     beforeEach(function () {
       sinon.stub(App.db, 'get').withArgs('KerberosWizard', 'kerberosDescriptorConfigs').returns(1234);
-      sinon.stub(App.ajax, 'send', Em.K);
       sinon.stub(installerStep8Controller, 'addRequestToAjaxQueue', Em.K);
       sinon.stub(installerStep8Controller, 'get').withArgs('wizardController').returns(Em.Object.create({
         getDBProperty: function() { return true; }
@@ -2452,21 +2406,22 @@ describe('App.WizardStep8Controller', function () {
 
     afterEach(function () {
       App.db.get.restore();
-      App.ajax.send.restore();
       installerStep8Controller.addRequestToAjaxQueue.restore();
       installerStep8Controller.get.restore();
     });
 
     it('should send request instantly', function () {
       installerStep8Controller.updateKerberosDescriptor(true);
-      expect(App.ajax.send.calledOnce).to.be.true;
+      var args = testHelpers.findAjaxRequest('name', 'admin.kerberos.cluster.artifact.update');
+      expect(args[0]).exists;
+      expect(args[0].data).to.be.eql(requestData);
       expect(installerStep8Controller.addRequestToAjaxQueue.called).to.be.false;
-      expect(App.ajax.send.args[0][0].data).to.be.eql(requestData);
     });
 
     it('should add request to the queue', function () {
       installerStep8Controller.updateKerberosDescriptor(false);
-      expect(App.ajax.send.called).to.be.false;
+      var args = testHelpers.findAjaxRequest('name', 'admin.kerberos.cluster.artifact.update');
+      expect(args).not.exists;
       expect(installerStep8Controller.addRequestToAjaxQueue.calledOnce).to.be.true;
       expect(installerStep8Controller.addRequestToAjaxQueue.args[0][0].data).to.be.eql(requestData);
     });


[08/22] ambari git commit: AMBARI-14718. on region server restart ambari is setting /tmp to hbase:hadoop (aonishuk)

Posted by nc...@apache.org.
AMBARI-14718. on region server restart ambari is setting /tmp to hbase:hadoop (aonishuk)


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

Branch: refs/heads/branch-dev-patch-upgrade
Commit: 2c80cab2fef0167da13ec1836c5ba98fdc897c0b
Parents: f8fe788
Author: Andrew Onishuk <ao...@hortonworks.com>
Authored: Wed Jan 20 21:19:09 2016 +0200
Committer: Andrew Onishuk <ao...@hortonworks.com>
Committed: Wed Jan 20 21:19:09 2016 +0200

----------------------------------------------------------------------
 .../HBASE/0.96.0.2.0/package/scripts/hbase.py                | 2 --
 .../HBASE/0.96.0.2.0/package/scripts/params_linux.py         | 2 --
 .../src/test/python/stacks/2.0.6/HBASE/test_hbase_client.py  | 4 ----
 .../src/test/python/stacks/2.0.6/HBASE/test_hbase_master.py  | 6 ------
 .../python/stacks/2.0.6/HBASE/test_hbase_regionserver.py     | 8 --------
 .../python/stacks/2.0.6/HBASE/test_phoenix_queryserver.py    | 4 ----
 6 files changed, 26 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/2c80cab2/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/hbase.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/hbase.py b/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/hbase.py
index c407a93..1240e7c 100644
--- a/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/hbase.py
+++ b/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/hbase.py
@@ -57,8 +57,6 @@ def hbase(name=None):
   )
    
   Directory(params.java_io_tmpdir,
-      owner = params.hbase_user,
-      group = params.user_group,
       create_parents = True,
       mode=0777
   )

http://git-wip-us.apache.org/repos/asf/ambari/blob/2c80cab2/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/params_linux.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/params_linux.py b/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/params_linux.py
index f37844c..337f09d 100644
--- a/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/params_linux.py
+++ b/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/params_linux.py
@@ -36,8 +36,6 @@ from resource_management.libraries.functions import is_empty
 from resource_management.libraries.functions import get_unique_id_and_date
 from resource_management.libraries.script.script import Script
 
-from resource_management.libraries.functions.substitute_vars import substitute_vars
-
 # server configurations
 config = Script.get_config()
 exec_tmp_dir = Script.get_tmp_dir()

http://git-wip-us.apache.org/repos/asf/ambari/blob/2c80cab2/ambari-server/src/test/python/stacks/2.0.6/HBASE/test_hbase_client.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/python/stacks/2.0.6/HBASE/test_hbase_client.py b/ambari-server/src/test/python/stacks/2.0.6/HBASE/test_hbase_client.py
index 9f3e19e..6dc4b0b 100644
--- a/ambari-server/src/test/python/stacks/2.0.6/HBASE/test_hbase_client.py
+++ b/ambari-server/src/test/python/stacks/2.0.6/HBASE/test_hbase_client.py
@@ -47,8 +47,6 @@ class TestHBaseClient(RMFTestCase):
       create_parents = True,
     )
     self.assertResourceCalled('Directory', '/tmp',
-      owner = 'hbase',
-      group = 'hadoop',
       create_parents = True,
       mode = 0777
     )
@@ -145,8 +143,6 @@ class TestHBaseClient(RMFTestCase):
       create_parents = True,
     )
     self.assertResourceCalled('Directory', '/tmp',
-      owner = 'hbase',
-      group = 'hadoop',
       create_parents = True,
       mode = 0777
     )

http://git-wip-us.apache.org/repos/asf/ambari/blob/2c80cab2/ambari-server/src/test/python/stacks/2.0.6/HBASE/test_hbase_master.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/python/stacks/2.0.6/HBASE/test_hbase_master.py b/ambari-server/src/test/python/stacks/2.0.6/HBASE/test_hbase_master.py
index 7c6d10e..13b2e33 100644
--- a/ambari-server/src/test/python/stacks/2.0.6/HBASE/test_hbase_master.py
+++ b/ambari-server/src/test/python/stacks/2.0.6/HBASE/test_hbase_master.py
@@ -243,8 +243,6 @@ class TestHBaseMaster(RMFTestCase):
       create_parents = True,
     )
     self.assertResourceCalled('Directory', '/tmp',
-      owner = 'hbase',
-      group = 'hadoop',
       create_parents = True,
       mode = 0777
     )
@@ -380,8 +378,6 @@ class TestHBaseMaster(RMFTestCase):
       create_parents = True,
     )
     self.assertResourceCalled('Directory', '/tmp',
-      owner = 'hbase',
-      group = 'hadoop',
       create_parents = True,
       mode = 0777
     )
@@ -526,8 +522,6 @@ class TestHBaseMaster(RMFTestCase):
       group = 'hadoop',
       create_parents = True)
     self.assertResourceCalled('Directory', '/tmp',
-      owner = 'hbase',
-      group = 'hadoop',
       create_parents = True,
       mode = 0777
     )

http://git-wip-us.apache.org/repos/asf/ambari/blob/2c80cab2/ambari-server/src/test/python/stacks/2.0.6/HBASE/test_hbase_regionserver.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/python/stacks/2.0.6/HBASE/test_hbase_regionserver.py b/ambari-server/src/test/python/stacks/2.0.6/HBASE/test_hbase_regionserver.py
index c36bd89..58ca7ef 100644
--- a/ambari-server/src/test/python/stacks/2.0.6/HBASE/test_hbase_regionserver.py
+++ b/ambari-server/src/test/python/stacks/2.0.6/HBASE/test_hbase_regionserver.py
@@ -136,8 +136,6 @@ class TestHbaseRegionServer(RMFTestCase):
       create_parents = True,
     )
     self.assertResourceCalled('Directory', '/tmp',
-      owner = 'hbase',
-      group = 'hadoop',
       create_parents = True,
       mode = 0777
     )
@@ -234,8 +232,6 @@ class TestHbaseRegionServer(RMFTestCase):
       create_parents = True,
     )
     self.assertResourceCalled('Directory', '/tmp',
-      owner = 'hbase',
-      group = 'hadoop',
       create_parents = True,
       mode = 0777
     )
@@ -342,8 +338,6 @@ class TestHbaseRegionServer(RMFTestCase):
       group = 'hadoop',
       create_parents = True)
     self.assertResourceCalled('Directory', '/tmp',
-      owner = 'hbase',
-      group = 'hadoop',
       create_parents = True,
       mode = 0777
     )
@@ -458,8 +452,6 @@ class TestHbaseRegionServer(RMFTestCase):
       group = 'hadoop',
       create_parents = True)
     self.assertResourceCalled('Directory', '/tmp',
-      owner = 'hbase',
-      group = 'hadoop',
       create_parents = True,
       mode = 0777
     )

http://git-wip-us.apache.org/repos/asf/ambari/blob/2c80cab2/ambari-server/src/test/python/stacks/2.0.6/HBASE/test_phoenix_queryserver.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/python/stacks/2.0.6/HBASE/test_phoenix_queryserver.py b/ambari-server/src/test/python/stacks/2.0.6/HBASE/test_phoenix_queryserver.py
index 6f3199e..7722af0 100644
--- a/ambari-server/src/test/python/stacks/2.0.6/HBASE/test_phoenix_queryserver.py
+++ b/ambari-server/src/test/python/stacks/2.0.6/HBASE/test_phoenix_queryserver.py
@@ -238,8 +238,6 @@ class TestPhoenixQueryServer(RMFTestCase):
       create_parents = True,
     )
     self.assertResourceCalled('Directory', '/tmp',
-      owner = 'hbase',
-      group = 'hadoop',
       create_parents = True,
       mode = 0777
     )
@@ -351,8 +349,6 @@ class TestPhoenixQueryServer(RMFTestCase):
       create_parents = True,
     )
     self.assertResourceCalled('Directory', '/tmp',
-      owner = 'hbase',
-      group = 'hadoop',
       create_parents = True,
       mode = 0777
     )


[10/22] ambari git commit: AMBARI-14730. After upgrade from 2.3.2 to 2.3.4, HBase fails to start, remove props for local indexing (alejandro)

Posted by nc...@apache.org.
AMBARI-14730. After upgrade from 2.3.2 to 2.3.4, HBase fails to start, remove props for local indexing (alejandro)


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

Branch: refs/heads/branch-dev-patch-upgrade
Commit: 109311d5280cd453d1487434fdabaa274f865197
Parents: 6225849
Author: Alejandro Fernandez <af...@hortonworks.com>
Authored: Tue Jan 19 14:01:10 2016 -0800
Committer: Alejandro Fernandez <af...@hortonworks.com>
Committed: Wed Jan 20 13:35:43 2016 -0800

----------------------------------------------------------------------
 .../HDP/2.2/upgrades/nonrolling-upgrade-2.3.xml |  6 +++++
 .../HDP/2.2/upgrades/nonrolling-upgrade-2.4.xml |  6 +++++
 .../stacks/HDP/2.2/upgrades/upgrade-2.3.xml     |  3 +++
 .../stacks/HDP/2.2/upgrades/upgrade-2.4.xml     |  3 +++
 .../stacks/HDP/2.3/upgrades/config-upgrade.xml  | 17 +++++++++++++++
 .../HDP/2.3/upgrades/nonrolling-upgrade-2.3.xml |  6 +++++
 .../HDP/2.3/upgrades/nonrolling-upgrade-2.4.xml |  9 ++++++++
 .../stacks/HDP/2.3/upgrades/upgrade-2.3.xml     |  5 +++++
 .../stacks/HDP/2.3/upgrades/upgrade-2.4.xml     |  5 +++++
 .../stacks/HDP/2.4/upgrades/config-upgrade.xml  | 23 ++++++++++++++++++++
 10 files changed, 83 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/109311d5/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/nonrolling-upgrade-2.3.xml
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/nonrolling-upgrade-2.3.xml b/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/nonrolling-upgrade-2.3.xml
index df12920..55fc336 100644
--- a/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/nonrolling-upgrade-2.3.xml
+++ b/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/nonrolling-upgrade-2.3.xml
@@ -406,6 +406,12 @@
         <task xsi:type="configure" id="hdp_2_3_0_0_hbase_master_delete_old_ranger_properties"/>
       </execute-stage>
 
+      <!-- HBASE -->
+      <!-- These HBASE configs changed in HDP 2.3.4.0, but Ambari can't distinguish HDP 2.3.2.0 vs HDP 2.3.4.0, so easier to always do them. -->
+      <execute-stage service="HBASE" component="HBASE_MASTER" title="Apply config changes for HBASE Master">
+        <task xsi:type="configure" id="hdp_2_3_4_0_hbase_remove_local_indexing"/>
+      </execute-stage>
+
       <!--TEZ-->
       <execute-stage service="TEZ" component="TEZ_CLIENT" title="Apply config changes for Tez">
         <task xsi:type="configure" id="hdp_2_3_0_0_tez_client_adjust_properties"/>

http://git-wip-us.apache.org/repos/asf/ambari/blob/109311d5/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/nonrolling-upgrade-2.4.xml
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/nonrolling-upgrade-2.4.xml b/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/nonrolling-upgrade-2.4.xml
index c5d74e2..b756deb 100644
--- a/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/nonrolling-upgrade-2.4.xml
+++ b/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/nonrolling-upgrade-2.4.xml
@@ -440,6 +440,12 @@
         <task xsi:type="configure" id="hdp_2_3_0_0_hbase_master_delete_old_ranger_properties"/>
       </execute-stage>
 
+      <!-- HBASE -->
+      <!-- These HBASE configs changed in HDP 2.3.4.0, but Ambari can't distinguish HDP 2.3.2.0 vs HDP 2.3.4.0, so easier to always do them. -->
+      <execute-stage service="HBASE" component="HBASE_MASTER" title="Apply config changes for HBASE Master">
+        <task xsi:type="configure" id="hdp_2_3_4_0_hbase_remove_local_indexing"/>
+      </execute-stage>
+
       <!--TEZ-->
       <execute-stage service="TEZ" component="TEZ_CLIENT" title="Apply config changes for Tez">
         <task xsi:type="configure" id="hdp_2_3_0_0_tez_client_adjust_properties"/>

http://git-wip-us.apache.org/repos/asf/ambari/blob/109311d5/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/upgrade-2.3.xml
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/upgrade-2.3.xml b/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/upgrade-2.3.xml
index 7e7138d..4415909 100644
--- a/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/upgrade-2.3.xml
+++ b/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/upgrade-2.3.xml
@@ -602,6 +602,9 @@
           <task xsi:type="configure" id="hdp_2_3_0_0_hbase_master_copy_ranger_policies"/>
 
           <task xsi:type="configure" id="hdp_2_3_0_0_hbase_master_delete_old_ranger_properties"/>
+
+          <!-- These HBASE configs changed in HDP 2.3.4.0, but Ambari can't distinguish HDP 2.3.2.0 vs HDP 2.3.4.0, so easier to always do them. -->
+          <task xsi:type="configure" id="hdp_2_3_4_0_hbase_remove_local_indexing"/>
         </pre-upgrade>
 
         <upgrade>

http://git-wip-us.apache.org/repos/asf/ambari/blob/109311d5/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/upgrade-2.4.xml
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/upgrade-2.4.xml b/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/upgrade-2.4.xml
index 6b5bcb1..d279ec1 100644
--- a/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/upgrade-2.4.xml
+++ b/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/upgrade-2.4.xml
@@ -609,6 +609,9 @@
           <task xsi:type="configure" id="hdp_2_3_0_0_hbase_master_copy_ranger_policies"/>
 
           <task xsi:type="configure" id="hdp_2_3_0_0_hbase_master_delete_old_ranger_properties"/>
+
+          <!-- These HBASE configs changed in HDP 2.3.4.0, but Ambari can't distinguish HDP 2.3.2.0 vs HDP 2.3.4.0, so easier to always do them. -->
+          <task xsi:type="configure" id="hdp_2_3_4_0_hbase_remove_local_indexing"/>
         </pre-upgrade>
 
         <upgrade>

http://git-wip-us.apache.org/repos/asf/ambari/blob/109311d5/ambari-server/src/main/resources/stacks/HDP/2.3/upgrades/config-upgrade.xml
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/stacks/HDP/2.3/upgrades/config-upgrade.xml b/ambari-server/src/main/resources/stacks/HDP/2.3/upgrades/config-upgrade.xml
index bdb4808..9e53c12 100644
--- a/ambari-server/src/main/resources/stacks/HDP/2.3/upgrades/config-upgrade.xml
+++ b/ambari-server/src/main/resources/stacks/HDP/2.3/upgrades/config-upgrade.xml
@@ -505,6 +505,23 @@
             <transfer operation="delete" delete-key="XAAUDIT.DB.DATABASE_NAME"/>
             <transfer operation="delete" delete-key="XAAUDIT.DB.HOSTNAME"/>
           </definition>
+
+          <!-- These HBASE configs changed in HDP 2.3.4.0, so upgrades like HDP 2.2 to 2.3.4.0+ still need them. -->
+          <definition xsi:type="configure" id="hdp_2_3_4_0_hbase_remove_local_indexing">
+            <type>hbase-site</type>
+            <set key="phoenix.functions.allowUserDefinedFunctions" value="true"/>
+            <transfer operation="delete" delete-key="hbase.master.loadbalancer.class"
+                      if-key="hbase.master.loadbalancer.class"
+                      if-type="hbase-site"
+                      if-value="org.apache.phoenix.hbase.index.balancer.IndexLoadBalancer"/>
+            <replace key="hbase.coprocessor.master.classes"
+                     find="org.apache.phoenix.hbase.index.master.IndexMasterObserver"
+                     replace-with="" />
+            <replace key="hbase.coprocessor.regionserver.classes"
+                     find="org.apache.hadoop.hbase.regionserver.LocalIndexMerger"
+                     replace-with="" />
+
+          </definition>
         </changes>
       </component>
     </service>

http://git-wip-us.apache.org/repos/asf/ambari/blob/109311d5/ambari-server/src/main/resources/stacks/HDP/2.3/upgrades/nonrolling-upgrade-2.3.xml
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/stacks/HDP/2.3/upgrades/nonrolling-upgrade-2.3.xml b/ambari-server/src/main/resources/stacks/HDP/2.3/upgrades/nonrolling-upgrade-2.3.xml
index 57b2f42..208aa52 100644
--- a/ambari-server/src/main/resources/stacks/HDP/2.3/upgrades/nonrolling-upgrade-2.3.xml
+++ b/ambari-server/src/main/resources/stacks/HDP/2.3/upgrades/nonrolling-upgrade-2.3.xml
@@ -267,6 +267,12 @@
       <direction>UPGRADE</direction>   <!--  prevent config changes on downgrade -->
       <skippable>true</skippable>  <!-- May fix configuration problems manually -->
 
+      <!-- HBASE -->
+      <!-- These HBASE configs changed in HDP 2.3.4.0, but Ambari can't distinguish HDP 2.3.2.0 vs HDP 2.3.4.0, so easier to always do them. -->
+      <execute-stage service="HBASE" component="HBASE_MASTER" title="Apply config changes for HBASE Master">
+        <task xsi:type="configure" id="hdp_2_3_4_0_hbase_remove_local_indexing"/>
+      </execute-stage>
+
       <execute-stage service="TEZ" component="TEZ_CLIENT" title="Apply config changes for Tez">
         <task xsi:type="configure" id="hdp_2_3_0_0_tez_client_adjust_tez_lib_uris_property"/>
       </execute-stage>

http://git-wip-us.apache.org/repos/asf/ambari/blob/109311d5/ambari-server/src/main/resources/stacks/HDP/2.3/upgrades/nonrolling-upgrade-2.4.xml
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/stacks/HDP/2.3/upgrades/nonrolling-upgrade-2.4.xml b/ambari-server/src/main/resources/stacks/HDP/2.3/upgrades/nonrolling-upgrade-2.4.xml
index 45bf744..a93851b 100644
--- a/ambari-server/src/main/resources/stacks/HDP/2.3/upgrades/nonrolling-upgrade-2.4.xml
+++ b/ambari-server/src/main/resources/stacks/HDP/2.3/upgrades/nonrolling-upgrade-2.4.xml
@@ -268,10 +268,18 @@
       <skippable>true</skippable>  <!-- May fix configuration problems manually -->
       <supports-auto-skip-failure>false</supports-auto-skip-failure>
 
+      <!-- YARN -->
       <execute-stage service="YARN" component="RESOURCEMANAGER" title="Calculating Yarn Properties for Spark">
         <task xsi:type="server_action" summary="Calculating Yarn Properties for Spark Shuffle" class="org.apache.ambari.server.serveraction.upgrades.SparkShufflePropertyConfig" />
       </execute-stage>
 
+      <!-- HBASE -->
+      <!-- These HBASE configs changed in HDP 2.3.4.0, but Ambari can't distinguish HDP 2.3.2.0 vs HDP 2.3.4.0, so easier to always do them. -->
+      <execute-stage service="HBASE" component="HBASE_MASTER" title="Apply config changes for HBASE Master">
+        <task xsi:type="configure" id="hdp_2_4_0_0_hbase_remove_local_indexing"/>
+      </execute-stage>
+
+      <!-- HIVE, TEZ, -->
       <execute-stage service="TEZ" component="TEZ_CLIENT" title="Apply config changes for Tez">
         <task xsi:type="configure" id="hdp_2_4_0_0_tez_client_adjust_tez_lib_uris_property"/>
       </execute-stage>
@@ -280,6 +288,7 @@
         <task xsi:type="configure" id="hdp_2_4_0_0_webhcat_server_update_configuration_paths"/>
       </execute-stage>
 
+      <!-- OOZIE -->
       <execute-stage service="OOZIE" component="OOZIE_SERVER" title="Apply config changes for Oozie Server">
         <task xsi:type="configure" id="hdp_2_4_0_0_oozie_remove_service_classes" />
       </execute-stage>

http://git-wip-us.apache.org/repos/asf/ambari/blob/109311d5/ambari-server/src/main/resources/stacks/HDP/2.3/upgrades/upgrade-2.3.xml
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/stacks/HDP/2.3/upgrades/upgrade-2.3.xml b/ambari-server/src/main/resources/stacks/HDP/2.3/upgrades/upgrade-2.3.xml
index ab955e4..cc6b394 100644
--- a/ambari-server/src/main/resources/stacks/HDP/2.3/upgrades/upgrade-2.3.xml
+++ b/ambari-server/src/main/resources/stacks/HDP/2.3/upgrades/upgrade-2.3.xml
@@ -559,6 +559,11 @@
 
     <service name="HBASE">
       <component name="HBASE_MASTER">
+        <pre-upgrade>
+          <!-- These HBASE configs changed in HDP 2.3.4.0, but Ambari can't distinguish HDP 2.3.2.0 vs HDP 2.3.4.0, so easier to always do them. -->
+          <task xsi:type="configure" id="hdp_2_3_4_0_hbase_remove_local_indexing"/>
+        </pre-upgrade>
+
         <upgrade>
           <task xsi:type="restart-task"/>
         </upgrade>

http://git-wip-us.apache.org/repos/asf/ambari/blob/109311d5/ambari-server/src/main/resources/stacks/HDP/2.3/upgrades/upgrade-2.4.xml
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/stacks/HDP/2.3/upgrades/upgrade-2.4.xml b/ambari-server/src/main/resources/stacks/HDP/2.3/upgrades/upgrade-2.4.xml
index 682815f..aef9c79 100644
--- a/ambari-server/src/main/resources/stacks/HDP/2.3/upgrades/upgrade-2.4.xml
+++ b/ambari-server/src/main/resources/stacks/HDP/2.3/upgrades/upgrade-2.4.xml
@@ -517,6 +517,11 @@
 
     <service name="HBASE">
       <component name="HBASE_MASTER">
+        <pre-upgrade>
+          <!-- These HBASE configs changed in HDP 2.3.4.0, but Ambari can't distinguish HDP 2.3.2.0 vs HDP 2.3.4.0, so easier to always do them. -->
+          <task xsi:type="configure" id="hdp_2_4_0_0_hbase_remove_local_indexing"/>
+        </pre-upgrade>
+
         <pre-downgrade /> <!--  no-op to prevent config changes on downgrade -->
 
         <upgrade>

http://git-wip-us.apache.org/repos/asf/ambari/blob/109311d5/ambari-server/src/main/resources/stacks/HDP/2.4/upgrades/config-upgrade.xml
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/stacks/HDP/2.4/upgrades/config-upgrade.xml b/ambari-server/src/main/resources/stacks/HDP/2.4/upgrades/config-upgrade.xml
index 6b41c84..0f72e5d 100644
--- a/ambari-server/src/main/resources/stacks/HDP/2.4/upgrades/config-upgrade.xml
+++ b/ambari-server/src/main/resources/stacks/HDP/2.4/upgrades/config-upgrade.xml
@@ -20,6 +20,29 @@
 
   <services>
 
+    <service name="HBASE">
+      <component name="HBASE_MASTER">
+        <changes>
+          <!-- These HBASE configs changed in HDP 2.3.4.0, so upgrades like HDP 2.2 to 2.4 still need them. -->
+          <definition xsi:type="configure" id="hdp_2_4_0_0_hbase_remove_local_indexing">
+            <type>hbase-site</type>
+            <set key="phoenix.functions.allowUserDefinedFunctions" value="true"/>
+            <transfer operation="delete" delete-key="hbase.master.loadbalancer.class"
+                      if-key="hbase.master.loadbalancer.class"
+                      if-type="hbase-site"
+                      if-value="org.apache.phoenix.hbase.index.balancer.IndexLoadBalancer"/>
+            <replace key="hbase.coprocessor.master.classes"
+                     find="org.apache.phoenix.hbase.index.master.IndexMasterObserver"
+                     replace-with="" />
+            <replace key="hbase.coprocessor.regionserver.classes"
+                     find="org.apache.hadoop.hbase.regionserver.LocalIndexMerger"
+                     replace-with="" />
+
+          </definition>
+        </changes>
+      </component>
+    </service>
+
     <service name="TEZ">
       <component name="TEZ_CLIENT">
         <changes>


[03/22] ambari git commit: AMBARI-14741. Ambari Web Unit Test failure on trunk (App.WizardStep8Controller) (onechiporenko)

Posted by nc...@apache.org.
http://git-wip-us.apache.org/repos/asf/ambari/blob/ddf479ef/ambari-web/test/controllers/wizard/step9_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/controllers/wizard/step9_test.js b/ambari-web/test/controllers/wizard/step9_test.js
index 70365bb..2eb8709 100644
--- a/ambari-web/test/controllers/wizard/step9_test.js
+++ b/ambari-web/test/controllers/wizard/step9_test.js
@@ -24,6 +24,7 @@ require('controllers/installer');
 require('controllers/wizard/step9_controller');
 require('utils/helper');
 require('utils/ajax/ajax');
+var testHelpers = require('test/helpers');
 
 var modelSetup = require('test/init_model_test');
 var c, obj;
@@ -54,6 +55,7 @@ describe('App.InstallerStep9Controller', function () {
     modelSetup.setupStackServiceComponent();
     c = getController();
     obj = App.InstallerController.create();
+    App.ajax.send.restore();
     sinon.stub(App.ajax, 'send', function() {
       return {
         then: function() { 
@@ -72,7 +74,6 @@ describe('App.InstallerStep9Controller', function () {
 
   afterEach(function () {
     modelSetup.cleanStackServiceComponent();
-    App.ajax.send.restore();
   });
 
   App.TestAliases.testAsComputedEqual(getController(), 'showRetry', 'content.cluster.status', 'INSTALL FAILED');
@@ -1340,17 +1341,6 @@ describe('App.InstallerStep9Controller', function () {
 
   describe('#launchStartServicesErrorCallback', function () {
 
-    beforeEach(function() {
-      sinon.stub(App, 'get', function(k) {
-        if ('testMode' === k) return true;
-        return Em.get(App, k);
-      });
-    });
-
-    afterEach(function() {
-      App.get.restore();
-    });
-
     it('Main progress bar on the screen should be finished (100%) with red color', function () {
       var hosts = Em.A([Em.Object.create({name: 'host1', progress: '33', status: 'info'}), Em.Object.create({name: 'host2', progress: '33', status: 'info'})]);
       c.reopen({hosts: hosts, content: {controllerName: 'installerController', cluster: {status: 'PENDING', name: 'c1'}}});
@@ -1492,7 +1482,8 @@ describe('App.InstallerStep9Controller', function () {
     it('shouldn\'t call App.ajax.send if no currentOpenTaskId', function () {
       c.set('currentOpenTaskId', null);
       c.loadCurrentTaskLog();
-      expect(App.ajax.send.called).to.equal(false);
+      var args = testHelpers.findAjaxRequest('name', 'background_operations.get_by_task');
+      expect(args).not.exists;
     });
 
     it('should call App.ajax.send with provided data', function () {
@@ -1500,7 +1491,9 @@ describe('App.InstallerStep9Controller', function () {
       c.set('currentOpenTaskRequestId', 2);
       c.set('content', {cluster: {name: 3}});
       c.loadCurrentTaskLog();
-      expect(App.ajax.send.args[0][0].data).to.eql({taskId: 1, requestId: 2, clusterName: 3});
+      var args = testHelpers.findAjaxRequest('name', 'background_operations.get_by_task');
+      expect(args[0]).exists;
+      expect(args[0].data).to.be.eql({taskId: 1, requestId: 2, clusterName: 3});
     });
   });
 
@@ -1597,14 +1590,6 @@ describe('App.InstallerStep9Controller', function () {
       c.togglePreviousSteps.restore();
     });
 
-    it('should increment numPolls if testMode', function () {
-      App.set('testMode', true);
-      c.set('numPolls', 0);
-      c.doPolling();
-      expect(c.get('numPolls')).to.equal(1);
-      App.set('testMode', false);
-    });
-
     it('should call getLogsByRequest', function () {
       c.set('content', {cluster: {requestId: 1}});
       c.doPolling();
@@ -1635,7 +1620,6 @@ describe('App.InstallerStep9Controller', function () {
       sinon.stub(c, 'loadStep', Em.K);
       sinon.stub(c, 'loadLogData', Em.K);
       sinon.stub(c, 'startPolling', Em.K);
-      sinon.stub(App, 'get', function(k) {if('testMode' === k) return false; return Em.get(App, k);});
     });
 
     afterEach(function () {
@@ -1643,7 +1627,6 @@ describe('App.InstallerStep9Controller', function () {
       c.loadStep.restore();
       c.loadLogData.restore();
       c.startPolling.restore();
-      App.get.restore();
     });
 
     it('isCompleted = true, requestId = 1', function () {

http://git-wip-us.apache.org/repos/asf/ambari/blob/ddf479ef/ambari-web/test/controllers/wizard_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/controllers/wizard_test.js b/ambari-web/test/controllers/wizard_test.js
index 1abbfd7..06729dd 100644
--- a/ambari-web/test/controllers/wizard_test.js
+++ b/ambari-web/test/controllers/wizard_test.js
@@ -612,11 +612,9 @@ describe('App.WizardController', function () {
       sinon.stub(wizardController,'showLaunchBootstrapPopup').returns({
         name: 'popup'
       });
-      sinon.stub(App.ajax,'send', Em.K);
     });
     afterEach(function(){
       wizardController.showLaunchBootstrapPopup.restore();
-      App.ajax.send.restore();
     });
     it('should return popup', function () {
       expect(wizardController.launchBootstrap()).to.be.eql({
@@ -680,13 +678,9 @@ describe('App.WizardController', function () {
       sinon.stub(wizardController,'saveClusterStatus', function(data){
         res = JSON.parse(JSON.stringify(data));
       });
-      sinon.stub(App.ajax,'send').returns({
-        then: function() {}
-      });
     });
     afterEach(function(){
       wizardController.saveClusterStatus.restore();
-      App.ajax.send.restore();
     });
     it('should call callbeck with data', function () {
       wizardController.set('content', Em.Object.create({
@@ -1491,7 +1485,7 @@ describe('App.WizardController', function () {
   describe('#loadConfigThemes', function() {
     beforeEach(function () {
       sinon.stub(wizardController, 'loadConfigThemeForServices').returns({
-        always: function(callback) {callback();}
+        always: Em.clb
       });
       sinon.stub(App.themesMapper, 'generateAdvancedTabs').returns(true);
       sinon.stub(App.config, 'loadConfigsFromStack').returns({

http://git-wip-us.apache.org/repos/asf/ambari/blob/ddf479ef/ambari-web/test/helpers.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/helpers.js b/ambari-web/test/helpers.js
index 4c2a671..1bb65d0 100644
--- a/ambari-web/test/helpers.js
+++ b/ambari-web/test/helpers.js
@@ -47,6 +47,83 @@ module.exports = {
         }
       });
     });
+  },
+
+  /**
+   * Get arguments for one <code>App.ajax.send</code> call according to the criteria
+   * Example:
+   * <pre>
+   *  sinon.stub(App.ajax, 'send', Em.K);
+   *  App.ajax.send({
+   *    name: 'n1',
+   *    sender: {},
+   *    data: {
+   *      f1: 'v1',
+   *      f2: 'v2'
+   *    }
+   *  });
+   *  App.ajax.send({
+   *    name: 'n2',
+   *    sender: {}
+   *  });
+   *  var args = findAjaxRequest('name', 'n1');
+   *  console.log(args); // [{name: 'n1', sender: {}, data: {f1: 'v1', f2: 'v2'}}]
+   *  App.ajax.send.restore();
+   * </pre>
+   *
+   * @param {string} property field to find
+   * @param {*} value value to find
+   * @returns {array|null}
+   */
+  findAjaxRequest: function(property, value) {
+    if (Em.typeOf(App.ajax.send.args) !== 'array') {
+      return null;
+    }
+    return App.ajax.send.args.find(function (request) {
+      return Em.get(request[0], property) === value;
+    });
+  },
+
+  /**
+   * Get arguments for several <code>App.ajax.send</code> calls according to the criteria
+   * Example:
+   * <pre>
+   *  sinon.stub(App.ajax, 'send', Em.K);
+   *  App.ajax.send({
+   *    name: 'n1',
+   *    sender: {},
+   *    data: {
+   *      f1: 'v1',
+   *      f2: 'v2'
+   *    }
+   *  });
+   *  App.ajax.send({
+   *    name: 'n2',
+   *    sender: {}
+   *  });
+   *  App.ajax.send({
+   *    name: 'n2',
+   *    sender: {},
+   *    data: {
+   *      d1: 1234
+   *    }
+   *  });
+   *  var args = filterAjaxRequests('name', 'n2');
+   *  console.log(args); // [[{name: 'n1', sender: {}}], [{name: 'n2', sender: {}, data: {d1: 1234}}]]
+   *  App.ajax.send.restore();
+   * </pre>
+   *
+   * @param {string} property field to filter
+   * @param {*} value value to filter
+   * @returns {array}
+   */
+  filterAjaxRequests: function (property, value) {
+    if (Em.typeOf(App.ajax.send.args) !== 'array') {
+      return [];
+    }
+    return App.ajax.send.args.filter(function (request) {
+      return Em.get(request[0], property) === value;
+    });
   }
 
 };
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/ddf479ef/ambari-web/test/mixins/common/table_server_view_mixin_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/mixins/common/table_server_view_mixin_test.js b/ambari-web/test/mixins/common/table_server_view_mixin_test.js
index 05c5ef4..2a9c409 100644
--- a/ambari-web/test/mixins/common/table_server_view_mixin_test.js
+++ b/ambari-web/test/mixins/common/table_server_view_mixin_test.js
@@ -18,6 +18,7 @@
 
 var App = require('app');
 require('mixins/common/table_server_view_mixin');
+require('utils/load_timer');
 
 describe('App.MainConfigHistoryView', function() {
   var view = Em.View.create(App.TableServerViewMixin, {

http://git-wip-us.apache.org/repos/asf/ambari/blob/ddf479ef/ambari-web/test/mixins/common/widget_mixin_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/mixins/common/widget_mixin_test.js b/ambari-web/test/mixins/common/widget_mixin_test.js
index e35f955..bc9192b 100644
--- a/ambari-web/test/mixins/common/widget_mixin_test.js
+++ b/ambari-web/test/mixins/common/widget_mixin_test.js
@@ -17,12 +17,22 @@
  */
 
 var App = require('app');
+var testHelpers = require('test/helpers');
 
 describe('App.WidgetMixin', function () {
   var mixinClass = Em.Object.extend(App.WidgetMixin, {metrics: [], content: {}});
+  var mixinObject;
+
+  beforeEach(function () {
+    mixinObject = mixinClass.create();
+  });
+
+  afterEach(function () {
+    clearTimeout(mixinObject.get('timeoutId'));
+    mixinObject.destroy();
+  });
 
   describe('#loadMetrics()', function () {
-    var mixinObject = mixinClass.create();
     beforeEach(function () {
       this.mock = sinon.stub(mixinObject, 'getRequestData');
       sinon.stub(App.WidgetLoadAggregator, 'add');
@@ -48,7 +58,6 @@ describe('App.WidgetMixin', function () {
   });
 
   describe("#extractExpressions()", function () {
-    var mixinObject = mixinClass.create();
     var testCases = [
       {
         data: '',
@@ -179,13 +188,7 @@ describe('App.WidgetMixin', function () {
   });
 
   describe("#getServiceComponentMetrics()", function () {
-    var mixinObject = mixinClass.create();
-    before(function () {
-      sinon.stub(App.ajax, 'send');
-    });
-    after(function () {
-      App.ajax.send.restore();
-    });
+
     it("valid request is sent", function () {
       var request = {
         service_name: 'S1',
@@ -206,20 +209,18 @@ describe('App.WidgetMixin', function () {
         ]
       };
       mixinObject.getServiceComponentMetrics(request);
-      expect(App.ajax.send.getCall(0).args[0]).to.eql({
-        name: 'widgets.serviceComponent.metrics.get',
-        sender: mixinObject,
-        data: {
-          serviceName: 'S1',
-          componentName: 'C1',
-          metricPaths: 'w1,w2'
-        }
-      })
+      var args = testHelpers.findAjaxRequest('name', 'widgets.serviceComponent.metrics.get');
+      expect(args[0]).exists;
+      expect(args[0].sender).to.be.eql(mixinObject);
+      expect(args[0].data).to.be.eql({
+        serviceName: 'S1',
+        componentName: 'C1',
+        metricPaths: 'w1,w2'
+      });
     });
   });
 
   describe("#getMetricsSuccessCallback()", function () {
-    var mixinObject = mixinClass.create();
     it("metric is mapped from provided path", function () {
       var data = {
         metrics: {
@@ -243,13 +244,10 @@ describe('App.WidgetMixin', function () {
   });
 
   describe("#getHostComponentMetrics()", function () {
-    var mixinObject = mixinClass.create();
-    before(function () {
-      sinon.stub(App.ajax, 'send');
+    beforeEach(function () {
       sinon.stub(mixinObject, 'computeHostComponentCriteria').returns('criteria')
     });
-    after(function () {
-      App.ajax.send.restore();
+    afterEach(function () {
       mixinObject.computeHostComponentCriteria.restore();
     });
     it("valid request is sent", function () {
@@ -272,20 +270,18 @@ describe('App.WidgetMixin', function () {
         host_component_criteria: 'c1'
       };
       mixinObject.getHostComponentMetrics(request);
-      expect(App.ajax.send.getCall(0).args[0]).to.eql({
-        name: 'widgets.hostComponent.metrics.get',
-        sender: mixinObject,
-        data: {
-          componentName: 'C1',
-          metricPaths: 'w1,w2',
-          hostComponentCriteria: 'criteria'
-        }
-      })
+      var args = testHelpers.findAjaxRequest('name', 'widgets.hostComponent.metrics.get');
+      expect(args[0]).exists;
+      expect(args[0].sender).to.be.eql(mixinObject);
+      expect(args[0].data).to.be.eql({
+        componentName: 'C1',
+        metricPaths: 'w1,w2',
+        hostComponentCriteria: 'criteria'
+      });
     });
   });
 
   describe("#calculateValues()", function () {
-    var mixinObject = mixinClass.create();
 
     beforeEach(function () {
       sinon.stub(mixinObject, 'extractExpressions');
@@ -322,8 +318,6 @@ describe('App.WidgetMixin', function () {
   });
 
   describe("#computeExpression()", function () {
-    var mixinObject = mixinClass.create();
-
     it("expression missing metrics", function () {
       var expressions = ['e.m1'];
       var metrics = [];
@@ -354,14 +348,13 @@ describe('App.WidgetMixin', function () {
   });
 
   describe("#cloneWidget()", function () {
-    var mixinObject = mixinClass.create();
     var popup;
-    before(function () {
+    beforeEach(function () {
       sinon.spy(App, 'showConfirmationPopup');
       sinon.stub(mixinObject, 'postWidgetDefinition', Em.K);
       popup = mixinObject.cloneWidget();
     });
-    after(function () {
+    afterEach(function () {
       App.showConfirmationPopup.restore();
       mixinObject.postWidgetDefinition.restore();
     });
@@ -375,25 +368,19 @@ describe('App.WidgetMixin', function () {
   });
 
   describe("#postWidgetDefinition()", function () {
-    var mixinObject = mixinClass.create();
-
-    before(function () {
-      sinon.spy(App.ajax, 'send');
+    beforeEach(function () {
       sinon.stub(mixinObject, 'collectWidgetData').returns({});
     });
-    after(function () {
-      App.ajax.send.restore();
+    afterEach(function () {
       mixinObject.collectWidgetData.restore();
     });
     it("valid request is sent", function () {
       mixinObject.postWidgetDefinition();
-      expect(App.ajax.send.getCall(0).args[0]).to.eql({
-        name: 'widgets.wizard.add',
-        sender: mixinObject,
-        data: {
-          data: {}
-        },
-        success: 'postWidgetDefinitionSuccessCallback'
+      var args = testHelpers.findAjaxRequest('name', 'widgets.wizard.add');
+      expect(args[0]).exists;
+      expect(args[0].sender).to.be.eql(mixinObject);
+      expect(args[0].data).to.be.eql({
+        data: {}
       });
     });
   });

http://git-wip-us.apache.org/repos/asf/ambari/blob/ddf479ef/ambari-web/test/mixins/common/widgets/export_metrics_mixin_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/mixins/common/widgets/export_metrics_mixin_test.js b/ambari-web/test/mixins/common/widgets/export_metrics_mixin_test.js
index 9e91111..1cc0730 100644
--- a/ambari-web/test/mixins/common/widgets/export_metrics_mixin_test.js
+++ b/ambari-web/test/mixins/common/widgets/export_metrics_mixin_test.js
@@ -20,6 +20,7 @@ var App = require('app');
 
 require('mixins/common/widgets/export_metrics_mixin');
 var fileUtils = require('utils/file_utils');
+var testHelpers = require('test/helpers');
 
 describe('App.ExportMetricsMixin', function () {
 
@@ -72,7 +73,6 @@ describe('App.ExportMetricsMixin', function () {
     ];
 
     beforeEach(function () {
-      sinon.stub(App.ajax, 'send', Em.K);
       obj.reopen({
         targetView: {
           ajaxIndex: 'index',
@@ -85,30 +85,23 @@ describe('App.ExportMetricsMixin', function () {
       });
     });
 
-    afterEach(function () {
-      App.ajax.send.restore();
-    });
-
     cases.forEach(function (item) {
       describe(item.title, function () {
 
         beforeEach(function () {
           obj.set('isExportMenuHidden', item.isExportMenuHidden);
           obj.exportGraphData(item.event);
-          this.ajaxParams = App.ajax.send.firstCall.args[0];
+          this.ajaxParams = testHelpers.findAjaxRequest('name', 'index');
         });
 
         it('isExportMenuHidden is true', function () {
           expect(obj.get('isExportMenuHidden')).to.be.true;
         });
         it('one request was done', function () {
-          expect(App.ajax.send.calledOnce).to.be.true;
-        });
-        it('request to the valid end-point', function () {
-          expect(this.ajaxParams.name).to.equal('index');
+          expect(this.ajaxParams[0]).exists;
         });
         it('ajax-request with correct data', function () {
-          expect(this.ajaxParams.data).to.eql({
+          expect(this.ajaxParams[0].data).to.eql({
             p: 'v',
             isCSV: item.isCSV
           });

http://git-wip-us.apache.org/repos/asf/ambari/blob/ddf479ef/ambari-web/test/mixins/main/host/details/host_components/decommissionable_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/mixins/main/host/details/host_components/decommissionable_test.js b/ambari-web/test/mixins/main/host/details/host_components/decommissionable_test.js
index e0ee689..958874b 100644
--- a/ambari-web/test/mixins/main/host/details/host_components/decommissionable_test.js
+++ b/ambari-web/test/mixins/main/host/details/host_components/decommissionable_test.js
@@ -18,6 +18,7 @@
 
 var App = require('app');
 var uiEffects = require('utils/ui_effects');
+var testHelpers = require('test/helpers');
 
 require('mixins/main/host/details/host_components/decommissionable');
 
@@ -259,13 +260,6 @@ describe('App.Decommissionable', function () {
 
   describe("#getDecommissionStatus()", function() {
 
-    beforeEach(function() {
-      sinon.stub(App.ajax, 'send');
-    });
-    afterEach(function() {
-      App.ajax.send.restore();
-    });
-
     it("App.ajax.send should be called", function() {
       decommissionable.setProperties({
         componentForCheckDecommission: 'C1',
@@ -277,16 +271,13 @@ describe('App.Decommissionable', function () {
         })
       });
       decommissionable.getDecommissionStatus();
-      expect(App.ajax.send.getCall(0).args[0]).to.eql({
-        name: 'host.host_component.decommission_status',
-        sender: decommissionable,
-        data: {
-          hostName: 'host1',
-          componentName: 'C1',
-          serviceName: 'S1'
-        },
-        success: 'getDecommissionStatusSuccessCallback',
-        error: 'getDecommissionStatusErrorCallback'
+      var args = testHelpers.findAjaxRequest('name', 'host.host_component.decommission_status');
+      expect(args[0]).exists;
+      expect(args[0].sender).to.be.eql(decommissionable);
+      expect(args[0].data).to.be.eql({
+        hostName: 'host1',
+        componentName: 'C1',
+        serviceName: 'S1'
       });
     });
   });

http://git-wip-us.apache.org/repos/asf/ambari/blob/ddf479ef/ambari-web/test/mixins/main/host/details/host_components/install_component_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/mixins/main/host/details/host_components/install_component_test.js b/ambari-web/test/mixins/main/host/details/host_components/install_component_test.js
index f2e3513..56d582c 100644
--- a/ambari-web/test/mixins/main/host/details/host_components/install_component_test.js
+++ b/ambari-web/test/mixins/main/host/details/host_components/install_component_test.js
@@ -18,7 +18,7 @@
 
 var App = require('app');
 require('mixins/main/host/details/host_components/install_component');
-
+var testHelpers = require('test/helpers');
 var installComponent;
 
 describe('App.InstallComponent', function () {
@@ -35,12 +35,11 @@ describe('App.InstallComponent', function () {
 
     beforeEach(function() {
       sinon.stub(installComponent, 'updateAndCreateServiceComponent').returns({done: Em.clb});
-      sinon.stub(App.ajax, 'send');
       installComponent.installHostComponentCall('host1', component);
+      this.args = testHelpers.findAjaxRequest('name', 'host.host_component.add_new_component');
     });
     afterEach(function() {
       installComponent.updateAndCreateServiceComponent.restore();
-      App.ajax.send.restore();
     });
 
     it("updateAndCreateServiceComponent should be called", function() {
@@ -48,29 +47,25 @@ describe('App.InstallComponent', function () {
     });
 
     it("App.ajax.send should be called", function() {
-      expect(App.ajax.send.getCall(0).args[0]).to.eql({
-        name: 'host.host_component.add_new_component',
-        sender: installComponent,
-        data: {
-          hostName: 'host1',
-          component: component,
-          data: JSON.stringify({
-            RequestInfo: {
-              "context": Em.I18n.t('requestInfo.installHostComponent') + ' c1'
-            },
-            Body: {
-              host_components: [
-                {
-                  HostRoles: {
-                    component_name: 'C1'
-                  }
+      expect(this.args[0]).exists;
+      expect(this.args[0].sender).to.be.eql(installComponent);
+      expect(this.args[0].data).to.be.eql({
+        hostName: 'host1',
+        component: component,
+        data: JSON.stringify({
+          RequestInfo: {
+            "context": Em.I18n.t('requestInfo.installHostComponent') + ' c1'
+          },
+          Body: {
+            host_components: [
+              {
+                HostRoles: {
+                  component_name: 'C1'
                 }
-              ]
-            }
-          })
-        },
-        success: 'addNewComponentSuccessCallback',
-        error: 'ajaxErrorCallback'
+              }
+            ]
+          }
+        })
       });
     });
   });
@@ -85,32 +80,20 @@ describe('App.InstallComponent', function () {
       })
     };
 
-    beforeEach(function() {
-      sinon.stub(App.ajax, 'send');
-    });
-    afterEach(function() {
-      App.ajax.send.restore();
-    });
-
-
     it("App.ajax.send should be called", function() {
       installComponent.addNewComponentSuccessCallback({}, {}, params);
-      expect(App.ajax.send.getCall(0).args[0]).to.eql({
-        name: 'common.host.host_component.update',
-        sender: App.router.get('mainHostDetailsController'),
-        data: {
-          hostName: 'host1',
-          componentName: 'C1',
-          serviceName: 'S1',
-          component: params.component,
-          "context": Em.I18n.t('requestInfo.installNewHostComponent') + ' c1',
-          HostRoles: {
-            state: 'INSTALLED'
-          },
-          urlParams: "HostRoles/state=INIT"
+      var args = testHelpers.findAjaxRequest('name', 'common.host.host_component.update');
+      expect(args[0]).exists;
+      expect(args[0].data).to.be.eql({
+        hostName: 'host1',
+        componentName: 'C1',
+        serviceName: 'S1',
+        component: params.component,
+        "context": Em.I18n.t('requestInfo.installNewHostComponent') + ' c1',
+        HostRoles: {
+          state: 'INSTALLED'
         },
-        success: 'installNewComponentSuccessCallback',
-        error: 'ajaxErrorCallback'
+        urlParams: "HostRoles/state=INIT"
       });
     });
   });
@@ -118,7 +101,7 @@ describe('App.InstallComponent', function () {
   describe("#ajaxErrorCallback()", function() {
 
     beforeEach(function() {
-      sinon.stub(App.ajax, 'defaultErrorHandler');
+      sinon.stub(App.ajax, 'defaultErrorHandler', Em.K);
     });
     afterEach(function() {
       App.ajax.defaultErrorHandler.restore();
@@ -173,6 +156,8 @@ describe('App.InstallComponent', function () {
         serviceName: 'S1'
       })]);
       sinon.spy(dfd, 'resolve');
+
+      App.ajax.send.restore();
       sinon.stub(App.ajax, 'send').returns({complete: Em.clb});
       this.mock = sinon.stub(App.Service, 'find');
       this.mock.returns([{serviceName: "S1"}]);
@@ -183,7 +168,6 @@ describe('App.InstallComponent', function () {
       App.StackServiceComponent.find.restore();
       dfd.resolve.restore();
       this.mock.restore();
-      App.ajax.send.restore();
     });
 
     it("component already created", function() {
@@ -193,13 +177,12 @@ describe('App.InstallComponent', function () {
 
     it("component not created", function() {
       installComponent.createServiceComponent('C2', dfd);
-      expect(App.ajax.send.getCall(0).args[0]).to.eql({
-        name: 'common.create_component',
-        sender: installComponent,
-        data: {
-          componentName: 'C2',
-          serviceName: 'S1'
-        }
+      var args = testHelpers.findAjaxRequest('name', 'common.create_component');
+      expect(args[0]).exists;
+      expect(args[0].sender).to.be.eql(installComponent);
+      expect(args[0].data).to.be.eql({
+        componentName: 'C2',
+        serviceName: 'S1'
       });
       expect(dfd.resolve.calledOnce).to.be.true;
     });

http://git-wip-us.apache.org/repos/asf/ambari/blob/ddf479ef/ambari-web/test/mixins/wizard/wizardProgressPageController_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/mixins/wizard/wizardProgressPageController_test.js b/ambari-web/test/mixins/wizard/wizardProgressPageController_test.js
index 3d03292..ea0b3f7 100644
--- a/ambari-web/test/mixins/wizard/wizardProgressPageController_test.js
+++ b/ambari-web/test/mixins/wizard/wizardProgressPageController_test.js
@@ -17,6 +17,7 @@
  */
 
 var App = require('app');
+var testHelpers = require('test/helpers');
 
 describe('App.wizardProgressPageControllerMixin', function() {
   var mixedObject = Em.Object.extend(App.wizardProgressPageControllerMixin, {});
@@ -25,15 +26,8 @@ describe('App.wizardProgressPageControllerMixin', function() {
     var mixedObjectInstance;
     beforeEach(function() {
       mixedObjectInstance = mixedObject.create({});
-      sinon.stub(App.ajax, 'send', function(params) {
-        return $.extend(params,{complete: function(callback){
-          callback();
-        }});
-      });
       sinon.stub(mixedObjectInstance, "updateAndCreateServiceComponent").returns({
-        done: function(callback) {
-          return callback();
-        }
+        done: Em.clb
       });
       sinon.spy(mixedObjectInstance, 'onCreateComponent');
       sinon.spy(mixedObjectInstance, 'updateComponent');
@@ -68,7 +62,6 @@ describe('App.wizardProgressPageControllerMixin', function() {
     });
     
     afterEach(function() {
-      App.ajax.send.restore();
       App.StackServiceComponent.find.restore();
       mixedObjectInstance.updateAndCreateServiceComponent.restore();
       mixedObjectInstance.onCreateComponent.restore();
@@ -89,7 +82,7 @@ describe('App.wizardProgressPageControllerMixin', function() {
     describe('no ZooKeeper Servers installed. install on host1, host2. ajax request should be called with appropriate params', function() {
       beforeEach(function () {
         mixedObjectInstance.createComponent('ZOOKEEPER_SERVER', ['host1', 'host2'], 'ZOOKEEPER');
-        this.args = App.ajax.send.args[0][0];
+        this.args = testHelpers.findAjaxRequest('name', 'wizard.step8.register_host_to_component')[0];
         this.queryObject = JSON.parse(this.args.data.data);
       });
       it('hostName is valid array', function () {
@@ -114,7 +107,7 @@ describe('App.wizardProgressPageControllerMixin', function() {
     describe('ZooKeeper Client installed on host1. install on host1, host2. ajax request should be called with appropriate params', function() {
       beforeEach(function () {
         mixedObjectInstance.createComponent('ZOOKEEPER_CLIENT', ['host1', 'host2'], 'ZOOKEEPER');
-        this.args = App.ajax.send.args[0][0];
+        this.args = testHelpers.findAjaxRequest('name', 'wizard.step8.register_host_to_component')[0];
         this.queryObject = JSON.parse(this.args.data.data);
       });
       it('hostName is valid array', function () {
@@ -160,19 +153,14 @@ describe('App.wizardProgressPageControllerMixin', function() {
     
     testsAjax.forEach(function(test) {
       describe('called with params: ' + JSON.stringify(test.callParams), function() {
-        before(function() {
-          sinon.stub(App.ajax, 'send', Em.K);
+        beforeEach(function() {
           var mixedObjectInstance = mixedObject.create({});
           mixedObjectInstance.updateComponent.apply(mixedObjectInstance, test.callParams);
         });
 
-        after(function() {
-          App.ajax.send.restore();
-        });
-        
         test.e.forEach(function(eKey) {
           it('key: {0} should have value: {1}'.format(eKey.key, eKey.value), function() {
-            var args = App.ajax.send.args[0][0];
+            var args = testHelpers.findAjaxRequest('name', 'common.host_components.update')[0];
             expect(args).to.have.deep.property(eKey.key, eKey.value);
           });
         });

http://git-wip-us.apache.org/repos/asf/ambari/blob/ddf479ef/ambari-web/test/models/cluster_states_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/models/cluster_states_test.js b/ambari-web/test/models/cluster_states_test.js
index d8d6adc..d07845f 100644
--- a/ambari-web/test/models/cluster_states_test.js
+++ b/ambari-web/test/models/cluster_states_test.js
@@ -72,7 +72,6 @@ describe('App.clusterStatus', function () {
   describe('#setClusterStatus', function () {
 
     beforeEach(function() {
-      sinon.stub(App, 'get').withArgs('testMode').returns(false);
       sinon.stub(status, 'postUserPref', function() {
         return $.ajax();
       });
@@ -80,7 +79,6 @@ describe('App.clusterStatus', function () {
 
     afterEach(function () {
       status.postUserPref.restore();
-      App.get.restore();
     });
 
     it('should set cluster status in non-test mode', function () {

http://git-wip-us.apache.org/repos/asf/ambari/blob/ddf479ef/ambari-web/test/models/host_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/models/host_test.js b/ambari-web/test/models/host_test.js
index 37092da..d047a70 100644
--- a/ambari-web/test/models/host_test.js
+++ b/ambari-web/test/models/host_test.js
@@ -53,10 +53,6 @@ describe('App.Host', function () {
     }
   ];
 
-  before(function() {
-    App.set('testMode', false);
-  });
-
   App.Host.reopen({
     hostComponents: []
   });

http://git-wip-us.apache.org/repos/asf/ambari/blob/ddf479ef/ambari-web/test/router_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/router_test.js b/ambari-web/test/router_test.js
index cf638d9..de4b77a 100644
--- a/ambari-web/test/router_test.js
+++ b/ambari-web/test/router_test.js
@@ -17,34 +17,13 @@
  */
 
 var App = require('app');
+var testHelpers = require('test/helpers');
 
 require('router');
 
 describe('App.Router', function () {
   var router = App.Router.create();
 
-  describe.skip('#loginSuccessCallback()', function() {
-
-    beforeEach(function () {
-      sinon.stub(App.usersMapper, 'map');
-      sinon.stub(router, 'setUserLoggedIn');
-      sinon.stub(App.ajax, 'send');
-    });
-
-    afterEach(function() {
-      App.usersMapper.map.restore();
-      router.setUserLoggedIn.restore();
-      App.ajax.send.restore();
-    });
-
-    it('should log in user and load views', function () {
-      var userName = 'test';
-      router.loginSuccessCallback({},{},{loginName: userName});
-      expect(router.setUserLoggedIn.calledOnce).to.be.true;
-      expect(router.setUserLoggedIn.calledWith(userName)).to.be.true;
-    })
-  });
-
   describe('#initAdmin()', function () {
 
     var cases = [
@@ -373,20 +352,11 @@ describe('App.Router', function () {
   });
 
   describe("#transitionToAdminView()", function () {
-    beforeEach(function () {
-      sinon.stub(App.ajax, 'send');
-    });
-    afterEach(function () {
-      App.ajax.send.restore();
-    });
+
     it("valid request is sent", function () {
       router.transitionToAdminView();
-      expect(App.ajax.send.calledWith({
-        name: 'ambari.service.load_server_version',
-        sender: router,
-        success: 'adminViewInfoSuccessCallback',
-        error: 'adminViewInfoErrorCallback'
-      })).to.be.true;
+      var args = testHelpers.findAjaxRequest('name', 'ambari.service.load_server_version');
+      expect(args[0]).to.exists;
     });
   });
 
@@ -457,7 +427,6 @@ describe('App.Router', function () {
     });
 
     afterEach(function () {
-      App.ajax.send.restore();
       router.getCurrentLocationUrl.restore();
       router.redirectByURL.restore();
       this.mockGetCurrentLocationUrl.restore();
@@ -500,6 +469,7 @@ describe('App.Router', function () {
         beforeEach(function () {
           mockCurrentUrl = 'http://localhost:3333/#/some/hash';
           router.set('location.lastSetURL', test.lastSetURL);
+          App.ajax.send.restore(); // default ajax-mock can't be used here
           sinon.stub(App.ajax, 'send', function() {
             if (!test.isResolved) {
               router.onAuthenticationError(test.responseData);

http://git-wip-us.apache.org/repos/asf/ambari/blob/ddf479ef/ambari-web/test/utils/ajax/ajax_queue_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/utils/ajax/ajax_queue_test.js b/ambari-web/test/utils/ajax/ajax_queue_test.js
index 3c7ac85..89c7f61 100644
--- a/ambari-web/test/utils/ajax/ajax_queue_test.js
+++ b/ambari-web/test/utils/ajax/ajax_queue_test.js
@@ -26,14 +26,12 @@ describe('App.ajaxQueue', function () {
     ajaxQueue = App.ajaxQueue.create();
     sinon.spy(ajaxQueue, 'runNextRequest');
     sinon.spy(ajaxQueue, 'finishedCallback');
-    sinon.spy(App.ajax, 'send');
   });
 
   afterEach(function() {
     ajaxQueue.clear();
     ajaxQueue.runNextRequest.restore();
     ajaxQueue.finishedCallback.restore();
-    App.ajax.send.restore();
   });
 
   describe('#clear', function() {
@@ -100,12 +98,6 @@ describe('App.ajaxQueue', function () {
       ajaxQueue.runNextRequest();
       expect(ajaxQueue.finishedCallback.called).to.equal(true);
     });
-    it('if abortOnError is false queue shouldn\'t be interrupted', function() {
-      ajaxQueue.clear();
-      ajaxQueue.set('abortOnError', false);
-      ajaxQueue.addRequest({name:'some_fake', sender: Em.Object.create()}).addRequest({name: 'some_fake2', sender: Em.Object.create()}).start();
-      expect(ajaxQueue.runNextRequest.callCount).to.equal(3); // One for empty-queue
-    });
   });
 
 });

http://git-wip-us.apache.org/repos/asf/ambari/blob/ddf479ef/ambari-web/test/utils/ajax/ajax_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/utils/ajax/ajax_test.js b/ambari-web/test/utils/ajax/ajax_test.js
index 693829c..b0749df 100644
--- a/ambari-web/test/utils/ajax/ajax_test.js
+++ b/ambari-web/test/utils/ajax/ajax_test.js
@@ -22,18 +22,13 @@ require('utils/ajax/ajax');
 describe('App.ajax', function() {
 
   beforeEach(function() {
+    App.ajax.send.restore();
+    sinon.spy(App.ajax, 'send'); // no sense to test stubbed function, so going to spy on it
     App.set('apiPrefix', '/api/v1');
     App.set('clusterName', 'tdk');
   });
 
   describe('#send', function() {
-    beforeEach(function() {
-      sinon.spy($, 'ajax');
-    });
-
-    afterEach(function() {
-      $.ajax.restore();
-    });
     it('Without sender', function() {
       expect(App.ajax.send({})).to.equal(null);
       expect($.ajax.called).to.equal(false);
@@ -110,14 +105,6 @@ describe('App.ajax', function() {
 
   describe('#formatRequest', function() {
 
-    beforeEach(function () {
-      sinon.stub(App, 'get').withArgs('testMode').returns(false);
-    });
-
-    afterEach(function () {
-      App.get.restore();
-    });
-
     var tests = [
       {
         urlObj: {

http://git-wip-us.apache.org/repos/asf/ambari/blob/ddf479ef/ambari-web/test/utils/batch_scheduled_requests_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/utils/batch_scheduled_requests_test.js b/ambari-web/test/utils/batch_scheduled_requests_test.js
index f564824..c282350 100644
--- a/ambari-web/test/utils/batch_scheduled_requests_test.js
+++ b/ambari-web/test/utils/batch_scheduled_requests_test.js
@@ -131,75 +131,4 @@ describe('batch_scheduled_requests', function() {
 
   });
 
-  describe('#restartHostComponents', function() {
-
-    beforeEach(function() {
-      sinon.spy($, 'ajax');
-      sinon.stub(App, 'get', function(k) {
-        if ('testMode' === k) return true;
-        return Em.get(App, k);
-      });
-    });
-
-    afterEach(function() {
-      $.ajax.restore();
-      App.get.restore();
-    });
-
-    var tests = Em.A([
-      {
-        hostComponentList: Em.A([
-          Em.Object.create({
-            componentName: 'NAMENODE',
-            hostName: 'h1'
-          }),
-          Em.Object.create({
-            componentName: 'NAMENODE',
-            hostName: 'h2'
-          })
-        ]),
-        e: {
-          ajaxCalledOnce: true,
-          resource_filters: [{"service_name": "HDFS", "component_name":"NAMENODE","hosts":"h1,h2"}]
-        },
-        m: '1 component on 2 hosts'
-      },
-      {
-        hostComponentList: Em.A([
-          Em.Object.create({
-            componentName: 'NAMENODE',
-            hostName: 'h1'
-          }),
-          Em.Object.create({
-            componentName: 'NAMENODE',
-            hostName: 'h2'
-          }),
-          Em.Object.create({
-            componentName: 'HBASE_MASTER',
-            hostName: 'h2'
-          })
-        ]),
-        e: {
-          ajaxCalledOnce: true,
-          resource_filters: [{"service_name": "HDFS", "component_name":"NAMENODE","hosts":"h1,h2"},{"service_name": "HBASE", "component_name":"HBASE_MASTER","hosts":"h2"}]
-        },
-        m: '1 component on 2 hosts, 1 on 1 host'
-      }
-    ]);
-
-    tests.forEach(function(test) {
-      it(test.m, function() {
-        batchUtils.restartHostComponents(test.hostComponentList);
-        expect($.ajax.calledOnce).to.equal(test.e.ajaxCalledOnce);
-        expect( JSON.parse($.ajax.args[0][0].data)['Requests/resource_filters']).to.eql(test.e.resource_filters);
-      });
-    });
-
-    it('Empty data', function() {
-      batchUtils.restartHostComponents([]);
-      expect($.ajax.called).to.equal(false);
-    });
-
-  });
-
 });

http://git-wip-us.apache.org/repos/asf/ambari/blob/ddf479ef/ambari-web/test/utils/host_progress_popup_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/utils/host_progress_popup_test.js b/ambari-web/test/utils/host_progress_popup_test.js
index 1d143a7..dea2666 100644
--- a/ambari-web/test/utils/host_progress_popup_test.js
+++ b/ambari-web/test/utils/host_progress_popup_test.js
@@ -302,11 +302,9 @@ describe('App.HostPopup', function () {
 
   describe('#abortRequest', function () {
     beforeEach(function () {
-      sinon.stub(App.ajax, 'send', Em.K);
       sinon.spy(App, 'showConfirmationPopup');
     });
     afterEach(function () {
-      App.ajax.send.restore();
       App.showConfirmationPopup.restore();
     });
     it('should show confirmation popup', function () {

http://git-wip-us.apache.org/repos/asf/ambari/blob/ddf479ef/ambari-web/test/utils/updater_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/utils/updater_test.js b/ambari-web/test/utils/updater_test.js
index 1f0c90f..947411d 100644
--- a/ambari-web/test/utils/updater_test.js
+++ b/ambari-web/test/utils/updater_test.js
@@ -18,84 +18,87 @@
 
 var App = require('app');
 require('utils/updater');
-describe('utils/updater', function() {
-  describe('#App.updater', function() {
-    beforeEach(function() {
-      this.clock = sinon.useFakeTimers();
-      sinon.stub(App.router, "get").returns('test');
-    });
+describe('utils/updater', function () {
+  beforeEach(function () {
+    this.clock = sinon.useFakeTimers();
+    sinon.stub(App.router, "get").returns('test');
+    App.updater.run.restore();
+    sinon.spy(App.updater, 'run');
+    App.updater.immediateRun.restore();
+    sinon.spy(App.updater, 'immediateRun');
+  });
 
-    var tests = {
-      t1: {
-        obj: Em.Object.create({
-          method: sinon.spy(),
-          isWorking: true
-        }),
-        m: 'method called once with default interval in 15 000 ms'
-      },
-      t2: {
-        obj: Em.Object.create({
-          method: function() {}
-        }),
-        m: 'should return false if key name is invalid or absent'
-      },
-      t3: {
-        obj: Em.Object.create({
-          method2: sinon.spy(),
-          isWorking: true
-        }),
-        m: 'method should be called immediately'
-      },
-      t4: {
-        obj: Em.Object.create({
-          method3: sinon.spy(),
-          isWorking: true
-        }),
-        m: 'method call should be ignored if `isWorking` set to false'
-      },
-      t5: {
-        obj: Em.Object.create({
-          method4: sinon.spy(),
-          isWorking: true
-        }),
-        m: 'method call should be ignored if urlPattern is not matching router location'
-      }
-    };
+  var tests = {
+    t1: {
+      obj: Em.Object.create({
+        method: sinon.spy(),
+        isWorking: true
+      }),
+      m: 'method called once with default interval in 15 000 ms'
+    },
+    t2: {
+      obj: Em.Object.create({
+        method: function () {
+        }
+      }),
+      m: 'should return false if key name is invalid or absent'
+    },
+    t3: {
+      obj: Em.Object.create({
+        method2: sinon.spy(),
+        isWorking: true
+      }),
+      m: 'method should be called immediately'
+    },
+    t4: {
+      obj: Em.Object.create({
+        method3: sinon.spy(),
+        isWorking: true
+      }),
+      m: 'method call should be ignored if `isWorking` set to false'
+    },
+    t5: {
+      obj: Em.Object.create({
+        method4: sinon.spy(),
+        isWorking: true
+      }),
+      m: 'method call should be ignored if urlPattern is not matching router location'
+    }
+  };
 
-    it(tests.t1.m, function() {
-      App.updater.run(tests.t1.obj, 'method', 'isWorking');
-      this.clock.tick(15000);
-      expect(tests.t1.obj.method.called).to.be.ok;
-    });
+  it(tests.t1.m, function () {
+    App.updater.run(tests.t1.obj, 'method', 'isWorking');
+    this.clock.tick(3600000 * 1.5);
+    expect(tests.t1.obj.method.called).to.be.ok;
+  });
 
-    it(tests.t2.m, function() {
-      var methodCall = App.updater.run(tests.t2.obj, 'method', 'isWorking');
-      expect(methodCall).to.be.false;
-    });
+  it(tests.t2.m, function () {
+    var methodCall = App.updater.run(tests.t2.obj, 'method', 'isWorking');
+    expect(methodCall).to.be.false;
+  });
 
-    it(tests.t3.m, function() {
-      App.updater.run(tests.t3.obj, 'method2', 'isWorking');
-      App.updater.immediateRun('method2');
-      expect(tests.t3.obj.method2.called).to.be.ok;
-    });
+  it(tests.t3.m, function () {
+    App.updater.run(tests.t3.obj, 'method2', 'isWorking');
+    App.updater.immediateRun('method2');
+    expect(tests.t3.obj.method2.called).to.be.ok;
+  });
 
-    it(tests.t4.m, function() {
-      App.updater.run(tests.t4.obj, 'method3', 'isWorking');
-      this.clock.tick(10000);
-      tests.t4.obj.set('isWorking', false);
-      this.clock.tick(5000);
-      expect(tests.t4.obj.method3.called).to.be.false;
-    });
+  it(tests.t4.m, function () {
+    App.updater.run(tests.t4.obj, 'method3', 'isWorking');
+    this.clock.tick(10000);
+    tests.t4.obj.set('isWorking', false);
+    this.clock.tick(5000);
+    expect(tests.t4.obj.method3.called).to.be.false;
+  });
 
-    it(tests.t5.m, function () {
-      App.updater.run(tests.t5.obj, 'method4', 'isWorking', 15000, 'pattern');
-      this.clock.tick(15000);
-      expect(tests.t5.obj.method4.called).to.be.false;
-    });
+  it(tests.t5.m, function () {
+    App.updater.run(tests.t5.obj, 'method4', 'isWorking', 15000, 'pattern');
+    this.clock.tick(15000);
+    expect(tests.t5.obj.method4.called).to.be.false;
+  });
 
-    afterEach(function() {
-      this.clock.restore();
-      App.router.get.restore();
-    });
+  afterEach(function () {
+    this.clock.restore();
+    App.router.get.restore();
   });
-});
+});
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/ddf479ef/ambari-web/test/views/common/chart/linear_time_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/views/common/chart/linear_time_test.js b/ambari-web/test/views/common/chart/linear_time_test.js
index 377e392..40f11ac 100644
--- a/ambari-web/test/views/common/chart/linear_time_test.js
+++ b/ambari-web/test/views/common/chart/linear_time_test.js
@@ -18,6 +18,7 @@
 
 var App = require('app');
 require('views/common/chart/linear_time');
+var testHelpers = require('test/helpers');
 
 describe('App.ChartLinearTimeView', function () {
 
@@ -464,6 +465,7 @@ describe('App.ChartLinearTimeView.LoadAggregator', function () {
       sinon.stub(aggregator, 'formatRequestData', function(_request){
         return _request.fields;
       });
+      App.ajax.send.restore();
       sinon.stub(App.ajax, 'send', function(){
         return {
           done: Em.K,
@@ -473,7 +475,6 @@ describe('App.ChartLinearTimeView.LoadAggregator', function () {
     });
     afterEach(function () {
       aggregator.groupRequests.restore();
-      App.ajax.send.restore();
       aggregator.formatRequestData.restore();
     });
     it("valid request is sent", function () {
@@ -486,13 +487,12 @@ describe('App.ChartLinearTimeView.LoadAggregator', function () {
         }
       };
       aggregator.runRequests(requests);
-      expect(App.ajax.send.getCall(0).args[0]).to.eql({
-        name: 'r1',
-        sender: context,
-        data: {
-          fields: ['f3', 'f4'],
-          hostName: 'host1'
-        }
+      var args = testHelpers.findAjaxRequest('name', 'r1');
+      expect(args[0]).exists;
+      expect(args[0].sender).to.be.eql(context);
+      expect(args[0].data).to.be.eql({
+        fields: ['f3', 'f4'],
+        hostName: 'host1'
       });
     });
   });

http://git-wip-us.apache.org/repos/asf/ambari/blob/ddf479ef/ambari-web/test/views/common/configs/config_history_flow_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/views/common/configs/config_history_flow_test.js b/ambari-web/test/views/common/configs/config_history_flow_test.js
index df777e9..0733bd8 100644
--- a/ambari-web/test/views/common/configs/config_history_flow_test.js
+++ b/ambari-web/test/views/common/configs/config_history_flow_test.js
@@ -18,7 +18,7 @@
 
 var App = require('app');
 require('views/common/configs/config_history_flow');
-
+var testHelpers = require('test/helpers');
 
 describe.skip('App.ConfigHistoryFlowView', function () {
 
@@ -299,7 +299,7 @@ describe.skip('App.ConfigHistoryFlowView', function () {
       App.tooltip.restore();
     });
 
-    it('App.tooltip is called on�e', function () {
+    it('App.tooltip is called on�e', function () {
       expect(App.tooltip.calledOnce).to.be.true;
     });
   });
@@ -624,16 +624,12 @@ describe.skip('App.ConfigHistoryFlowView', function () {
   describe('#sendRevertCall()', function () {
 
     beforeEach(function () {
-      sinon.stub(App.ajax, 'send', Em.K);
       view.sendRevertCall(Em.Object.create());
     });
 
-    afterEach(function () {
-      App.ajax.send.restore();
-    });
-
     it('request is sent', function () {
-      expect(App.ajax.send.calledOnce).to.be.true;
+      var args = testHelpers.findAjaxRequest('name', 'service.serviceConfigVersion.revert');
+      expect(args).exists;
     });
   });
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/ddf479ef/ambari-web/test/views/common/controls_view_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/views/common/controls_view_test.js b/ambari-web/test/views/common/controls_view_test.js
index a097151..b3ace8c 100644
--- a/ambari-web/test/views/common/controls_view_test.js
+++ b/ambari-web/test/views/common/controls_view_test.js
@@ -19,6 +19,7 @@
 var App = require('app');
 require('views/common/controls_view');
 var validator = require('utils/validator');
+var testHelpers = require('test/helpers');
 
 describe('App.ServiceConfigRadioButtons', function () {
 
@@ -793,23 +794,23 @@ describe('App.CheckDBConnectionView', function () {
         getConnectionProperty: Em.K,
         masterHostName: 'host1'
       });
-      sinon.stub(App.ajax, 'send');
       this.mock = sinon.stub(App.Service, 'find');
     });
     afterEach(function () {
-      App.ajax.send.restore();
       this.mock.restore();
     });
 
     it("service not installed", function() {
       this.mock.returns(Em.Object.create({isLoaded: false}));
       view.createCustomAction();
-      expect(App.ajax.send.getCall(0).args[0].name).to.equal('custom_action.create');
+      var args = testHelpers.findAjaxRequest('name', 'custom_action.create');
+      expect(args[0]).exists;
     });
     it("service is installed", function() {
       this.mock.returns(Em.Object.create({isLoaded: true}));
       view.createCustomAction();
-      expect(App.ajax.send.getCall(0).args[0].name).to.equal('cluster.custom_action.create');
+      var args = testHelpers.findAjaxRequest('name', 'cluster.custom_action.create');
+      expect(args[0]).exists;
     });
   });
 });

http://git-wip-us.apache.org/repos/asf/ambari/blob/ddf479ef/ambari-web/test/views/common/quick_link_view_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/views/common/quick_link_view_test.js b/ambari-web/test/views/common/quick_link_view_test.js
index b9aecee..7f9d1ed 100644
--- a/ambari-web/test/views/common/quick_link_view_test.js
+++ b/ambari-web/test/views/common/quick_link_view_test.js
@@ -18,6 +18,7 @@
 
 var App = require('app');
 require('views/common/quick_view_link_view');
+var testHelpers = require('test/helpers');
 
 describe('App.QuickViewLinks', function () {
 
@@ -111,20 +112,12 @@ describe('App.QuickViewLinks', function () {
   });
 
   describe("#loadTags()", function () {
-    beforeEach(function () {
-      sinon.stub(App.ajax, 'send');
-    });
-    afterEach(function () {
-      App.ajax.send.restore();
-    });
+
     it("call $.ajax", function () {
       quickViewLinks.loadTags();
-      expect(App.ajax.send.calledWith({
-        name: 'config.tags',
-        sender: quickViewLinks,
-        success: 'loadTagsSuccess',
-        error: 'loadTagsError'
-      })).to.be.true;
+      var args = testHelpers.findAjaxRequest('name', 'config.tags');
+      expect(args[0]).exists;
+      expect(args[0].sender).to.be.eql(quickViewLinks);
     });
   });
 
@@ -132,9 +125,7 @@ describe('App.QuickViewLinks', function () {
     beforeEach(function () {
       sinon.stub(quickViewLinks, 'setConfigProperties', function () {
         return {
-          done: function (callback) {
-            callback();
-          }
+          done: Em.clb
         }
       });
       sinon.stub(quickViewLinks, 'getQuickLinksHosts');
@@ -233,7 +224,6 @@ describe('App.QuickViewLinks', function () {
 
   describe("#getQuickLinksHosts()", function () {
     beforeEach(function () {
-      sinon.stub(App.ajax, 'send');
       sinon.stub(App.HostComponent, 'find').returns([
         Em.Object.create({
           isMaster: true,
@@ -242,35 +232,30 @@ describe('App.QuickViewLinks', function () {
       ]);
     });
     afterEach(function () {
-      App.ajax.send.restore();
       App.HostComponent.find.restore();
     });
     it("call $.ajax", function () {
       quickViewLinks.getQuickLinksHosts();
-      expect(App.ajax.send.calledWith({
-        name: 'hosts.for_quick_links',
-        sender: quickViewLinks,
-        data: {
-          clusterName: App.get('clusterName'),
-          masterHosts: 'host1',
-          urlParams: ''
-        },
-        success: 'setQuickLinksSuccessCallback'
-      })).to.be.true;
+      var args = testHelpers.findAjaxRequest('name', 'hosts.for_quick_links');
+      expect(args[0]).exists;
+      expect(args[0].sender).to.be.eql(quickViewLinks);
+      expect(args[0].data).to.be.eql({
+        clusterName: App.get('clusterName'),
+        masterHosts: 'host1',
+        urlParams: ''
+      });
     });
     it("call $.ajax, HBASE service", function () {
       quickViewLinks.set('content.serviceName', 'HBASE');
       quickViewLinks.getQuickLinksHosts();
-      expect(App.ajax.send.calledWith({
-        name: 'hosts.for_quick_links',
-        sender: quickViewLinks,
-        data: {
-          clusterName: App.get('clusterName'),
-          masterHosts: 'host1',
-          urlParams: ',host_components/metrics/hbase/master/IsActiveMaster'
-        },
-        success: 'setQuickLinksSuccessCallback'
-      })).to.be.true;
+      var args = testHelpers.findAjaxRequest('name', 'hosts.for_quick_links');
+      expect(args[0]).exists;
+      expect(args[0].sender).to.be.eql(quickViewLinks);
+      expect(args[0].data).to.be.eql({
+        clusterName: App.get('clusterName'),
+        masterHosts: 'host1',
+        urlParams: ',host_components/metrics/hbase/master/IsActiveMaster'
+      });
     });
   });
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/ddf479ef/ambari-web/test/views/common/widget/gauge_widget_view_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/views/common/widget/gauge_widget_view_test.js b/ambari-web/test/views/common/widget/gauge_widget_view_test.js
index 6ed4828..2ba4816 100644
--- a/ambari-web/test/views/common/widget/gauge_widget_view_test.js
+++ b/ambari-web/test/views/common/widget/gauge_widget_view_test.js
@@ -20,14 +20,24 @@ var App = require('app');
 require('views/common/widget/gauge_widget_view');
 
 describe('App.GaugeWidgetView', function () {
-  var view = App.GaugeWidgetView.create({
-    value: 0,
-    content: {
-      properties: {
-        warning_threshold: 0,
-        critical_threshold: 0
+
+  var view;
+
+  beforeEach(function () {
+    view = App.GaugeWidgetView.create({
+      value: 0,
+      content: {
+        properties: {
+          warning_threshold: 0,
+          critical_threshold: 0
+        }
       }
-    }
+    });
+  });
+
+  afterEach(function () {
+    clearTimeout(view.get('timeoutId'));
+    view.destroy();
   });
 
   describe("#chartView.contentColor()", function() {

http://git-wip-us.apache.org/repos/asf/ambari/blob/ddf479ef/ambari-web/test/views/common/widget/graph_widget_view_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/views/common/widget/graph_widget_view_test.js b/ambari-web/test/views/common/widget/graph_widget_view_test.js
index e34c081..31c9db0 100644
--- a/ambari-web/test/views/common/widget/graph_widget_view_test.js
+++ b/ambari-web/test/views/common/widget/graph_widget_view_test.js
@@ -21,7 +21,17 @@ require('views/common/widget/graph_widget_view');
 var fileUtils = require('utils/file_utils');
 
 describe('App.GraphWidgetView', function () {
-  var view = App.GraphWidgetView.create();
+
+  var view;
+
+  beforeEach(function () {
+    view = App.GraphWidgetView.create();
+  });
+
+  afterEach(function () {
+    clearTimeout(view.get('timeoutId'));
+    view.destroy();
+  });
 
   describe("#adjustData()", function() {
     var testCases = [

http://git-wip-us.apache.org/repos/asf/ambari/blob/ddf479ef/ambari-web/test/views/common/widget/number_widget_view_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/views/common/widget/number_widget_view_test.js b/ambari-web/test/views/common/widget/number_widget_view_test.js
index 3a55314..f82819e 100644
--- a/ambari-web/test/views/common/widget/number_widget_view_test.js
+++ b/ambari-web/test/views/common/widget/number_widget_view_test.js
@@ -20,14 +20,24 @@ var App = require('app');
 require('views/common/widget/number_widget_view');
 
 describe('App.NumberWidgetView', function () {
-  var view = App.NumberWidgetView.create({
-    value: 0,
-    content: {
-      properties: {
-        warning_threshold: 0,
-        critical_threshold: 0
+
+  var view;
+
+  beforeEach(function () {
+    view = App.NumberWidgetView.create({
+      value: 0,
+      content: {
+        properties: {
+          warning_threshold: 0,
+          critical_threshold: 0
+        }
       }
-    }
+    });
+  });
+
+  afterEach(function () {
+    clearTimeout(view.get('timeoutId'));
+    view.destroy();
   });
 
   describe("#contentColor()", function() {

http://git-wip-us.apache.org/repos/asf/ambari/blob/ddf479ef/ambari-web/test/views/main/admin/stack_upgrade/upgrade_group_view_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/views/main/admin/stack_upgrade/upgrade_group_view_test.js b/ambari-web/test/views/main/admin/stack_upgrade/upgrade_group_view_test.js
index 2aed7e9..3adb874 100644
--- a/ambari-web/test/views/main/admin/stack_upgrade/upgrade_group_view_test.js
+++ b/ambari-web/test/views/main/admin/stack_upgrade/upgrade_group_view_test.js
@@ -21,9 +21,19 @@ var App = require('app');
 require('views/main/admin/stack_upgrade/upgrade_group_view');
 
 describe('App.upgradeGroupView', function () {
-  var view = App.upgradeGroupView.create({
-    content: Em.Object.create({}),
-    failedStatuses: ['FAILED']
+  var view;
+
+  beforeEach(function () {
+    view = App.upgradeGroupView.create({
+      content: Em.Object.create({}),
+      failedStatuses: ['FAILED']
+    });
+  });
+
+  afterEach(function () {
+    clearTimeout(view.get('timer'));
+    clearTimeout(view.get('upgradeItemTimer'));
+    view.destroy();
   });
 
   describe("#toggleExpanded()", function () {

http://git-wip-us.apache.org/repos/asf/ambari/blob/ddf479ef/ambari-web/test/views/main/admin/stack_upgrade/upgrade_wizard_view_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/views/main/admin/stack_upgrade/upgrade_wizard_view_test.js b/ambari-web/test/views/main/admin/stack_upgrade/upgrade_wizard_view_test.js
index 25182a1..6349dfe 100644
--- a/ambari-web/test/views/main/admin/stack_upgrade/upgrade_wizard_view_test.js
+++ b/ambari-web/test/views/main/admin/stack_upgrade/upgrade_wizard_view_test.js
@@ -19,12 +19,13 @@
 
 var App = require('app');
 require('views/main/admin/stack_upgrade/upgrade_wizard_view');
+var testHelpers = require('test/helpers');
 
-describe('App.upgradeWizardView', function () {
-  var view = App.upgradeWizardView.create({
+function getView() {
+  var v = App.upgradeWizardView.create({
     failedStatuses: ['FAILED']
   });
-  view.reopen({
+  v.reopen({
     controller: Em.Object.create({
       finalizeContext: 'Confirm Finalize',
       upgradeData: Em.Object.create(),
@@ -35,21 +36,29 @@ describe('App.upgradeWizardView', function () {
       }
     })
   });
-  view.removeObserver('App.clusterName', view, 'startPolling');
+  v.removeObserver('App.clusterName', v, 'startPolling');
+  return v;
+}
+
+describe('App.upgradeWizardView', function () {
+  var view;
 
   beforeEach(function () {
+    App.ajax.send.restore();
     sinon.stub(App.ajax, 'send').returns({
       complete: Em.clb
     });
+    view = getView();
   });
 
   afterEach(function () {
-    App.ajax.send.restore();
+    clearTimeout(view.get('upgradeItemTimer'));
+    view.destroy();
   });
 
-  App.TestAliases.testAsComputedOr(view, 'isManualProceedDisabled', ['!isManualDone', 'controller.requestInProgress']);
+  App.TestAliases.testAsComputedOr(getView(), 'isManualProceedDisabled', ['!isManualDone', 'controller.requestInProgress']);
 
-  App.TestAliases.testAsComputedEqualProperties(view, 'isFinalizeItem', 'manualItem.context', 'controller.finalizeContext');
+  App.TestAliases.testAsComputedEqualProperties(getView(), 'isFinalizeItem', 'manualItem.context', 'controller.finalizeContext');
 
   describe("#upgradeGroups", function () {
     it("upgradeGroups is null", function () {
@@ -107,9 +116,7 @@ describe('App.upgradeWizardView', function () {
     beforeEach(function () {
       sinon.stub(view.get('controller'), 'loadUpgradeData', function () {
         return {
-          done: function (callback) {
-            callback();
-          }
+          done: Em.clb
         }
       });
       sinon.stub(view, 'doPolling', Em.K);
@@ -135,10 +142,10 @@ describe('App.upgradeWizardView', function () {
   });
 
   describe("#willInsertElement()", function () {
-    before(function () {
+    beforeEach(function () {
       sinon.stub(view, 'startPolling', Em.K);
     });
-    after(function () {
+    afterEach(function () {
       view.startPolling.restore();
     });
     it("call startPolling()", function () {
@@ -159,9 +166,7 @@ describe('App.upgradeWizardView', function () {
     beforeEach(function () {
       sinon.stub(view.get('controller'), 'loadUpgradeData', function () {
         return {
-          done: function (callback) {
-            callback();
-          }
+          done: Em.clb
         }
       });
       sinon.spy(view, 'doPolling');
@@ -231,6 +236,13 @@ describe('App.upgradeWizardView', function () {
   });
 
   describe("#manualItem", function () {
+
+    beforeEach(function () {
+      view.reopen({
+        activeGroup: Em.Object.create()
+      });
+    });
+
     it("no running item", function () {
       view.set('activeGroup.upgradeItems', []);
       view.propertyDidChange('manualItem');
@@ -252,6 +264,13 @@ describe('App.upgradeWizardView', function () {
   });
 
   describe("#failedItem", function () {
+
+    beforeEach(function () {
+      view.reopen({
+        activeGroup: Em.Object.create()
+      });
+    });
+
     it("no running item", function () {
       view.set('activeGroup.upgradeItems', []);
       view.propertyDidChange('failedItem');
@@ -265,6 +284,13 @@ describe('App.upgradeWizardView', function () {
   });
 
   describe("#runningItem", function () {
+
+    beforeEach(function () {
+      view.reopen({
+        activeGroup: Em.Object.create()
+      });
+    });
+
     it("no running item", function () {
       view.set('activeGroup.upgradeItems', []);
       view.propertyDidChange('runningItem');
@@ -395,7 +421,7 @@ describe('App.upgradeWizardView', function () {
     });
   });
 
-  App.TestAliases.testAsComputedAnd(view, 'isDowngradeAvailable', ['!controller.isDowngrade', 'controller.downgradeAllowed']);
+  App.TestAliases.testAsComputedAnd(getView(), 'isDowngradeAvailable', ['!controller.isDowngrade', 'controller.downgradeAllowed']);
 
   describe("#taskDetails", function () {
     it("runningItem present", function () {
@@ -429,10 +455,10 @@ describe('App.upgradeWizardView', function () {
   });
 
   describe("#toggleDetails()", function () {
-    before(function () {
+    beforeEach(function () {
       sinon.stub(view, 'toggleProperty', Em.K);
     });
-    after(function () {
+    afterEach(function () {
       view.toggleProperty.restore();
     });
     it("isDetailsOpened is toggled", function () {
@@ -442,6 +468,11 @@ describe('App.upgradeWizardView', function () {
   });
 
   describe("#upgradeStatusLabel", function () {
+
+    beforeEach(function () {
+      Em.setFullPath(view, 'controller.upgradeData.Upgrade', {});
+    });
+
     [
       {
         data: {
@@ -604,19 +635,19 @@ describe('App.upgradeWizardView', function () {
     beforeEach(function () {
       sinon.stub(view.get('controller'), 'getUpgradeItem', function () {
         return {
-          complete: function (callback) {
-            callback();
-          }
+          complete: Em.clb
         }
       });
       sinon.spy(view, 'doUpgradeItemPolling');
       this.clock = sinon.useFakeTimers();
     });
+
     afterEach(function () {
       view.get('controller').getUpgradeItem.restore();
       view.doUpgradeItemPolling.restore();
       this.clock.restore();
     });
+
     it("running item details", function () {
       view.reopen({
         runningItem: {},
@@ -628,24 +659,24 @@ describe('App.upgradeWizardView', function () {
       this.clock.tick(App.bgOperationsUpdateInterval);
       expect(view.doUpgradeItemPolling.calledTwice).to.be.true;
     });
+
     it("failed item details", function () {
       view.reopen({
         failedItem: {},
         runningItem: null
       });
       view.set('isDetailsOpened', true);
-      view.doUpgradeItemPolling();
       expect(view.get('controller').getUpgradeItem.calledOnce).to.be.true;
       this.clock.tick(App.bgOperationsUpdateInterval);
       expect(view.doUpgradeItemPolling.calledTwice).to.be.true;
     });
+
     it("details not opened", function () {
       view.set('isDetailsOpened', false);
       //doUpgradeItemPolling triggered by observer
-      expect(view.get('controller').getUpgradeItem.calledOnce).to.be.false;
-      this.clock.tick(App.bgOperationsUpdateInterval);
-      expect(view.doUpgradeItemPolling.calledOnce).to.be.true;
+      expect(view.get('controller').getUpgradeItem.called).to.be.false;
     });
+
   });
 
   describe('#getSkippedServiceChecks()', function () {
@@ -689,17 +720,25 @@ describe('App.upgradeWizardView', function () {
           view.propertyDidChange('isFinalizeItem');
         });
 
-        it('request is sent ' + item.ajaxSendCallCount + ' times', function (){
-          expect(App.ajax.send.callCount).to.equal(item.ajaxSendCallCount);
-        });
-
         it('areSkippedServiceChecksLoaded is ' + item.areSkippedServiceChecksLoaded, function () {
           expect(view.get('controller.areSkippedServiceChecksLoaded')).to.equal(item.areSkippedServiceChecksLoadedResult);
         });
 
         if (item.ajaxSendCallCount) {
+          it('request is sent ' + item.ajaxSendCallCount + ' times', function (){
+            var args = testHelpers.findAjaxRequest('name', 'admin.upgrade.service_checks');
+            expect(args).to.have.property('length').equal(item.ajaxSendCallCount);
+          });
+
           it('upgradeId is 1', function () {
-            expect(App.ajax.send.firstCall.args[0].data.upgradeId).to.equal(1);
+            var args = testHelpers.findAjaxRequest('name', 'admin.upgrade.service_checks');
+            expect(args[0].data.upgradeId).to.equal(1);
+          });
+        }
+        else {
+          it('request is not sent times', function () {
+            var args = testHelpers.findAjaxRequest('name', 'admin.upgrade.service_checks');
+            expect(args).not.exists;
           });
         }
       });
@@ -809,9 +848,7 @@ describe('App.upgradeWizardView', function () {
     beforeEach(function () {
       sinon.stub(view.get('controller'), 'getUpgradeItem', function () {
         return {
-          complete: function (callback) {
-            callback();
-          }
+          complete: Em.clb
         }
       });
       view.set('controller.areSlaveComponentFailuresHostsLoaded', false);
@@ -841,9 +878,7 @@ describe('App.upgradeWizardView', function () {
     beforeEach(function () {
       sinon.stub(view.get('controller'), 'getUpgradeItem', function () {
         return {
-          complete: function (callback) {
-            callback();
-          }
+          complete: Em.clb
         }
       });
       view.set('controller.areServiceCheckFailuresServicenamesLoaded', false);

http://git-wip-us.apache.org/repos/asf/ambari/blob/ddf479ef/ambari-web/test/views/main/admin/stack_upgrade/version_view_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/views/main/admin/stack_upgrade/version_view_test.js b/ambari-web/test/views/main/admin/stack_upgrade/version_view_test.js
index c4eaa74..511c549 100644
--- a/ambari-web/test/views/main/admin/stack_upgrade/version_view_test.js
+++ b/ambari-web/test/views/main/admin/stack_upgrade/version_view_test.js
@@ -19,16 +19,26 @@
 
 var App = require('app');
 require('views/main/admin/stack_upgrade/upgrade_wizard_view');
+var testHelpers = require('test/helpers');
 
 describe('App.mainAdminStackVersionsView', function () {
-  var view = App.MainAdminStackVersionsView.create({
-    controller: {
-      currentVersion: {
-        repository_version: "2.2.1.0",
-        runningCheckRequests: []
-      },
-      load: Em.K
-    }
+  var view;
+
+  beforeEach(function () {
+    view = App.MainAdminStackVersionsView.create({
+      controller: {
+        currentVersion: {
+          repository_version: "2.2.1.0",
+          runningCheckRequests: []
+        },
+        load: Em.K
+      }
+    });
+  });
+
+  afterEach(function () {
+    clearTimeout(view.get('updateTimer'));
+    view.destroy();
   });
 
   describe("#filterBy()", function () {
@@ -226,10 +236,10 @@ describe('App.mainAdminStackVersionsView', function () {
   });
 
   describe("#didInsertElement()", function() {
-    before(function () {
+    beforeEach(function () {
       sinon.stub(view, 'observesCategories', Em.K);
     });
-    after(function () {
+    afterEach(function () {
       view.observesCategories.restore();
     });
     it("observesCategories is called once", function() {
@@ -300,11 +310,11 @@ describe('App.mainAdminStackVersionsView', function () {
   });
 
   describe("#filterVersions()", function() {
-    before(function () {
+    beforeEach(function () {
       sinon.stub(view, 'filterBy').returns([{id: 1}]);
       sinon.stub(view, 'observesCategories', Em.K);
     });
-    after(function () {
+    afterEach(function () {
       view.filterBy.restore();
       view.observesCategories.restore();
     });
@@ -316,49 +326,54 @@ describe('App.mainAdminStackVersionsView', function () {
   });
 
   describe("#goToVersions()", function() {
+    var data = {
+      components: [{
+        'RootServiceComponents': {
+          'component_version': '1.9.0'
+        }
+      }, {
+        'RootServiceComponents': {
+          'component_version': '2.1.0'
+        }
+      }, {
+        'RootServiceComponents': {
+          'component_version': '2.0.0'
+        }
+      }]
+    };
     before(function () {
       sinon.spy(App, 'showConfirmationPopup');
       sinon.stub(window.location, 'replace', Em.K);
-      var data = {
-        components: [{
-          'RootServiceComponents': {
-            'component_version': '1.9.0'
-          }
-        }, {
-          'RootServiceComponents': {
-            'component_version': '2.1.0'
-          }
-        }, {
-          'RootServiceComponents': {
-            'component_version': '2.0.0'
-          }
-        }]
-      };
-      sinon.stub(App.ajax, 'send').returns({
-        then: function(callback) {
-          callback(data);
-        }
-      });
     });
     after(function () {
       App.showConfirmationPopup.restore();
       window.location.replace.restore();
+    });
+
+    beforeEach(function () {
       App.ajax.send.restore();
+      sinon.stub(App.ajax, 'send').returns({
+        then: function(callback) {
+          callback(data);
+        }
+      });
     });
+
     it("should go to link using the version retrieved by query", function() {
       var popup = view.goToVersions();
       expect(App.showConfirmationPopup.calledOnce).to.be.true;
       popup.onPrimary();
-      expect(App.ajax.send.calledOnce).to.be.true;
+      var args = testHelpers.findAjaxRequest('name', 'ambari.service.load_server_version');
+      expect(args[0]).exists;
       expect(window.location.replace.calledWith('/views/ADMIN_VIEW/2.1.0/INSTANCE/#/stackVersions')).to.be.true;
     });
   });
 
   describe("#willInsertElement()", function() {
-    before(function () {
+    beforeEach(function () {
       sinon.stub(view, 'poll', Em.K);
     });
-    after(function () {
+    afterEach(function () {
       view.poll.restore();
     });
     it("poll is called once", function() {

http://git-wip-us.apache.org/repos/asf/ambari/blob/ddf479ef/ambari-web/test/views/main/dashboard/widget_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/views/main/dashboard/widget_test.js b/ambari-web/test/views/main/dashboard/widget_test.js
index e27d0f7..6450d1c 100644
--- a/ambari-web/test/views/main/dashboard/widget_test.js
+++ b/ambari-web/test/views/main/dashboard/widget_test.js
@@ -72,20 +72,13 @@ describe('App.DashboardWidgetView', function () {
         complete: Em.K
       });
     });
+
     afterEach(function () {
       dashboardWidgetView.get('parentView').widgetsMapper.restore();
       dashboardWidgetView.get('parentView').getUserPref.restore();
     });
-    it("testMode is on", function () {
-      App.set('testMode', true);
-      dashboardWidgetView.set('id', '1');
-      dashboardWidgetView.deleteWidget();
-      expect(dashboardWidgetView.get('parentView').widgetsMapper.calledWith('1')).to.be.true;
-      expect(dashboardWidgetView.get('parentView.visibleWidgets')).to.be.empty;
-      expect(dashboardWidgetView.get('parentView.hiddenWidgets')).to.not.be.empty;
-    });
+
     it("testMode is off", function () {
-      App.set('testMode', false);
       dashboardWidgetView.set('parentView.persistKey', 'key');
       dashboardWidgetView.deleteWidget();
       expect(dashboardWidgetView.get('parentView').getUserPref.calledWith('key')).to.be.true;

http://git-wip-us.apache.org/repos/asf/ambari/blob/ddf479ef/ambari-web/test/views/main/dashboard/widgets/namenode_cpu_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/views/main/dashboard/widgets/namenode_cpu_test.js b/ambari-web/test/views/main/dashboard/widgets/namenode_cpu_test.js
index 347d5d0..cb5da49 100644
--- a/ambari-web/test/views/main/dashboard/widgets/namenode_cpu_test.js
+++ b/ambari-web/test/views/main/dashboard/widgets/namenode_cpu_test.js
@@ -26,19 +26,28 @@ require('views/main/dashboard/widgets/namenode_cpu');
 
 describe('App.NameNodeCpuPieChartView', function() {
 
-  var model = Em.Object.create({
-    used: null,
-    max: null
-  });
-  var nameNodeCpuPieChartView = App.NameNodeCpuPieChartView.create({
-    model_type: null,
-    model: model,
-    modelFieldUsed: 'used',
-    modelFieldMax: 'max',
-    widgetHtmlId: 'fake'
+  var model;
+  var nameNodeCpuPieChartView;
+
+  beforeEach(function () {
+    model = Em.Object.create({
+      used: null,
+      max: null
+    });
+    nameNodeCpuPieChartView = App.NameNodeCpuPieChartView.create({
+      model_type: null,
+      model: model,
+      modelFieldUsed: 'used',
+      modelFieldMax: 'max',
+      widgetHtmlId: 'fake'
+    });
+    nameNodeCpuPieChartView.calc();
   });
 
-  nameNodeCpuPieChartView.calc();
+  afterEach(function () {
+    nameNodeCpuPieChartView.destroy();
+    clearTimeout(nameNodeCpuPieChartView.get('intervalId'));
+  });
 
   describe('#calcIsPieExists', function() {
     var tests = [

http://git-wip-us.apache.org/repos/asf/ambari/blob/ddf479ef/ambari-web/test/views/main/dashboard/widgets_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/views/main/dashboard/widgets_test.js b/ambari-web/test/views/main/dashboard/widgets_test.js
index eb27237..ca0837a 100644
--- a/ambari-web/test/views/main/dashboard/widgets_test.js
+++ b/ambari-web/test/views/main/dashboard/widgets_test.js
@@ -232,20 +232,13 @@ describe('App.MainDashboardWidgetsView', function () {
         });
         sinon.stub(view, 'widgetsMapper').returns(widget);
       });
+
       afterEach(function () {
         view.getUserPref.restore();
         view.widgetsMapper.restore();
       });
-      it("testMode is on", function () {
-        App.set('testMode', true);
-        plusButtonFilterView.set('hiddenWidgets', [widget]);
-        plusButtonFilterView.applyFilter();
-        expect(view.getUserPref.called).to.be.false;
-        expect(plusButtonFilterView.get('visibleWidgets')).not.to.be.empty;
-        expect(plusButtonFilterView.get('hiddenWidgets')).to.be.empty;
-      });
+
       it("testMode is off", function () {
-        App.set('testMode', false);
         plusButtonFilterView.applyFilter();
         expect(view.getUserPref.calledOnce).to.be.true;
       });
@@ -350,18 +343,13 @@ describe('App.MainDashboardWidgetsView', function () {
       sinon.stub(view, 'translateToReal', Em.K);
       sinon.stub(view, 'getUserPref').returns({complete: Em.K});
     });
+
     afterEach(function () {
       view.translateToReal.restore();
       view.getUserPref.restore();
     });
 
-    it("testMode is true", function () {
-      App.set('testMode', true);
-      view.setOnLoadVisibleWidgets();
-      expect(view.translateToReal.calledOnce).to.be.true;
-    });
     it("testMode is false", function () {
-      App.set('testMode', false);
       view.setOnLoadVisibleWidgets();
       expect(view.getUserPref.calledOnce).to.be.true;
     });

http://git-wip-us.apache.org/repos/asf/ambari/blob/ddf479ef/ambari-web/test/views/main/host/details/host_component_views/datanode_view_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/views/main/host/details/host_component_views/datanode_view_test.js b/ambari-web/test/views/main/host/details/host_component_views/datanode_view_test.js
index a217495..e7b7eef 100644
--- a/ambari-web/test/views/main/host/details/host_component_views/datanode_view_test.js
+++ b/ambari-web/test/views/main/host/details/host_component_views/datanode_view_test.js
@@ -18,6 +18,7 @@
 
 var App = require('app');
 require('views/main/host/details/host_component_views/datanode_view');
+var testHelpers = require('test/helpers');
 
 describe('App.DataNodeComponentView', function () {
   var view = App.DataNodeComponentView.create({
@@ -30,11 +31,9 @@ describe('App.DataNodeComponentView', function () {
 
     beforeEach(function () {
       this.stub = sinon.stub(App.HDFSService, 'find');
-      sinon.stub(App.ajax, 'send');
     });
 
     afterEach(function () {
-      App.ajax.send.restore();
       this.stub.restore();
     });
 
@@ -47,7 +46,9 @@ describe('App.DataNodeComponentView', function () {
         })
       ]);
       view.getDNDecommissionStatus();
-      expect(App.ajax.send.getCall(0).args[0].data).to.eql({
+      var args = testHelpers.findAjaxRequest('name', 'host.host_component.decommission_status_datanode');
+      expect(args[0]).exists;
+      expect(args[0].data).to.be.eql({
         "hostName": "host1",
         "componentName": "NAMENODE"
       });
@@ -62,7 +63,9 @@ describe('App.DataNodeComponentView', function () {
         })
       ]);
       view.getDNDecommissionStatus();
-      expect(App.ajax.send.getCall(0).args[0].data).to.eql({
+      var args = testHelpers.findAjaxRequest('name', 'host.host_component.decommission_status_datanode');
+      expect(args[0]).exists;
+      expect(args[0].data).to.be.eql({
         "hostName": "host1",
         "componentName": "NAMENODE"
       });
@@ -77,7 +80,9 @@ describe('App.DataNodeComponentView', function () {
         })
       ]);
       view.getDNDecommissionStatus();
-      expect(App.ajax.send.getCall(0).args[0].data).to.eql({
+      var args = testHelpers.findAjaxRequest('name', 'host.host_component.decommission_status_datanode');
+      expect(args[0]).exists;
+      expect(args[0].data).to.be.eql({
         "hostName": "host2",
         "componentName": "NAMENODE"
       });

http://git-wip-us.apache.org/repos/asf/ambari/blob/ddf479ef/ambari-web/test/views/main/host/details/host_component_views/decommissionable_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/views/main/host/details/host_component_views/decommissionable_test.js b/ambari-web/test/views/main/host/details/host_component_views/decommissionable_test.js
index b5cbbe5..caeaab0 100644
--- a/ambari-web/test/views/main/host/details/host_component_views/decommissionable_test.js
+++ b/ambari-web/test/views/main/host/details/host_component_views/decommissionable_test.js
@@ -21,6 +21,7 @@ require('models/host_component');
 require('views/main/host/details/host_component_view');
 require('mixins');
 require('mixins/main/host/details/host_components/decommissionable');
+var testHelpers = require('test/helpers');
 
 var hostComponentView;
 
@@ -223,18 +224,14 @@ describe('App.Decommissionable', function() {
   });
 
   describe("#getDesiredAdminState()", function() {
-    beforeEach(function () {
-      sinon.stub(App.ajax, 'send', Em.K);
-    });
-    afterEach(function () {
-      App.ajax.send.restore();
-    });
+
     it("content is null", function() {
       hostComponentView = Em.View.create(App.Decommissionable, {
         content: null
       });
       hostComponentView.getDesiredAdminState();
-      expect(App.ajax.send.called).to.be.false;
+      var args = testHelpers.findAjaxRequest('name', 'host.host_component.slave_desired_admin_state');
+      expect(args).not.exists;
     });
     it("content is correct", function() {
       hostComponentView = Em.View.create(App.Decommissionable, {
@@ -244,16 +241,13 @@ describe('App.Decommissionable', function() {
         })
       });
       hostComponentView.getDesiredAdminState();
-      expect(App.ajax.send.calledWith({
-        name: 'host.host_component.slave_desired_admin_state',
-        sender: hostComponentView,
-        data: {
-          hostName: 'host1',
-          componentName: 'C1'
-        },
-        success: 'getDesiredAdminStateSuccessCallback',
-        error: 'getDesiredAdminStateErrorCallback'
-      })).to.be.true;
+      var args = testHelpers.findAjaxRequest('name', 'host.host_component.slave_desired_admin_state');
+      expect(args[0]).exists;
+      expect(args[0].sender).to.be.eql(hostComponentView);
+      expect(args[0].data).to.be.eql({
+        hostName: 'host1',
+        componentName: 'C1'
+      });
     });
   });
 });

http://git-wip-us.apache.org/repos/asf/ambari/blob/ddf479ef/ambari-web/test/views/main/service/services/ranger_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/views/main/service/services/ranger_test.js b/ambari-web/test/views/main/service/services/ranger_test.js
index c348b03..a7c683f 100644
--- a/ambari-web/test/views/main/service/services/ranger_test.js
+++ b/ambari-web/test/views/main/service/services/ranger_test.js
@@ -31,16 +31,6 @@ describe('App.MainDashboardServiceRangerView', function () {
 
   describe('#didInsertElement', function () {
 
-    beforeEach(function () {
-      sinon.stub(App.updater, 'run', Em.K);
-      sinon.stub(App.updater, 'immediateRun', Em.K);
-    });
-
-    afterEach(function () {
-      App.updater.run.restore();
-      App.updater.immediateRun.restore();
-    });
-
     it('should run updater', function () {
       view.didInsertElement();
       expect(App.updater.run.calledOnce).to.be.true;


[05/22] ambari git commit: AMBARI-14741. Ambari Web Unit Test failure on trunk (App.WizardStep8Controller) (onechiporenko)

Posted by nc...@apache.org.
AMBARI-14741. Ambari Web Unit Test failure on trunk (App.WizardStep8Controller) (onechiporenko)


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

Branch: refs/heads/branch-dev-patch-upgrade
Commit: ddf479ef9ef1f4754cbfae075f0a9f36d99c901e
Parents: 9f76f60
Author: Oleg Nechiporenko <on...@apache.org>
Authored: Wed Jan 20 17:30:49 2016 +0200
Committer: Oleg Nechiporenko <on...@apache.org>
Committed: Wed Jan 20 19:19:39 2016 +0200

----------------------------------------------------------------------
 ambari-web/app/assets/test/tests.js             |  43 ++++
 ambari-web/app/router.js                        |   3 +
 ambari-web/app/utils/ajax/ajax.js               |   6 +-
 ambari-web/app/utils/ajax/ajax_queue.js         |  28 +--
 ambari-web/app/utils/helper.js                  |   2 +-
 ambari-web/package.json                         |   2 +-
 ambari-web/test/controllers/application_test.js |  24 +--
 .../global/background_operations_test.js        |  19 +-
 .../global/cluster_controller_test.js           |  71 +++----
 .../global/update_controller_test.js            |  23 +--
 .../global/user_settings_controller_test.js     |   4 -
 ambari-web/test/controllers/installer_test.js   |  10 -
 .../progress_controller_test.js                 |  11 +-
 .../progress_popup_controller_test.js           |  43 +---
 .../resourceManager/step3_controller_test.js    |  11 +-
 .../controllers/main/admin/kerberos_test.js     |  30 +--
 .../admin/stack_and_upgrade_controller_test.js  | 175 ++++++----------
 .../main/alert_definitions_controller_test.js   |   9 +-
 .../add_alert_definition_controller_test.js     |  20 +-
 .../alerts/alert_instances_controller_test.js   |  21 +-
 .../definitions_configs_controller_test.js      |  10 +-
 .../definitions_details_controller_test.js      |  37 +---
 ...anage_alert_notifications_controller_test.js |  15 +-
 .../controllers/main/charts/heatmap_test.js     |  61 ++----
 .../dashboard/config_history_controller_test.js |  26 +--
 .../main/host/add_controller_test.js            |  42 ++--
 .../test/controllers/main/host/details_test.js  | 197 +++++++++---------
 ambari-web/test/controllers/main/host_test.js   |  14 +-
 .../main/service/add_controller_test.js         |  75 +------
 .../main/service/info/config_test.js            |  21 +-
 .../main/service/info/summary_test.js           | 107 +---------
 .../test/controllers/main/service/item_test.js  |  27 +--
 .../service/reassign/step1_controller_test.js   |  27 +--
 .../service/reassign/step4_controller_test.js   | 201 +++++++++----------
 .../service/reassign/step6_controller_test.js   |  24 ++-
 .../service/reassign/step7_controller_test.js   |  53 +++--
 .../test/controllers/main/service_test.js       |  31 +--
 .../controllers/main/views_controller_test.js   |   9 +-
 ambari-web/test/controllers/main_test.js        |  25 +--
 .../test/controllers/wizard/step2_test.js       |  11 +-
 .../test/controllers/wizard/step3_test.js       |  95 ++-------
 .../test/controllers/wizard/step6_test.js       |   9 -
 .../test/controllers/wizard/step7_test.js       |  18 +-
 .../test/controllers/wizard/step8_test.js       |  85 ++------
 .../test/controllers/wizard/step9_test.js       |  31 +--
 ambari-web/test/controllers/wizard_test.js      |   8 +-
 ambari-web/test/helpers.js                      |  77 +++++++
 .../common/table_server_view_mixin_test.js      |   1 +
 .../test/mixins/common/widget_mixin_test.js     |  91 ++++-----
 .../common/widgets/export_metrics_mixin_test.js |  15 +-
 .../host_components/decommissionable_test.js    |  25 +--
 .../host_components/install_component_test.js   |  97 ++++-----
 .../wizard/wizardProgressPageController_test.js |  24 +--
 ambari-web/test/models/cluster_states_test.js   |   2 -
 ambari-web/test/models/host_test.js             |   4 -
 ambari-web/test/router_test.js                  |  40 +---
 ambari-web/test/utils/ajax/ajax_queue_test.js   |   8 -
 ambari-web/test/utils/ajax/ajax_test.js         |  17 +-
 .../test/utils/batch_scheduled_requests_test.js |  71 -------
 .../test/utils/host_progress_popup_test.js      |   2 -
 ambari-web/test/utils/updater_test.js           | 149 +++++++-------
 .../test/views/common/chart/linear_time_test.js |  16 +-
 .../common/configs/config_history_flow_test.js  |  12 +-
 .../test/views/common/controls_view_test.js     |   9 +-
 .../test/views/common/quick_link_view_test.js   |  59 ++----
 .../common/widget/gauge_widget_view_test.js     |  24 ++-
 .../common/widget/graph_widget_view_test.js     |  12 +-
 .../common/widget/number_widget_view_test.js    |  24 ++-
 .../stack_upgrade/upgrade_group_view_test.js    |  16 +-
 .../stack_upgrade/upgrade_wizard_view_test.js   | 107 ++++++----
 .../admin/stack_upgrade/version_view_test.js    |  85 ++++----
 .../test/views/main/dashboard/widget_test.js    |  11 +-
 .../main/dashboard/widgets/namenode_cpu_test.js |  31 ++-
 .../test/views/main/dashboard/widgets_test.js   |  18 +-
 .../host_component_views/datanode_view_test.js  |  15 +-
 .../decommissionable_test.js                    |  28 +--
 .../views/main/service/services/ranger_test.js  |  10 -
 77 files changed, 1151 insertions(+), 1763 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/ddf479ef/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 d6b0de8..2b801f0 100644
--- a/ambari-web/app/assets/test/tests.js
+++ b/ambari-web/app/assets/test/tests.js
@@ -341,9 +341,52 @@ var files = [
   'test/views/main/service/menu_test'
 ];
 
+var ajaxSendMock = {
+  complete: Em.K,
+  success: Em.K,
+  then: Em.K,
+  promise: Em.K,
+  done: Em.clb,
+  error: Em.K,
+  retry: function () {
+    return {
+      then: Em.K,
+      complete: Em.K
+    }
+  },
+  fail: Em.K,
+  always: Em.clb
+};
+
+// don't poll anything while test are running
+App.bgOperationsUpdateInterval = 3600000;
+App.componentsUpdateInterval = 3600000;
+App.contentUpdateInterval = 3600000;
+App.hostStatusCountersUpdateInterval = 3600000;
+App.alertDefinitionsUpdateInterval = 3600000;
+App.alertInstancesUpdateInterval = 3600000;
+App.alertGroupsUpdateInterval = 3600000;
+
 App.initialize();
 describe('Ambari Web Unit tests', function() {
 
+  beforeEach(function () {
+    App.set('testMode', false); // don't even try to write tests for testMode = true
+    sinon.stub($, 'ajax', Em.K);
+    sinon.stub(App.ajax, 'send', function () {
+      return ajaxSendMock;
+    });
+    sinon.stub(App.updater, 'run', Em.K);
+    sinon.stub(App.updater, 'immediateRun', Em.K);
+  });
+
+  afterEach(function () {
+    App.ajax.send.restore();
+    $.ajax.restore();
+    App.updater.run.restore();
+    App.updater.immediateRun.restore();
+  });
+
   files.forEach(function (file) {
     describe(file, function() {
       require(file);

http://git-wip-us.apache.org/repos/asf/ambari/blob/ddf479ef/ambari-web/app/router.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/router.js b/ambari-web/app/router.js
index 92b2bae..c7f59c0 100644
--- a/ambari-web/app/router.js
+++ b/ambari-web/app/router.js
@@ -687,6 +687,9 @@ App.Router = Em.Router.extend({
        *  If the user is already logged in, redirect to where the user was previously
        */
       enter: function (router, context) {
+        if ($.mocho) {
+          return;
+        }
         var location = router.location.location.hash;
         router.getAuthenticated().done(function (loggedIn) {
           if (loggedIn) {

http://git-wip-us.apache.org/repos/asf/ambari/blob/ddf479ef/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 a7c9e4e..4762d34 100644
--- a/ambari-web/app/utils/ajax/ajax.js
+++ b/ambari-web/app/utils/ajax/ajax.js
@@ -2808,7 +2808,6 @@ var formatRequest = function (data) {
     type: this.type || 'GET',
     timeout: App.timeout,
     dataType: 'json',
-    statusCode: require('data/statusCodes'),
     headers: {}
   };
   if (App.get('testMode')) {
@@ -2823,6 +2822,11 @@ var formatRequest = function (data) {
   if (this.format) {
     jQuery.extend(opt, this.format(data, opt));
   }
+  var statusCode = jQuery.extend({}, require('data/statusCodes'));
+  statusCode['404'] = function () {
+    console.log("Error code 404: URI not found. -> " + opt.url);
+  };
+  opt.statusCode = statusCode;
   return opt;
 };
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/ddf479ef/ambari-web/app/utils/ajax/ajax_queue.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/utils/ajax/ajax_queue.js b/ambari-web/app/utils/ajax/ajax_queue.js
index 7187788..1c2106f 100644
--- a/ambari-web/app/utils/ajax/ajax_queue.js
+++ b/ambari-web/app/utils/ajax/ajax_queue.js
@@ -152,19 +152,21 @@ App.ajaxQueue = Em.Object.extend({
     var r = App.ajax.send(queue.shift());
     this.propertyDidChange('queue');
     if (r) {
-      r.complete(function(xhr) {
-        if(xhr.status>=200 && xhr.status <= 299) {
-          self.runNextRequest();
-        }
-        else {
-          if (self.get('abortOnError')) {
-            self.clear();
-          }
-          else {
-            self.runNextRequest();
-          }
-        }
-      });
+      r.complete(this._complete);
+    }
+    else {
+      if (this.get('abortOnError')) {
+        this.clear();
+      }
+      else {
+        this.runNextRequest();
+      }
+    }
+  },
+
+  _complete: function(xhr) {
+    if(xhr.status>=200 && xhr.status <= 299) {
+      this.runNextRequest();
     }
     else {
       if (this.get('abortOnError')) {

http://git-wip-us.apache.org/repos/asf/ambari/blob/ddf479ef/ambari-web/app/utils/helper.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/utils/helper.js b/ambari-web/app/utils/helper.js
index 296a8e8..a1d4b30 100644
--- a/ambari-web/app/utils/helper.js
+++ b/ambari-web/app/utils/helper.js
@@ -736,7 +736,7 @@ App.popover = function (self, options) {
  * @param {object} options
  */
 App.tooltip = function (self, options) {
-  if (!self) return;
+  if (!self || !self.tooltip) return;
   self.tooltip(options);
   /* istanbul ignore next */
   self.on("remove", function () {

http://git-wip-us.apache.org/repos/asf/ambari/blob/ddf479ef/ambari-web/package.json
----------------------------------------------------------------------
diff --git a/ambari-web/package.json b/ambari-web/package.json
index 10a9314..550d293 100644
--- a/ambari-web/package.json
+++ b/ambari-web/package.json
@@ -1,7 +1,7 @@
 {
   "name": "Ambari",
   "description": "Front-end package for the Apache Ambari Project",
-  "version": "2.2.0",
+  "version": "2.4.0",
   "homepage": "http://ambari.apache.org/",
   "repository": {
     "type": "git",

http://git-wip-us.apache.org/repos/asf/ambari/blob/ddf479ef/ambari-web/test/controllers/application_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/controllers/application_test.js b/ambari-web/test/controllers/application_test.js
index efe5103..cdeb06e 100644
--- a/ambari-web/test/controllers/application_test.js
+++ b/ambari-web/test/controllers/application_test.js
@@ -19,6 +19,7 @@
 
 var App = require('app');
 require('models/cluster');
+var testHelpers = require('test/helpers');
 
 function getController() {
   return App.ApplicationController.create();
@@ -90,30 +91,15 @@ describe('App.ApplicationController', function () {
   });
 
   describe('#getStack', function() {
-    var res;
-    beforeEach(function () {
-      sinon.stub(App.ajax, 'send', function(data) {
-        res = data;
-      });
-    });
-    afterEach(function () {
-      App.ajax.send.restore();
-    });
+
     it ('Should return send value', function() {
       var callback = {
         'callback': true
       };
       applicationController.getStack(callback);
-      res = JSON.parse(JSON.stringify(res));
-      expect(res).to.be.eql({
-        "name": "router.login.clusters",
-        "sender": {
-          "isPollerRunning": true
-        },
-        "callback": {
-          "callback": true
-        }
-      });
+      var args = testHelpers.findAjaxRequest('name', 'router.login.clusters');
+      expect(args[0]).to.exists;
+      expect(args[0].callback.callback).to.be.true;
     });
   });
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/ddf479ef/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 a602a32..445eeb0 100644
--- a/ambari-web/test/controllers/global/background_operations_test.js
+++ b/ambari-web/test/controllers/global/background_operations_test.js
@@ -41,7 +41,6 @@ describe('App.BackgroundOperationsController', function () {
      *
      */
     App.set('clusterName', 'testName');
-    App.bgOperationsUpdateInterval = 100;
 
     var tests = Em.A([
       {
@@ -112,13 +111,6 @@ describe('App.BackgroundOperationsController', function () {
       }
     ]);
 
-    beforeEach(function () {
-      App.testMode = false;
-    });
-    afterEach(function () {
-      App.testMode = true;
-    });
-
     tests.forEach(function (test) {
       it(test.m, function () {
         controller.set('levelInfo', test.levelInfo);
@@ -133,11 +125,9 @@ describe('App.BackgroundOperationsController', function () {
   describe('#startPolling()', function () {
 
     beforeEach(function () {
-      sinon.spy(App.updater, 'run');
       sinon.spy(controller, 'requestMostRecent');
     });
     afterEach(function () {
-      App.updater.run.restore();
       controller.requestMostRecent.restore();
     });
 
@@ -177,6 +167,15 @@ 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: []

http://git-wip-us.apache.org/repos/asf/ambari/blob/ddf479ef/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 f72d64f..a791b19 100644
--- a/ambari-web/test/controllers/global/cluster_controller_test.js
+++ b/ambari-web/test/controllers/global/cluster_controller_test.js
@@ -19,6 +19,7 @@
 
 var App = require('app');
 var credentialUtils = require('utils/credentials');
+var testHelpers = require('test/helpers');
 require('controllers/global/cluster_controller');
 require('models/host_component');
 require('utils/http_client');
@@ -74,6 +75,7 @@ describe('App.clusterController', function () {
 
     beforeEach(function () {
       modelSetup.setupStackVersion(this, 'HDP-2.0.5');
+      App.ajax.send.restore(); // default ajax-mock can't be used here
       sinon.stub(App.ajax, 'send', function () {
         return {
           then: function (successCallback) {
@@ -83,22 +85,22 @@ describe('App.clusterController', function () {
           }
         }
       });
+      this.args = testHelpers.findAjaxRequest('name', 'cluster.load_cluster_name');
     });
     afterEach(function () {
       modelSetup.restoreStackVersion(this);
-      App.ajax.send.restore();
     });
 
     it('if clusterName is "mycluster" and reload is false then clusterName stays the same', function () {
       App.set('clusterName', 'mycluster');
       controller.loadClusterName(false);
-      expect(App.ajax.send.called).to.be.false;
+      expect(this.args).to.not.exists;
       expect(App.get('clusterName')).to.equal('mycluster');
     });
 
     it('reload is true and clusterName is not empty', function () {
       controller.loadClusterName(true);
-      expect(App.ajax.send.calledOnce).to.be.true;
+      expect(this.args).to.exists;
       expect(App.get('clusterName')).to.equal('clusterNameFromServer');
       expect(App.get('currentStackVersion')).to.equal('HDP-2.0.5');
     });
@@ -106,7 +108,7 @@ describe('App.clusterController', function () {
     it('reload is false and clusterName is empty', function () {
       App.set('clusterName', '');
       controller.loadClusterName(false);
-      expect(App.ajax.send.calledOnce).to.be.true;
+      expect(this.args).to.exists;
       expect(App.get('clusterName')).to.equal('clusterNameFromServer');
       expect(App.get('currentStackVersion')).to.equal('HDP-2.0.5');
     });
@@ -187,14 +189,8 @@ describe('App.clusterController', function () {
   describe('#getUrl', function () {
     controller.set('clusterName', 'tdk');
     var tests = ['test1', 'test2', 'test3'];
-    it('testMode = true', function () {
-      App.testMode = true;
-      tests.forEach(function (test) {
-        expect(controller.getUrl(test, test)).to.equal(test);
-      });
-    });
+
     it('testMode = false', function () {
-      App.testMode = false;
       tests.forEach(function (test) {
         expect(controller.getUrl(test, test)).to.equal(App.apiPrefix + '/clusters/' + controller.get('clusterName') + test);
       });
@@ -204,9 +200,6 @@ describe('App.clusterController', function () {
   describe("#createKerberosAdminSession()", function() {
 
     beforeEach(function () {
-      sinon.stub(App.ajax, 'send', function() {
-        return {success: Em.K}
-      });
       sinon.stub(credentialUtils, 'createOrUpdateCredentials', function() {
         return $.Deferred().resolve().promise();
       });
@@ -215,7 +208,6 @@ describe('App.clusterController', function () {
     });
 
     afterEach(function () {
-      App.ajax.send.restore();
       credentialUtils.createOrUpdateCredentials.restore();
       App.get.restore();
     });
@@ -227,18 +219,16 @@ describe('App.clusterController', function () {
         key: 'pass',
         type: 'persistent'
       }, {});
-
-      expect(App.ajax.send.getCall(0).args[0]).to.eql({
-        name: 'common.cluster.update',
-        sender: controller,
-        data: {
-          clusterName: 'test',
-          data: [{
-            session_attributes: {
-              kerberos_admin: {principal: "admin", password: "pass"}
-            }
-          }]
-        }
+      var args = testHelpers.findAjaxRequest('name', 'common.cluster.update');
+      expect(args[0]).to.exists;
+      expect(args[0].sender).to.be.eql(controller);
+      expect(args[0].data).to.be.eql({
+        clusterName: 'test',
+        data: [{
+          session_attributes: {
+            kerberos_admin: {principal: "admin", password: "pass"}
+          }
+        }]
       });
     });
     it("KDC Store supports enabled, credentials updated via credentials storage call", function() {
@@ -248,7 +238,8 @@ describe('App.clusterController', function () {
         key: 'pass',
         type: 'persistent'
       }, {});
-      expect(App.ajax.send.called).to.be.false;
+      var args = testHelpers.findAjaxRequest('name', 'common.cluster.update');
+      expect(args).to.not.exists;
       expect(credentialUtils.createOrUpdateCredentials.getCall(0).args).to.eql([
         'test', 'kdc.admin.credential', {
           principal: 'admin',
@@ -282,14 +273,7 @@ describe('App.clusterController', function () {
       }
     ];
 
-    beforeEach(function () {
-      sinon.stub(App.ajax, 'send').returns({
-        promise: Em.K
-      });
-    });
-
     afterEach(function () {
-      App.ajax.send.restore();
       App.get.restore();
     });
 
@@ -301,7 +285,8 @@ describe('App.clusterController', function () {
 
       it('request is sent', function () {
         controller.checkDetailedRepoVersion();
-        expect(App.ajax.send.calledOnce).to.be.true;
+        var args = testHelpers.findAjaxRequest('name', 'cluster.load_detailed_repo_version');
+        expect(args).to.exists;
       });
     });
 
@@ -316,7 +301,8 @@ describe('App.clusterController', function () {
         });
 
         it('request is not sent', function () {
-          expect(App.ajax.send.called).to.be.false;
+          var args = testHelpers.findAjaxRequest('name', 'cluster.load_detailed_repo_version');
+          expect(args).to.not.exists;
         });
 
         it('App.isStormMetricsSupported is ' + item.isStormMetricsSupported, function () {
@@ -438,17 +424,10 @@ describe('App.clusterController', function () {
 
   describe('#getAllUpgrades()', function () {
 
-    beforeEach(function () {
-      sinon.stub(App.ajax, 'send', Em.K);
-    });
-
-    afterEach(function () {
-      App.ajax.send.restore();
-    });
-
     it('should send request to get upgrades data', function () {
       controller.getAllUpgrades();
-      expect(App.ajax.send.calledOnce).to.be.true;
+      var args = testHelpers.findAjaxRequest('name', 'cluster.load_last_upgrade');
+      expect(args).to.exists;
     });
 
   });

http://git-wip-us.apache.org/repos/asf/ambari/blob/ddf479ef/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 25b2c5b..c0a4760 100644
--- a/ambari-web/test/controllers/global/update_controller_test.js
+++ b/ambari-web/test/controllers/global/update_controller_test.js
@@ -20,6 +20,7 @@
 var App = require('app');
 require('utils/updater');
 require('controllers/global/update_controller');
+var testHelpers = require('test/helpers');
 
 describe('App.UpdateController', function () {
   var controller = App.UpdateController.create({
@@ -34,14 +35,6 @@ describe('App.UpdateController', function () {
 
   describe('#getUrl()', function () {
 
-    beforeEach(function () {
-      sinon.stub(App, 'get').withArgs('testMode').returns(false);
-    });
-
-    afterEach(function () {
-      App.get.restore();
-    });
-
     it('testMode = false', function () {
       expect(controller.getUrl('test', '/real')).to.equal('/api/v1/clusters//real');
     });
@@ -54,12 +47,6 @@ describe('App.UpdateController', function () {
 
   describe('#updateAll()', function () {
 
-    beforeEach(function () {
-      sinon.stub(App.updater, 'run', Em.K);
-    });
-    afterEach(function () {
-      App.updater.run.restore();
-    });
     it('isWorking = false', function () {
       controller.set('isWorking', false);
       expect(App.updater.run.called).to.equal(false);
@@ -266,23 +253,23 @@ describe('App.UpdateController', function () {
       this.mock = sinon.stub(App.Service, 'find');
       sinon.stub(controller, 'computeParameters');
       sinon.stub(controller, 'addParamsToHostsUrl');
-      sinon.stub(App.ajax, 'send');
     });
     afterEach(function () {
       App.Service.find.restore();
       controller.computeParameters.restore();
       controller.addParamsToHostsUrl.restore();
-      App.ajax.send.restore();
     });
     it("AMBARI_METRICS is not started", function () {
       this.mock.returns(Em.Object.create({isStarted: false}));
       expect(controller.loadHostsMetric([])).to.be.null;
-      expect(App.ajax.send.called).to.be.false;
+      var args = testHelpers.findAjaxRequest('name', 'hosts.metrics.lazy_load');
+      expect(args).to.not.exists;
     });
     it("AMBARI_METRICS is started", function () {
       this.mock.returns(Em.Object.create({isStarted: true}));
       expect(controller.loadHostsMetric([])).to.be.object;
-      expect(App.ajax.send.calledOnce).to.be.true;
+      var args = testHelpers.findAjaxRequest('name', 'hosts.metrics.lazy_load');
+      expect(args).to.exists;
     });
   });
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/ddf479ef/ambari-web/test/controllers/global/user_settings_controller_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/controllers/global/user_settings_controller_test.js b/ambari-web/test/controllers/global/user_settings_controller_test.js
index 7c49645..849fb2f 100644
--- a/ambari-web/test/controllers/global/user_settings_controller_test.js
+++ b/ambari-web/test/controllers/global/user_settings_controller_test.js
@@ -22,14 +22,10 @@ var userSettingsController;
 describe('App.UserSettingsController', function () {
 
   beforeEach(function () {
-    sinon.stub(App.ajax, 'send', function () {
-      return {complete: Em.K}
-    });
     userSettingsController = App.UserSettingsController.create();
   });
 
   afterEach(function () {
-    App.ajax.send.restore();
     userSettingsController.destroy();
   });
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/ddf479ef/ambari-web/test/controllers/installer_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/controllers/installer_test.js b/ambari-web/test/controllers/installer_test.js
index cd75ed7..df4ab0e 100644
--- a/ambari-web/test/controllers/installer_test.js
+++ b/ambari-web/test/controllers/installer_test.js
@@ -30,16 +30,6 @@ describe('App.InstallerController', function () {
     installerController.destroy();
   });
 
-  beforeEach(function () {
-    sinon.stub(App.ajax, 'send', function () {
-      return {complete: Em.K};
-    });
-  });
-
-  afterEach(function () {
-    App.ajax.send.restore();
-  });
-
   describe('#init', function () {
     var c;
     beforeEach(function () {

http://git-wip-us.apache.org/repos/asf/ambari/blob/ddf479ef/ambari-web/test/controllers/main/admin/highAvailability/progress_controller_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/controllers/main/admin/highAvailability/progress_controller_test.js b/ambari-web/test/controllers/main/admin/highAvailability/progress_controller_test.js
index 1c4d584..f002754 100644
--- a/ambari-web/test/controllers/main/admin/highAvailability/progress_controller_test.js
+++ b/ambari-web/test/controllers/main/admin/highAvailability/progress_controller_test.js
@@ -123,12 +123,15 @@ describe('App.HighAvailabilityProgressPageController', function () {
           }
         ]
       }];
-    beforeEach(function() {
-      App.set('testMode', true);
+
+    beforeEach(function () {
+      sinon.stub(Date.prototype, 'getTime').returns(1);
     });
-    afterEach(function() {
-      App.set('testMode', false);
+
+    afterEach(function () {
+      Date.prototype.getTime.restore();
     });
+
     it("reconfigures configs after HA", function() {
       tests.forEach(function(t) {
         controller.set('content', t.content);

http://git-wip-us.apache.org/repos/asf/ambari/blob/ddf479ef/ambari-web/test/controllers/main/admin/highAvailability/progress_popup_controller_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/controllers/main/admin/highAvailability/progress_popup_controller_test.js b/ambari-web/test/controllers/main/admin/highAvailability/progress_popup_controller_test.js
index 2a9a4d7..8648181 100644
--- a/ambari-web/test/controllers/main/admin/highAvailability/progress_popup_controller_test.js
+++ b/ambari-web/test/controllers/main/admin/highAvailability/progress_popup_controller_test.js
@@ -19,6 +19,7 @@
 var App = require('app');
 
 require('controllers/main/admin/highAvailability/progress_popup_controller');
+var testHelpers = require('test/helpers');
 
 describe('App.HighAvailabilityProgressPopupController', function () {
 
@@ -34,16 +35,6 @@ describe('App.HighAvailabilityProgressPopupController', function () {
 
   describe('#startTaskPolling', function () {
 
-    beforeEach(function () {
-      sinon.stub(App.updater, 'run', Em.K);
-      sinon.stub(App.updater, 'immediateRun', Em.K);
-    });
-
-    afterEach(function () {
-      App.updater.run.restore();
-      App.updater.immediateRun.restore();
-    });
-
     describe('should start task polling', function () {
 
       beforeEach(function () {
@@ -85,17 +76,10 @@ describe('App.HighAvailabilityProgressPopupController', function () {
 
   describe('#updateTask', function () {
 
-    beforeEach(function () {
-      sinon.stub(App.ajax, 'send', Em.K);
-    });
-
-    afterEach(function () {
-      App.ajax.send.restore();
-    });
-
     it('should send polling request', function () {
       controller.updateTask();
-      expect(App.ajax.send.calledOnce).to.be.true;
+      var args = testHelpers.findAjaxRequest('name', 'background_operations.get_by_task');
+      expect(args).to.exists;
     });
 
   });
@@ -200,14 +184,6 @@ describe('App.HighAvailabilityProgressPopupController', function () {
       }
     ];
 
-    beforeEach(function () {
-      sinon.stub(App.ajax, 'send', Em.K);
-    });
-
-    afterEach(function () {
-      App.ajax.send.restore();
-    });
-
     cases.forEach(function (item) {
       describe(item.title, function () {
 
@@ -217,26 +193,29 @@ describe('App.HighAvailabilityProgressPopupController', function () {
             stageId: item.stageId
           });
           controller.getHosts();
+          this.bgArgs = testHelpers.filterAjaxRequests('name', 'background_operations.get_by_request');
+          this.pollingArgs = testHelpers.filterAjaxRequests('name', 'common.request.polling');
+          this.args = item.name === 'background_operations.get_by_request' ? this.bgArgs : this.pollingArgs;
         });
 
         it('two requests are sent', function () {
-          expect(App.ajax.send.calledTwice).to.be.true;
+          expect(this.args.length).to.be.equal(2);
         });
 
         it('1st call name is valid', function () {
-          expect(App.ajax.send.firstCall.args[0].name).to.equal(item.name);
+          expect(this.args[0][0].name).to.equal(item.name);
         });
 
         it('2nd call name is valid', function () {
-          expect(App.ajax.send.secondCall.args[0].name).to.equal(item.name);
+          expect(this.args[1][0].name).to.equal(item.name);
         });
 
         it('1st stageId is valid', function () {
-          expect(App.ajax.send.firstCall.args[0].data.stageId).to.eql(item.stageIdPassed);
+          expect(this.args[0][0].data.stageId).to.eql(item.stageIdPassed);
         });
 
         it('2nd stageId is valid', function () {
-          expect(App.ajax.send.secondCall.args[0].data.stageId).to.eql(item.stageIdPassed);
+          expect(this.args[1][0].data.stageId).to.eql(item.stageIdPassed);
         });
 
       });

http://git-wip-us.apache.org/repos/asf/ambari/blob/ddf479ef/ambari-web/test/controllers/main/admin/highAvailability/resourceManager/step3_controller_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/controllers/main/admin/highAvailability/resourceManager/step3_controller_test.js b/ambari-web/test/controllers/main/admin/highAvailability/resourceManager/step3_controller_test.js
index 9a24cf3..3e6f7bb 100644
--- a/ambari-web/test/controllers/main/admin/highAvailability/resourceManager/step3_controller_test.js
+++ b/ambari-web/test/controllers/main/admin/highAvailability/resourceManager/step3_controller_test.js
@@ -18,6 +18,7 @@
 
 var App = require('app');
 require('controllers/main/admin/highAvailability/resourceManager/step3_controller');
+var testHelpers = require('test/helpers');
 
 describe('App.RMHighAvailabilityWizardStep3Controller', function () {
 
@@ -54,14 +55,6 @@ describe('App.RMHighAvailabilityWizardStep3Controller', function () {
       content: Em.Object.create({})
     });
 
-    beforeEach(function () {
-      sinon.stub(App.ajax, 'send', Em.K);
-    });
-
-    afterEach(function () {
-      App.ajax.send.restore();
-    });
-
     it('should send proper ajax request', function () {
       controller.loadConfigTagsSuccessCallback({
         'Clusters': {
@@ -80,7 +73,7 @@ describe('App.RMHighAvailabilityWizardStep3Controller', function () {
       }, {}, {
         'serviceConfig': {}
       });
-      var data = App.ajax.send.args[0][0].data;
+      var data = testHelpers.findAjaxRequest('name', 'reassign.load_configs')[0].data;
       expect(data.urlParams).to.equal('(type=zoo.cfg&tag=1)|(type=yarn-site&tag=1)|(type=yarn-env&tag=1)');
       expect(data.serviceConfig).to.eql({});
     });

http://git-wip-us.apache.org/repos/asf/ambari/blob/ddf479ef/ambari-web/test/controllers/main/admin/kerberos_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/controllers/main/admin/kerberos_test.js b/ambari-web/test/controllers/main/admin/kerberos_test.js
index fa23082..d347416 100644
--- a/ambari-web/test/controllers/main/admin/kerberos_test.js
+++ b/ambari-web/test/controllers/main/admin/kerberos_test.js
@@ -17,6 +17,7 @@
  */
 
 var App = require('app');
+var testHelpers = require('test/helpers');
 
 describe('App.MainAdminKerberosController', function() {
 
@@ -131,13 +132,11 @@ describe('App.MainAdminKerberosController', function() {
 
     beforeEach(function () {
       sinon.spy(App.ModalPopup, "show");
-      sinon.stub(App.ajax, 'send', Em.K);
       sinon.spy(controller, 'restartServicesAfterRegenerate');
       sinon.spy(controller, 'restartAllServices');
     });
     afterEach(function () {
       App.ModalPopup.show.restore();
-      App.ajax.send.restore();
       controller.restartServicesAfterRegenerate.restore();
       controller.restartAllServices.restore();
     });
@@ -157,8 +156,8 @@ describe('App.MainAdminKerberosController', function() {
       var popup2 = popup.onPrimary();
       popup2.set('restartComponents', true)
       popup2.onPrimary();
-
-      expect(App.ajax.send.args[0][0].data.type).to.equal('missing');
+      var args = testHelpers.findAjaxRequest('name', 'admin.kerberos_security.regenerate_keytabs');
+      expect(args[0].data.type).to.be.equal('missing');
     });
 
     it('user didn\'t check regeneration only for missing host/components', function () {
@@ -169,7 +168,8 @@ describe('App.MainAdminKerberosController', function() {
       popup2.set('restartComponents', true)
       popup2.onPrimary();
 
-      expect(App.ajax.send.args[0][0].data.type).to.equal('all');
+      var args = testHelpers.findAjaxRequest('name', 'admin.kerberos_security.regenerate_keytabs');
+      expect(args[0].data.type).to.be.equal('all');
     });
 
     it('user checked restart services automatically', function () {
@@ -180,7 +180,8 @@ describe('App.MainAdminKerberosController', function() {
       popup2.set('restartComponents', true)
       popup2.onPrimary();
 
-      expect(App.ajax.send.args[0][0].data.withAutoRestart).to.be.true;
+      var args = testHelpers.findAjaxRequest('name', 'admin.kerberos_security.regenerate_keytabs');
+      expect(args[0].data.withAutoRestart).to.be.true;
     });
 
     it('user didn\'t check restart services automatically', function () {
@@ -191,7 +192,8 @@ describe('App.MainAdminKerberosController', function() {
       popup2.set('restartComponents', false)
       popup2.onPrimary();
 
-      expect(App.ajax.send.args[0][0].data.withAutoRestart).to.be.false;
+      var args = testHelpers.findAjaxRequest('name', 'admin.kerberos_security.regenerate_keytabs');
+      expect(args[0].data.withAutoRestart).to.be.false;
     });
   });
 
@@ -200,7 +202,6 @@ describe('App.MainAdminKerberosController', function() {
     var mock = {callback: Em.K};
 
     beforeEach(function () {
-      sinon.stub(App.ajax, 'send', Em.K);
       sinon.spy(mock, 'callback');
       sinon.stub(controller, 'getSecurityType', function (c) {
         c();
@@ -208,7 +209,6 @@ describe('App.MainAdminKerberosController', function() {
     });
 
     afterEach(function () {
-      App.ajax.send.restore();
       mock.callback.restore();
       controller.getSecurityType.restore();
       Em.tryInvoke(App.get, 'restore');
@@ -244,6 +244,7 @@ describe('App.MainAdminKerberosController', function() {
               controller.set('securityEnabled', test.securityEnabled);
               controller.set('kdc_type', test.kdc_type);
               controller.getKDCSessionState(mock.callback);
+              this.args = testHelpers.findAjaxRequest('name', 'kerberos.session.state');
             });
 
 
@@ -252,7 +253,7 @@ describe('App.MainAdminKerberosController', function() {
                 expect(mock.callback.calledOnce).to.be.false;
               });
               it('1 request is sent', function () {
-                expect(App.ajax.send.calledOnce).to.be.true;
+                expect(this.args).to.exists;
               });
             }
             else {
@@ -260,7 +261,7 @@ describe('App.MainAdminKerberosController', function() {
                 expect(mock.callback.calledOnce).to.be.true;
               });
               it('no request is sent', function () {
-                expect(App.ajax.send.calledOnce).to.be.false;
+                expect(this.args).to.not.exists;
               });
             }
           });
@@ -272,12 +273,10 @@ describe('App.MainAdminKerberosController', function() {
     var mock = {callback: Em.K};
 
     beforeEach(function () {
-      sinon.stub(App.ajax, 'send', Em.K);
       sinon.spy(mock, 'callback');
     });
 
     afterEach(function () {
-      App.ajax.send.restore();
       mock.callback.restore();
       Em.tryInvoke(App.get, 'restore');
     });
@@ -312,6 +311,7 @@ describe('App.MainAdminKerberosController', function() {
               controller.set('securityEnabled', test.securityEnabled);
               controller.set('kdc_type', test.kdc_type);
               controller.getSecurityType(mock.callback);
+              this.args = testHelpers.findAjaxRequest('name', 'admin.security.cluster_configs.kerberos');
             });
 
             if (test.result) {
@@ -319,14 +319,14 @@ describe('App.MainAdminKerberosController', function() {
                 expect(mock.callback.calledOnce).to.be.false;
               });
               it('1 request is sent', function () {
-                expect(App.ajax.send.calledOnce).to.be.true;
+                expect(this.args).to.exists;
               });
             } else {
               it('callback is called once', function () {
                 expect(mock.callback.calledOnce).to.be.true;
               });
               it('no request is sent', function () {
-                expect(App.ajax.send.calledOnce).to.be.false;
+                expect(this.args).to.not.exists;
               });
             }
           });

http://git-wip-us.apache.org/repos/asf/ambari/blob/ddf479ef/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 fe5d9c8..508e2dd 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
@@ -20,6 +20,7 @@
 var App = require('app');
 require('controllers/main/admin/stack_and_upgrade_controller');
 require('utils/string_utils');
+var testHelpers = require('test/helpers');
 
 describe('App.MainAdminStackAndUpgradeController', function() {
 
@@ -139,43 +140,34 @@ describe('App.MainAdminStackAndUpgradeController', function() {
   });
 
   describe("#loadUpgradeData()", function() {
-    beforeEach(function () {
-      sinon.stub(App.ajax, 'send').returns({
-        then: Em.K,
-        complete: Em.K
-      });
-    });
-    afterEach(function () {
-      App.ajax.send.restore();
-    });
+
     it("get entire data", function() {
       controller.set('upgradeId', 1);
       controller.loadUpgradeData();
-      expect(App.ajax.send.getCall(0).args[0]).to.eql({
-        name: 'admin.upgrade.data',
-        sender: controller,
-        data: {
-          id: 1
-        },
-        success: 'loadUpgradeDataSuccessCallback'
-      })
+      var args = testHelpers.findAjaxRequest('name', 'admin.upgrade.data');
+      expect(args[0]).to.exists;
+      expect(args[0].sender).to.be.eql(controller);
+      expect(args[0].data).to.be.eql({
+        id: 1
+      });
     });
     it("get only state", function() {
       controller.set('upgradeId', 1);
       controller.loadUpgradeData(true);
-      expect(App.ajax.send.getCall(0).args[0]).to.eql({
-        name: 'admin.upgrade.state',
-        sender: controller,
-        data: {
-          id: 1
-        },
-        success: 'loadUpgradeDataSuccessCallback'
-      })
+      var args = testHelpers.findAjaxRequest('name', 'admin.upgrade.state');
+      expect(args[0]).to.exists;
+      expect(args[0].sender).to.be.eql(controller);
+      expect(args[0].data).to.be.eql({
+        id: 1
+      });
     });
     it("upgrade id is null", function() {
       controller.set('upgradeId', null);
       controller.loadUpgradeData();
-      expect(App.ajax.send.called).to.be.false;
+      var args = testHelpers.findAjaxRequest('name', 'admin.upgrade.state');
+      var args2 = testHelpers.findAjaxRequest('name', 'admin.upgrade.data');
+      expect(args).to.not.exists;
+      expect(args2).to.not.exists;
     });
   });
 
@@ -263,12 +255,7 @@ describe('App.MainAdminStackAndUpgradeController', function() {
   });
 
   describe("#getUpgradeItem()", function() {
-    beforeEach(function () {
-      sinon.stub(App.ajax, 'send', Em.K);
-    });
-    afterEach(function () {
-      App.ajax.send.restore();
-    });
+
     it("default callback", function() {
       var item = Em.Object.create({
         request_id: 1,
@@ -276,15 +263,14 @@ describe('App.MainAdminStackAndUpgradeController', function() {
         stage_id: 3
       });
       controller.getUpgradeItem(item);
-      expect(App.ajax.send.getCall(0).args[0]).to.eql({
-        name: 'admin.upgrade.upgrade_item',
-        sender: controller,
-        data: {
-          upgradeId: 1,
-          groupId: 2,
-          stageId: 3
-        },
-        success: 'getUpgradeItemSuccessCallback'
+      var args = testHelpers.findAjaxRequest('name', 'admin.upgrade.upgrade_item');
+      expect(args[0]).to.exists;
+      expect(args[0].sender).to.be.eql(controller);
+      expect(args[0].success).to.be.equal('getUpgradeItemSuccessCallback');
+      expect(args[0].data).to.be.eql({
+        upgradeId: 1,
+        groupId: 2,
+        stageId: 3
       });
     });
     it("custom callback", function() {
@@ -294,15 +280,14 @@ describe('App.MainAdminStackAndUpgradeController', function() {
         stage_id: 3
       });
       controller.getUpgradeItem(item, 'customCallback');
-      expect(App.ajax.send.getCall(0).args[0]).to.eql({
-        name: 'admin.upgrade.upgrade_item',
-        sender: controller,
-        data: {
-          upgradeId: 1,
-          groupId: 2,
-          stageId: 3
-        },
-        success: 'customCallback'
+      var args = testHelpers.findAjaxRequest('name', 'admin.upgrade.upgrade_item');
+      expect(args[0]).to.exists;
+      expect(args[0].sender).to.be.eql(controller);
+      expect(args[0].success).to.be.equal('customCallback');
+      expect(args[0].data).to.be.eql({
+        upgradeId: 1,
+        groupId: 2,
+        stageId: 3
       });
     });
   });
@@ -321,12 +306,6 @@ describe('App.MainAdminStackAndUpgradeController', function() {
   });
 
   describe("#runPreUpgradeCheck()", function() {
-    before(function () {
-      sinon.stub(App.ajax, 'send', Em.K);
-    });
-    after(function () {
-      App.ajax.send.restore();
-    });
     it("make ajax call", function() {
       controller.runPreUpgradeCheck(Em.Object.create({
         repositoryVersion: '2.2',
@@ -335,18 +314,15 @@ describe('App.MainAdminStackAndUpgradeController', function() {
         skipComponentFailures: false,
         skipSCFailures: false
       }));
-      expect(App.ajax.send.getCall(0).args[0]).to.eql({
-        name: "admin.upgrade.pre_upgrade_check",
-        sender: controller,
-        data: {
-          value: '2.2',
-          label: 'HDP-2.2',
-          type: 'ROLLING',
-          skipComponentFailures: 'false',
-          skipSCFailures: 'false'
-        },
-        success: "runPreUpgradeCheckSuccess",
-        error: "runPreUpgradeCheckError"
+      var args = testHelpers.findAjaxRequest('name', 'admin.upgrade.pre_upgrade_check');
+      expect(args[0]).to.exists;
+      expect(args[0].sender).to.be.eql(controller);
+      expect(args[0].data).to.be.eql({
+        value: '2.2',
+        label: 'HDP-2.2',
+        type: 'ROLLING',
+        skipComponentFailures: 'false',
+        skipSCFailures: 'false'
       });
     });
   });
@@ -526,7 +502,6 @@ describe('App.MainAdminStackAndUpgradeController', function() {
     var callArgs;
 
     beforeEach(function () {
-      sinon.stub(App.ajax, 'send', Em.K);
       sinon.stub(controller, 'setDBProperty', Em.K);
       controller.set('currentVersion', {
         repository_version: '2.2'
@@ -535,11 +510,10 @@ describe('App.MainAdminStackAndUpgradeController', function() {
         value: '2.2',
         label: 'HDP-2.2'
       });
-      callArgs = App.ajax.send.getCall(0).args[0];
+      callArgs = testHelpers.findAjaxRequest('name', 'admin.upgrade.start')[0];
     });
 
     afterEach(function () {
-      App.ajax.send.restore();
       controller.setDBProperty.restore();
     });
 
@@ -991,7 +965,6 @@ describe('App.MainAdminStackAndUpgradeController', function() {
 
   describe("#downgrade()", function() {
     beforeEach(function () {
-      sinon.stub(App.ajax, 'send', Em.K);
       sinon.stub(controller, 'abortUpgrade');
       sinon.stub(App.RepositoryVersion, 'find').returns([
         Em.Object.create({
@@ -1005,11 +978,10 @@ describe('App.MainAdminStackAndUpgradeController', function() {
         repository_version: '2.2',
         repository_name: 'HDP-2.2'
       }), {context: 'context'});
-      this.callArgs = App.ajax.send.getCall(0).args[0];
+      this.callArgs = testHelpers.findAjaxRequest('name', 'admin.downgrade.start')[0];
     });
 
     afterEach(function () {
-      App.ajax.send.restore();
       controller.abortUpgrade.restore();
       App.RepositoryVersion.find.restore();
     });
@@ -1018,7 +990,7 @@ describe('App.MainAdminStackAndUpgradeController', function() {
       expect(controller.abortUpgrade.calledOnce).to.be.true;
     });
     it('request-data is valid', function () {
-      expect(App.ajax.send.getCall(0).args[0].data).to.eql({
+      expect(this.callArgs.data).to.eql({
         from: '2.3',
         value: '2.2',
         label: 'HDP-2.2',
@@ -1056,12 +1028,7 @@ describe('App.MainAdminStackAndUpgradeController', function() {
   });
 
   describe("#installRepoVersion()", function () {
-    before(function () {
-      sinon.stub(App.ajax, 'send', Em.K);
-    });
-    after(function () {
-      App.ajax.send.restore();
-    });
+
     it("make ajax call", function () {
       var repo = Em.Object.create({
         stackVersionType: 'HDP',
@@ -1070,7 +1037,8 @@ describe('App.MainAdminStackAndUpgradeController', function() {
         repoId: 1
       });
       controller.installRepoVersion(repo);
-      expect(App.ajax.send.calledOnce).to.be.true;
+      var args = testHelpers.findAjaxRequest('name', 'admin.stack_version.install.repo_version');
+      expect(args).to.exists;
     });
   });
 
@@ -1109,22 +1077,13 @@ describe('App.MainAdminStackAndUpgradeController', function() {
   describe("#setUpgradeItemStatus()", function () {
     var item;
     beforeEach(function () {
-      sinon.stub(App.ajax, 'send', function () {
-        return {
-          done: Em.clb
-        }
-      });
       item = Em.Object.create({
         request_id: 1,
         stage_id: 1,
         group_id: 1
       });
       controller.setUpgradeItemStatus(item, 'PENDING');
-      this.callArgs = App.ajax.send.getCall(0).args[0];
-    });
-
-    afterEach(function () {
-      App.ajax.send.restore();
+      this.callArgs = testHelpers.findAjaxRequest('name', 'admin.upgrade.upgradeItem.setState')[0];
     });
 
     it('request-data is valid', function () {
@@ -1222,12 +1181,10 @@ describe('App.MainAdminStackAndUpgradeController', function() {
     before(function(){
       this.mock = sinon.stub(controller, 'validateRepoVersions');
       sinon.stub(controller, 'prepareRepoForSaving', Em.K);
-      sinon.stub(App.ajax, 'send').returns({success: Em.K});
     });
     after(function(){
       this.mock.restore();
       controller.prepareRepoForSaving.restore();
-      App.ajax.send.restore();
     });
     describe("validation errors present", function() {
 
@@ -1236,6 +1193,7 @@ describe('App.MainAdminStackAndUpgradeController', function() {
           done: function(callback) {callback([1]);}
         });
         controller.saveRepoOS(Em.Object.create({repoVersionId: 1}), true);
+        this.args = testHelpers.findAjaxRequest('name', 'admin.stack_versions.edit.repo');
       });
 
       it('validateRepoVersions is called with valid arguments', function () {
@@ -1247,7 +1205,7 @@ describe('App.MainAdminStackAndUpgradeController', function() {
       });
 
       it('no requests are sent', function () {
-        expect(App.ajax.send.called).to.be.false;
+        expect(this.args).to.not.exists;
       });
     });
 
@@ -1269,15 +1227,11 @@ describe('App.MainAdminStackAndUpgradeController', function() {
   });
 
   describe("#validateRepoVersions()", function () {
-    before(function () {
-      sinon.stub(App.ajax, 'send').returns({success: Em.K, error: Em.K});
-    });
-    after(function () {
-      App.ajax.send.restore();
-    });
+
     it("skip validation", function () {
       controller.validateRepoVersions(Em.Object.create({repoVersionId: 1}), true);
-      expect(App.ajax.send.called).to.be.false;
+      var args = testHelpers.findAjaxRequest('name', 'admin.stack_versions.validate.repo');
+      expect(args).to.not.exists;
     });
     it("do validation", function () {
       var repo = Em.Object.create({
@@ -1292,7 +1246,8 @@ describe('App.MainAdminStackAndUpgradeController', function() {
         ]
       });
       controller.validateRepoVersions(repo, false);
-      expect(App.ajax.send.calledOnce).to.be.true;
+      var args = testHelpers.findAjaxRequest('name', 'admin.stack_versions.validate.repo');
+      expect(args[0]).to.exists;
     });
   });
 
@@ -1304,6 +1259,7 @@ describe('App.MainAdminStackAndUpgradeController', function() {
         realUpdateUrl: 'realUpdateUrl'
       });
     });
+
     it("full load is true, stack is null", function() {
       expect(controller.getUrl(null, true)).to.equal('realRepoUrl');
     });
@@ -1401,13 +1357,11 @@ describe('App.MainAdminStackAndUpgradeController', function() {
   describe('#updateFinalize', function () {
 
     beforeEach(function() {
-      sinon.stub($, 'ajax', Em.K);
       controller.set('isFinalizeItem', true);
       this.stub = sinon.stub(App, 'get');
     });
 
     afterEach(function () {
-      $.ajax.restore();
       this.stub.restore();
     });
 
@@ -1416,10 +1370,11 @@ describe('App.MainAdminStackAndUpgradeController', function() {
       beforeEach(function () {
         this.stub.withArgs('upgradeState').returns('HOLDING');
         controller.updateFinalize();
+        this.args = testHelpers.findAjaxRequest('name', 'admin.upgrade.finalizeContext');
       });
 
       it('request is sent', function () {
-        expect($.ajax.calledOnce).to.be.true;
+        expect(this.args[0]).to.exists;
       });
 
     });
@@ -1429,10 +1384,11 @@ describe('App.MainAdminStackAndUpgradeController', function() {
       beforeEach(function () {
         this.stub.withArgs('upgradeState').returns('HOLDING_TIMEDOUT');
         controller.updateFinalize();
+        this.args = testHelpers.findAjaxRequest('name', 'admin.upgrade.finalizeContext');
       });
 
       it('request is not sent', function () {
-        expect($.ajax.called).to.be.false;
+        expect(this.args).to.not.exists;
       });
 
       it('isFinalizeItem is false', function () {
@@ -2052,12 +2008,12 @@ describe('App.MainAdminStackAndUpgradeController', function() {
           action: 'a'
         });
       });
+      App.ajax.send.restore();
       sinon.stub(App.ajax, 'send').returns({});
     });
 
     afterEach(function () {
       appGetMock.restore();
-      App.ajax.send.restore();
     });
 
     cases.forEach(function (item) {
@@ -2069,6 +2025,7 @@ describe('App.MainAdminStackAndUpgradeController', function() {
           controller.runPreUpgradeCheckOnly({
             type: item.type
           });
+          this.ajaxCalls = testHelpers.filterAjaxRequests('name', 'admin.upgrade.pre_upgrade_check');
         });
 
         it('ROLLING properties', function () {
@@ -2080,7 +2037,7 @@ describe('App.MainAdminStackAndUpgradeController', function() {
         });
 
         it(item.ajaxCallCount + ' requests sent', function () {
-          expect(App.ajax.send.callCount).to.equal(item.ajaxCallCount);
+          expect(this.ajaxCalls.length).to.be.equal(item.ajaxCallCount);
         });
 
         it('runningCheckRequests length is ' + item.runningCheckRequestsLength, function () {

http://git-wip-us.apache.org/repos/asf/ambari/blob/ddf479ef/ambari-web/test/controllers/main/alert_definitions_controller_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/controllers/main/alert_definitions_controller_test.js b/ambari-web/test/controllers/main/alert_definitions_controller_test.js
index 45bbd50..a1f2b9a 100644
--- a/ambari-web/test/controllers/main/alert_definitions_controller_test.js
+++ b/ambari-web/test/controllers/main/alert_definitions_controller_test.js
@@ -20,6 +20,7 @@ var App = require('app');
 
 require('controllers/main/alert_definitions_controller');
 require('models/alerts/alert_definition');
+var testHelpers = require('test/helpers');
 
 var controller;
 describe('App.MainAlertDefinitionsController', function() {
@@ -33,7 +34,6 @@ describe('App.MainAlertDefinitionsController', function() {
   describe('#toggleDefinitionState', function() {
 
     beforeEach(function() {
-      sinon.stub(App.ajax, 'send', Em.K);
       controller.reopen({
         content: [
           App.AlertDefinition.createRecord({id: 1, enabled: true})
@@ -41,14 +41,11 @@ describe('App.MainAlertDefinitionsController', function() {
       });
     });
 
-    afterEach(function() {
-      App.ajax.send.restore();
-    });
-
     it('should do ajax-request', function() {
       var alertDefinition = controller.get('content')[0];
       controller.toggleDefinitionState(alertDefinition);
-      expect(App.ajax.send.calledOnce).to.be.true;
+      var args = testHelpers.findAjaxRequest('name', 'alerts.update_alert_definition');
+      expect(args).to.exists;
     });
 
   });

http://git-wip-us.apache.org/repos/asf/ambari/blob/ddf479ef/ambari-web/test/controllers/main/alerts/add_alert_definition/add_alert_definition_controller_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/controllers/main/alerts/add_alert_definition/add_alert_definition_controller_test.js b/ambari-web/test/controllers/main/alerts/add_alert_definition/add_alert_definition_controller_test.js
index 05ab913..bcde3c7 100644
--- a/ambari-web/test/controllers/main/alerts/add_alert_definition/add_alert_definition_controller_test.js
+++ b/ambari-web/test/controllers/main/alerts/add_alert_definition/add_alert_definition_controller_test.js
@@ -18,7 +18,7 @@
 
 var App = require('app');
 require('controllers/main/alerts/add_alert_definition/add_alert_definition_controller');
-
+var testHelpers = require('test/helpers');
 var controller;
 
 describe('App.AddAlertDefinitionController', function () {
@@ -28,22 +28,12 @@ describe('App.AddAlertDefinitionController', function () {
   });
 
   describe("#createNewAlertDefinition()", function () {
-    beforeEach(function () {
-      sinon.stub(App.ajax, 'send', Em.K);
-    });
-    afterEach(function () {
-      App.ajax.send.restore();
-    });
-
     it("valid request is sent", function () {
       controller.createNewAlertDefinition('data');
-      expect(App.ajax.send.getCall(0).args[0]).to.eql({
-        name: 'alerts.create_alert_definition',
-        sender: controller,
-        data: {
-          data: 'data'
-        }
-      });
+      var args = testHelpers.findAjaxRequest('name', 'alerts.create_alert_definition');
+      expect(args[0]).to.exists;
+      expect(args[0].sender).to.be.eql(controller);
+      expect(args[0].data).to.be.eql({data: 'data'});
     });
   });
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/ddf479ef/ambari-web/test/controllers/main/alerts/alert_instances_controller_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/controllers/main/alerts/alert_instances_controller_test.js b/ambari-web/test/controllers/main/alerts/alert_instances_controller_test.js
index 051202d..94653c7 100644
--- a/ambari-web/test/controllers/main/alerts/alert_instances_controller_test.js
+++ b/ambari-web/test/controllers/main/alerts/alert_instances_controller_test.js
@@ -17,6 +17,7 @@
  */
 
 var App = require('app');
+var testHelpers = require('test/helpers');
 
 var controller;
 
@@ -26,22 +27,18 @@ describe('App.MainAlertInstancesController', function () {
     controller = App.MainAlertInstancesController.create({});
   });
 
+  afterEach(function () {
+    clearTimeout(controller.get('updateTimer'));
+  });
+
   describe('#fetchAlertInstances', function () {
 
     describe('loading instances from correct endpoint', function () {
 
-      beforeEach(function () {
-        sinon.stub(App.ajax, 'send', Em.K);
-      });
-
-      afterEach(function () {
-        App.ajax.send.restore();
-      });
-
       it('should load by Host name', function () {
 
         controller.loadAlertInstancesByHost('host');
-        var callArgs = App.ajax.send.args[0][0];
+        var callArgs = testHelpers.findAjaxRequest('name', 'alerts.instances.by_host')[0];
         expect(callArgs.name).to.equal('alerts.instances.by_host');
         expect(callArgs.data.hostName).to.equal('host');
 
@@ -50,16 +47,16 @@ describe('App.MainAlertInstancesController', function () {
       it('should load by AlertDefinition id', function () {
 
         controller.loadAlertInstancesByAlertDefinition('1');
-        var callArgs = App.ajax.send.args[0][0];
+        var callArgs = testHelpers.findAjaxRequest('name', 'alerts.instances.by_definition')[0];
         expect(callArgs.name).to.equal('alerts.instances.by_definition');
         expect(callArgs.data.definitionId).to.equal('1');
 
       });
 
       it('should load all', function () {
-
         controller.loadAlertInstances();
-        expect(App.ajax.send.args[0][0].name).to.equal('alerts.instances');
+        var callArgs = testHelpers.findAjaxRequest('name', 'alerts.instances')[0];
+        expect(callArgs).to.exists;
 
       });
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/ddf479ef/ambari-web/test/controllers/main/alerts/definitions_configs_controller_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/controllers/main/alerts/definitions_configs_controller_test.js b/ambari-web/test/controllers/main/alerts/definitions_configs_controller_test.js
index f2f77aa..8cf61f2 100644
--- a/ambari-web/test/controllers/main/alerts/definitions_configs_controller_test.js
+++ b/ambari-web/test/controllers/main/alerts/definitions_configs_controller_test.js
@@ -17,7 +17,7 @@
  */
 
 var App = require('app');
-
+var testHelpers = require('test/helpers');
 var controller;
 
 function getController() {
@@ -362,7 +362,6 @@ describe('App.MainAlertDefinitionConfigsController', function () {
   describe('#saveConfigs()', function () {
 
     beforeEach(function () {
-      sinon.spy(App.ajax, 'send');
       controller.set('configs', [
         Em.Object.create({isDisabled: true}),
         Em.Object.create({isDisabled: true}),
@@ -372,10 +371,6 @@ describe('App.MainAlertDefinitionConfigsController', function () {
       controller.saveConfigs();
     });
 
-    afterEach(function () {
-      App.ajax.send.restore();
-    });
-
     it('should set isDisabled for each config', function () {
       expect(controller.get('configs').someProperty('isDisabled', false)).to.be.false;
     });
@@ -383,7 +378,8 @@ describe('App.MainAlertDefinitionConfigsController', function () {
       expect(controller.get('canEdit')).to.be.false;
     });
     it('should sent 1 request', function () {
-      expect(App.ajax.send.calledOnce).to.be.true;
+      var args = testHelpers.findAjaxRequest('name', 'alerts.update_alert_definition');
+      expect(args[0]).to.exists;
     });
 
   });

http://git-wip-us.apache.org/repos/asf/ambari/blob/ddf479ef/ambari-web/test/controllers/main/alerts/definitions_details_controller_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/controllers/main/alerts/definitions_details_controller_test.js b/ambari-web/test/controllers/main/alerts/definitions_details_controller_test.js
index 28e1829..3b024f7 100644
--- a/ambari-web/test/controllers/main/alerts/definitions_details_controller_test.js
+++ b/ambari-web/test/controllers/main/alerts/definitions_details_controller_test.js
@@ -81,27 +81,6 @@ describe('App.MainAlertDefinitionDetailsController', function () {
 
   });
 
-  describe('#toggleDefinitionState()', function () {
-    beforeEach(function() {
-      sinon.stub(App.ajax, 'send', Em.K);
-      controller.reopen({
-        content: [
-          App.AlertDefinition.createRecord({id: 1, enabled: true})
-        ]
-      });
-    });
-
-    afterEach(function() {
-      App.ajax.send.restore();
-    });
-
-    it('should call App.ajax.send function', function () {
-      var alertDefinition = controller.get('content')[0];
-      controller.toggleDefinitionState(alertDefinition);
-      expect(App.ajax.send.calledOnce).to.be.true;
-    });
-  });
-
   describe("#deleteAlertDefinition()", function () {
     beforeEach(function () {
       sinon.stub(App.get('router'), 'transitionTo', Em.K);
@@ -116,24 +95,12 @@ describe('App.MainAlertDefinitionDetailsController', function () {
   });
 
   describe("#loadAlertInstancesHistory()", function () {
-
-    beforeEach(function () {
-      sinon.stub(App.ajax, 'send', Em.K);
-    });
-
-    afterEach(function () {
-      App.ajax.send.restore();
-    });
-
-    it("should load alert instances history", function () {
-
+    it("should set lastDayAlertsCount = null", function () {
       controller.set('lastDayAlertsCount', 'test');
-
       controller.loadAlertInstancesHistory();
-
-      expect(App.ajax.send.calledOnce).to.be.true;
       expect(controller.get('lastDayAlertsCount')).to.equal(null);
     });
+
   });
 
   describe("#loadAlertInstancesHistorySuccess()", function () {

http://git-wip-us.apache.org/repos/asf/ambari/blob/ddf479ef/ambari-web/test/controllers/main/alerts/manage_alert_notifications_controller_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/controllers/main/alerts/manage_alert_notifications_controller_test.js b/ambari-web/test/controllers/main/alerts/manage_alert_notifications_controller_test.js
index 9352116..84caec6 100644
--- a/ambari-web/test/controllers/main/alerts/manage_alert_notifications_controller_test.js
+++ b/ambari-web/test/controllers/main/alerts/manage_alert_notifications_controller_test.js
@@ -30,11 +30,6 @@ describe('App.ManageAlertNotificationsController', function () {
 
   beforeEach(function () {
     controller = getController();
-    sinon.stub($, 'ajax', Em.K);
-  });
-
-  afterEach(function () {
-    $.ajax.restore();
   });
 
   describe('#alertNotifications', function () {
@@ -795,8 +790,8 @@ describe('App.ManageAlertNotificationsController', function () {
     it("should send ajax request", function () {
 
       controller.createAlertNotification();
-      expect($.ajax.calledOnce).to.be.true;
-      expect($.ajax.args[0][0].url.contains('overwrite_existing=true')).to.be.false;
+      var args = helpers.findAjaxRequest('name', 'alerts.create_alert_notification');
+      expect(args[0]).to.exists;
     });
 
   });
@@ -831,7 +826,8 @@ describe('App.ManageAlertNotificationsController', function () {
     it("should send ajax request", function () {
 
       controller.updateAlertNotification();
-      expect($.ajax.calledOnce).to.be.true;
+      var args = helpers.findAjaxRequest('name', 'alerts.update_alert_notification');
+      expect(args[0]).to.exists;
     });
 
   });
@@ -877,7 +873,8 @@ describe('App.ManageAlertNotificationsController', function () {
 
       expect(App.showConfirmationPopup.calledOnce).to.be.true;
       popup.onPrimary();
-      expect($.ajax.calledOnce).to.be.true;
+      var args = helpers.findAjaxRequest('name', 'alerts.delete_alert_notification');
+      expect(args[0]).to.exists;
     });
 
   });

http://git-wip-us.apache.org/repos/asf/ambari/blob/ddf479ef/ambari-web/test/controllers/main/charts/heatmap_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/controllers/main/charts/heatmap_test.js b/ambari-web/test/controllers/main/charts/heatmap_test.js
index c3e70e8..a8ece22 100644
--- a/ambari-web/test/controllers/main/charts/heatmap_test.js
+++ b/ambari-web/test/controllers/main/charts/heatmap_test.js
@@ -21,6 +21,7 @@ var App = require('app');
 var controller;
 require('models/rack');
 require('controllers/main/charts/heatmap');
+var testHelpers = require('test/helpers');
 
 function getController() {
   return App.MainChartsHeatmapController.create();
@@ -65,13 +66,6 @@ describe('MainChartsHeatmapController', function () {
 
   describe('#showHeatMapMetric()', function () {
     beforeEach(function () {
-      sinon.stub(App.ajax, 'send', function () {
-        return {
-          done: function (callback) {
-            callback();
-          }
-        }
-      });
       controller.setProperties({
         activeWidgetLayout: Em.Object.create({
           displayName: 'widget',
@@ -83,13 +77,10 @@ describe('MainChartsHeatmapController', function () {
       });
     });
 
-    afterEach(function () {
-      App.ajax.send.restore();
-    });
-
     it('should call App.ajax', function () {
       controller.showHeatMapMetric({context:{id: 2}});
-      expect(App.ajax.send.called).to.be.true;
+      var args = testHelpers.findAjaxRequest('name', 'widget.layout.edit');
+      expect(args).to.exists;
     });
   });
 
@@ -248,55 +239,35 @@ describe('MainChartsHeatmapController', function () {
 
   describe("#getAllHeatMaps()", function() {
 
-    beforeEach(function() {
-      sinon.stub(App.ajax, 'send');
-    });
-
-    afterEach(function() {
-      App.ajax.send.restore();
-    });
-
     it("should call App.ajax.send", function() {
       controller.reopen({
         loadHeatmapsUrlParams: 'url',
         sectionName: 's1'
       });
       controller.getAllHeatMaps();
-      expect(App.ajax.send.calledWith({
-        name: 'widgets.get',
-        sender: controller,
-        data: {
-          urlParams: 'url',
-          sectionName: 's1'
-        }
-      })).to.be.true;
+      var args = testHelpers.findAjaxRequest('name', 'widgets.get');
+      expect(args[0]).to.exists;
+      expect(args[0].sender).to.be.eql(controller);
+      expect(args[0].data).to.be.eql({
+        urlParams: 'url',
+        sectionName: 's1'
+      });
     });
   });
 
   describe("#loadRacks()", function() {
 
-    beforeEach(function() {
-      sinon.stub(App.ajax, 'send');
-    });
-
-    afterEach(function() {
-      App.ajax.send.restore();
-    });
-
     it("should call App.ajax.send", function() {
       controller.reopen({
         loadRacksUrlParams: 'url'
       });
       controller.loadRacks();
-      expect(App.ajax.send.calledWith({
-        name: 'hosts.heatmaps',
-        sender: controller,
-        data: {
-          urlParams: 'url'
-        },
-        success: 'loadRacksSuccessCallback'
-      })).to.be.true;
-
+      var args = testHelpers.findAjaxRequest('name', 'hosts.heatmaps');
+      expect(args[0]).to.exists;
+      expect(args[0].sender).to.be.eql(controller);
+      expect(args[0].data).to.be.eql({
+        urlParams: 'url'
+      });
     });
   });
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/ddf479ef/ambari-web/test/controllers/main/dashboard/config_history_controller_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/controllers/main/dashboard/config_history_controller_test.js b/ambari-web/test/controllers/main/dashboard/config_history_controller_test.js
index 7467bca..db3d10f 100644
--- a/ambari-web/test/controllers/main/dashboard/config_history_controller_test.js
+++ b/ambari-web/test/controllers/main/dashboard/config_history_controller_test.js
@@ -18,12 +18,21 @@
 
 
 var App = require('app');
-
+var testHelpers = require('test/helpers');
 require('controllers/main/dashboard/config_history_controller');
 
 describe('MainConfigHistoryController', function () {
 
-  var controller = App.MainConfigHistoryController.create();
+  var controller;
+
+  beforeEach(function () {
+    controller = App.MainConfigHistoryController.create();
+  });
+
+  afterEach(function () {
+    clearTimeout(controller.get('timeoutRef'));
+    controller.destroy();
+  });
 
   describe('#realUrl', function () {
     it('cluster name is empty', function () {
@@ -85,16 +94,12 @@ describe('MainConfigHistoryController', function () {
   describe('#updateTotalCounter()', function () {
 
     beforeEach(function () {
-      sinon.stub(App.ajax, 'send', Em.K);
       controller.updateTotalCounter();
     });
 
-    afterEach(function () {
-      App.ajax.send.restore();
-    });
-
     it('ajax-request is sent', function () {
-      expect(App.ajax.send.calledOnce).to.be.true;
+      var args = testHelpers.findAjaxRequest('name', 'service.serviceConfigVersions.get.total');
+      expect(args).to.exists;
     });
   });
 
@@ -113,14 +118,9 @@ describe('MainConfigHistoryController', function () {
           }
         }
       });
-      sinon.stub(App, 'get', function(k) {
-        if ('testMode' === k) return false;
-        return Em.get(App, k);
-      });
     });
     afterEach(function () {
       App.router.get.restore();
-      App.get.restore();
     });
     it('query params is empty', function () {
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/ddf479ef/ambari-web/test/controllers/main/host/add_controller_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/controllers/main/host/add_controller_test.js b/ambari-web/test/controllers/main/host/add_controller_test.js
index 6dcb2c9..ed8e78b 100644
--- a/ambari-web/test/controllers/main/host/add_controller_test.js
+++ b/ambari-web/test/controllers/main/host/add_controller_test.js
@@ -23,6 +23,7 @@ require('controllers/main/host/add_controller');
 require('models/host_component');
 require('models/service');
 require('mappers/server_data_mapper');
+var testHelpers = require('test/helpers');
 
 describe('App.AddHostController', function () {
 
@@ -302,30 +303,26 @@ describe('App.AddHostController', function () {
 
   describe('#installServices()', function () {
 
-    beforeEach(function () {
-      sinon.spy(App.ajax, "send");
-    });
-    afterEach(function () {
-      App.ajax.send.restore();
-    });
-
     it('No hosts', function () {
       controller.set('content.cluster', {name: 'cl'});
       controller.set('testDBHosts', {});
       expect(controller.installServices()).to.be.false;
-      expect(App.ajax.send.called).to.be.false;
+      var args = testHelpers.findAjaxRequest('name', 'common.host_components.update');
+      expect(args).to.not.exists;
     });
     it('Cluster name is empty', function () {
       controller.set('content.cluster', {name: ''});
       controller.set('testDBHosts', {'host1': {}});
       expect(controller.installServices()).to.be.false;
-      expect(App.ajax.send.called).to.be.false;
+      var args = testHelpers.findAjaxRequest('name', 'common.host_components.update');
+      expect(args).to.not.exists;
     });
     it('Cluster name is correct and hosts are present', function () {
       controller.set('content.cluster', {name: 'cl'});
       controller.set('testDBHosts', {'host1': {isInstalled: false}});
       expect(controller.installServices()).to.be.true;
-      expect(App.ajax.send.called).to.be.true;
+      var args = testHelpers.findAjaxRequest('name', 'common.host_components.update');
+      expect(args).to.exists;
     });
   });
 
@@ -412,7 +409,7 @@ describe('App.AddHostController', function () {
     });
   });
 
-  describe("#loadServices", function () {
+  /*describe("#loadServices", function () {
     var services = {
       db: null,
       stack: [],
@@ -590,7 +587,7 @@ describe('App.AddHostController', function () {
     });
 
   });
-
+*/
   describe("#loadSlaveComponentHosts()", function () {
 
     var mock = {
@@ -746,16 +743,12 @@ describe('App.AddHostController', function () {
   });
 
   describe("#applyConfigGroup()", function () {
-    beforeEach(function () {
-      sinon.stub(App.ajax, 'send', Em.K);
-    });
-    afterEach(function () {
-      App.ajax.send.restore();
-    });
+
     it("No config groups", function () {
       controller.set('content.configGroups', []);
       controller.applyConfigGroup();
-      expect(App.ajax.send.called).to.be.false;
+      var args = testHelpers.findAjaxRequest('name', 'config_groups.update_config_group');
+      expect(args).to.not.exists;
     });
     it("selectedConfigGroup absent", function () {
       controller.set('content.configGroups', [
@@ -765,7 +758,8 @@ describe('App.AddHostController', function () {
         }
       ]);
       controller.applyConfigGroup();
-      expect(App.ajax.send.called).to.be.false;
+      var args = testHelpers.findAjaxRequest('name', 'config_groups.update_config_group');
+      expect(args).to.not.exists;
     });
     it("selectedConfigGroup present", function () {
       controller.set('content.configGroups', [
@@ -784,9 +778,9 @@ describe('App.AddHostController', function () {
         }
       ]);
       controller.applyConfigGroup();
-
-      expect(App.ajax.send.getCall(0).args[0].name).to.equal('config_groups.update_config_group');
-      expect(App.ajax.send.getCall(0).args[0].data).to.eql({
+      var args = testHelpers.findAjaxRequest('name', 'config_groups.update_config_group');
+      expect(args[0]).to.exists;
+      expect(args[0].data).to.be.eql({
         "id": 1,
         "configGroup": {
           "ConfigGroup": {
@@ -1362,7 +1356,6 @@ describe('App.AddHostController', function () {
     beforeEach(function () {
       sinon.stub(controller, 'clearAllSteps', Em.K);
       sinon.stub(controller, 'clearStorageData', Em.K);
-      sinon.stub(App.updater, 'immediateRun', Em.K);
       sinon.stub(App.router, 'get').returns(mock);
       sinon.spy(mock, 'updateAll');
       sinon.spy(mock, 'getAllHostNames');
@@ -1371,7 +1364,6 @@ describe('App.AddHostController', function () {
     afterEach(function () {
       controller.clearAllSteps.restore();
       controller.clearStorageData.restore();
-      App.updater.immediateRun.restore();
       App.router.get.restore();
       mock.updateAll.restore();
       mock.getAllHostNames.restore();


[09/22] ambari git commit: AMBARI-14742. Custom time range has broken situations (alexantonenko)

Posted by nc...@apache.org.
AMBARI-14742. Custom time range has broken situations (alexantonenko)


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

Branch: refs/heads/branch-dev-patch-upgrade
Commit: 6225849e6910413a5c5810c18c22225a7ca862ed
Parents: 2c80cab
Author: Alex Antonenko <hi...@gmail.com>
Authored: Wed Jan 20 18:16:18 2016 +0200
Committer: Alex Antonenko <hi...@gmail.com>
Committed: Wed Jan 20 22:20:48 2016 +0200

----------------------------------------------------------------------
 .../mixins/common/widgets/time_range_mixin.js   | 32 ++++++-------
 .../app/views/common/chart/linear_time.js       | 18 ++++---
 .../app/views/common/custom_date_popup.js       |  7 +--
 .../app/views/common/select_custom_date_view.js |  4 +-
 .../common/widgets/time_range_mixin_test.js     | 10 ++--
 .../common/select_custom_date_view_test.js      | 49 ++++++++++++++++++++
 6 files changed, 86 insertions(+), 34 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/6225849e/ambari-web/app/mixins/common/widgets/time_range_mixin.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/mixins/common/widgets/time_range_mixin.js b/ambari-web/app/mixins/common/widgets/time_range_mixin.js
index c88df56..e2a9c9b 100644
--- a/ambari-web/app/mixins/common/widgets/time_range_mixin.js
+++ b/ambari-web/app/mixins/common/widgets/time_range_mixin.js
@@ -87,35 +87,33 @@ App.TimeRangeMixin = Em.Mixin.create({
    * onclick handler for a time range option
    * @param {object} event
    * @param {function} callback
+   * @param {object} context
    */
-  setTimeRange: function (event, callback) {
-    var prevIndex = this.get('currentTimeRangeIndex'),
-      prevCustomTimeRange = {
-        start: this.get('customStartTime'),
-        end: this.get('customEndTime'),
-        duration: this.get('customDurationFormatted')
-      },
+  setTimeRange: function (event, callback, context) {
+    var prevCustomTimeRange = this.getProperties(['currentTimeRangeIndex', 'customStartTime', 'customEndTime', 'customDurationFormatted']),
       index = event.context.index,
       primary = function () {
+        var timeRange = {
+          customEndTime: timeRangePopup.endTime,
+          customStartTime: timeRangePopup.startTime,
+          customDurationFormatted: timeRangePopup.customDuration
+        };
         if (callback) {
           callback();
         }
+        this.setProperties(timeRange);
+        if (context) {
+          context.setProperties(timeRange);
+        }
       },
-      secondary = function () {
-        this.setProperties({
-          currentTimeRangeIndex: prevIndex,
-          customStartTime: prevCustomTimeRange.start,
-          customEndTime: prevCustomTimeRange.end,
-          customDurationFormatted: prevCustomTimeRange.duration
-        });
-      };
+      secondary = this.setProperties.bind(this, prevCustomTimeRange);
 
     if (index === 8) {
       // Custom start and end time is specified by user
       var defaultStartTime,
         defaultEndTime,
         duration;
-      if (prevIndex === 8) {
+      if (prevCustomTimeRange.currentTimeRangeIndex === 8) {
         // Custom time range is active
         defaultStartTime = new Date(this.get('customStartTime')).getTime();
         defaultEndTime = new Date(this.get('customEndTime')).getTime();
@@ -129,7 +127,7 @@ App.TimeRangeMixin = Em.Mixin.create({
         defaultEndTime.setMinutes(minutes);
         defaultStartTime = defaultEndTime.getTime() - duration;
       }
-      timeRangePopup.showCustomDatePopup(this, primary.bind(this), secondary.bind(this), {
+      timeRangePopup.showCustomDatePopup(primary.bind(this), secondary.bind(this), {
         startDate: App.formatDateTimeWithTimeZone(defaultStartTime, 'MM/DD/YYYY'),
         hoursForStart: App.formatDateTimeWithTimeZone(defaultStartTime, 'hh'),
         minutesForStart: App.formatDateTimeWithTimeZone(defaultStartTime, 'mm'),

http://git-wip-us.apache.org/repos/asf/ambari/blob/6225849e/ambari-web/app/views/common/chart/linear_time.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/common/chart/linear_time.js b/ambari-web/app/views/common/chart/linear_time.js
index 3bdcc80..7933643 100644
--- a/ambari-web/app/views/common/chart/linear_time.js
+++ b/ambari-web/app/views/common/chart/linear_time.js
@@ -930,9 +930,9 @@ App.ChartLinearTimeView = Ember.View.extend(App.ExportMetricsMixin, {
         isReady: Em.computed.alias('parentView.graph.isPopupReady'),
 
         currentTimeRangeIndex: self.get('currentTimeIndex'),
-        customStartTime: self.get('customStartTime'),
-        customEndTime: self.get('customEndTime'),
-        customDurationFormatted: self.get('customDurationFormatted'),
+        customStartTime: self.get('currentTimeIndex') === 8 ? self.get('customStartTime') : null,
+        customEndTime: self.get('currentTimeIndex') === 8 ? self.get('customEndTime') : null,
+        customDurationFormatted: self.get('currentTimeIndex') === 8 ? self.get('customDurationFormatted') : null,
 
         didInsertElement: function () {
           var popupBody = this;
@@ -995,7 +995,7 @@ App.ChartLinearTimeView = Ember.View.extend(App.ExportMetricsMixin, {
         setTimeRange: function (event) {
           var index = event.context.index,
             callback = this.get('parentView').reloadGraphByTime.bind(this.get('parentView'), index);
-          this._super(event, callback);
+          this._super(event, callback, self);
 
           // Preset time range is specified by user
           if (index !== 8) {
@@ -1012,8 +1012,12 @@ App.ChartLinearTimeView = Ember.View.extend(App.ExportMetricsMixin, {
       secondary: null,
 
       onPrimary: function () {
+        var targetView = Em.isNone(self.get('parentView.currentTimeRangeIndex')) ? self.get('parentView.parentView') : self.get('parentView');
         self.setProperties({
-          currentTimeIndex: !Em.isNone(self.get('parentView.currentTimeRangeIndex')) ? self.get('parentView.currentTimeRangeIndex') : self.get('parentView.parentView.currentTimeRangeIndex'),
+          currentTimeIndex: targetView.get('currentTimeRangeIndex'),
+          customStartTime: targetView.get('customStartTime'),
+          customEndTime: targetView.get('customEndTime'),
+          customDurationFormatted: targetView.get('customDurationFormatted'),
           isPopup: false
         });
         this._super();
@@ -1068,7 +1072,7 @@ App.ChartLinearTimeView = Ember.View.extend(App.ExportMetricsMixin, {
     Em.run.once(this, function () {
       this.loadData();
     });
-  }.observes('timeUnitSeconds', 'customStartTime', 'customStartTime'),
+  }.observes('timeUnitSeconds', 'customStartTime', 'customEndTime'),
 
   timeStates: [
     {name: Em.I18n.t('graphs.timeRange.hour'), seconds: 3600},
@@ -1111,7 +1115,7 @@ App.ChartLinearTimeView = Ember.View.extend(App.ExportMetricsMixin, {
       // Custom start and end time is specified by user
       this.propertyDidChange('timeUnitSeconds');
     }
-  }.observes('currentTimeIndex')
+  }.observes('currentTimeIndex', 'parentView.childViews.lastObject.customStartTime', 'parentView.childViews.lastObject.customEndTime')
 
 });
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/6225849e/ambari-web/app/views/common/custom_date_popup.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/common/custom_date_popup.js b/ambari-web/app/views/common/custom_date_popup.js
index c5a2837..03adc30 100644
--- a/ambari-web/app/views/common/custom_date_popup.js
+++ b/ambari-web/app/views/common/custom_date_popup.js
@@ -26,7 +26,7 @@ module.exports = Em.Object.create({
 
   customDuration: null,
 
-  showCustomDatePopup: function (context, primary, secondary, defaults) {
+  showCustomDatePopup: function (primary, secondary, defaults) {
     var self = this;
     defaults = defaults || {
       startDate: null,
@@ -43,11 +43,6 @@ module.exports = Em.Object.create({
     return App.ModalPopup.show({
       header: Em.I18n.t('jobs.table.custom.date.header'),
       onPrimary: function () {
-        context.setProperties({
-          customEndTime: self.endTime,
-          customStartTime: self.startTime,
-          customDurationFormatted: self.customDuration
-        });
         if (primary) {
           primary();
         }

http://git-wip-us.apache.org/repos/asf/ambari/blob/6225849e/ambari-web/app/views/common/select_custom_date_view.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/common/select_custom_date_view.js b/ambari-web/app/views/common/select_custom_date_view.js
index fb553c7..753a904 100644
--- a/ambari-web/app/views/common/select_custom_date_view.js
+++ b/ambari-web/app/views/common/select_custom_date_view.js
@@ -110,6 +110,9 @@ App.JobsCustomDatesSelectView = Em.View.extend({
         initialOption = this.get('content').find(function (item) {
           return duration === item.value || duration === item.label;
         }, this);
+      if (!initialOption) {
+        initialOption = this.get('content').findProperty('value', 0);
+      }
       this.set('selection', initialOption);
     }
   }),
@@ -117,7 +120,6 @@ App.JobsCustomDatesSelectView = Em.View.extend({
   isCustomEndDate: Em.computed.equal('customDateFormFields.duration.value', 0),
 
   didInsertElement: function () {
-    this.validate();
     $('.datepicker').datepicker({
       format: 'mm/dd/yyyy'
     }).on('changeDate', function() {

http://git-wip-us.apache.org/repos/asf/ambari/blob/6225849e/ambari-web/test/mixins/common/widgets/time_range_mixin_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/mixins/common/widgets/time_range_mixin_test.js b/ambari-web/test/mixins/common/widgets/time_range_mixin_test.js
index f57808d..39ce6f1 100644
--- a/ambari-web/test/mixins/common/widgets/time_range_mixin_test.js
+++ b/ambari-web/test/mixins/common/widgets/time_range_mixin_test.js
@@ -65,6 +65,7 @@ describe('App.TimeRangeMixin', function () {
           index: 1,
           customStartTime: null,
           customEndTime: null,
+          customDurationFormatted: null,
           title: 'time range is preset',
           testTitle: 'should reset time range boundaries'
         },
@@ -72,6 +73,7 @@ describe('App.TimeRangeMixin', function () {
           index: 8,
           customStartTime: 1,
           customEndTime: 1,
+          customDurationFormatted: '1 hour',
           title: 'time range is custom',
           testTitle: 'should not reset time range boundaries'
         }
@@ -116,7 +118,8 @@ describe('App.TimeRangeMixin', function () {
         beforeEach(function () {
           obj.setProperties({
             customStartTime: 1,
-            customEndTime: 1
+            customEndTime: 1,
+            customDurationFormatted: '1 hour'
           });
           obj.setTimeRange({
             context: {
@@ -126,9 +129,10 @@ describe('App.TimeRangeMixin', function () {
         });
 
         it(item.testTitle, function () {
-          expect(obj.getProperties(['customStartTime', 'customEndTime'])).to.eql({
+          expect(obj.getProperties(['customStartTime', 'customEndTime', 'customDurationFormatted'])).to.eql({
             customStartTime: item.customStartTime,
-            customEndTime: item.customEndTime
+            customEndTime: item.customEndTime,
+            customDurationFormatted: item.customDurationFormatted
           });
         });
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/6225849e/ambari-web/test/views/common/select_custom_date_view_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/views/common/select_custom_date_view_test.js b/ambari-web/test/views/common/select_custom_date_view_test.js
index e7520cb..9d492e9 100644
--- a/ambari-web/test/views/common/select_custom_date_view_test.js
+++ b/ambari-web/test/views/common/select_custom_date_view_test.js
@@ -257,4 +257,53 @@ describe('App.JobsCustomDatesSelectView', function () {
 
   });
 
+  describe('#durationSelect', function () {
+
+    var select;
+
+    beforeEach(function () {
+      select = view.get('durationSelect').create();
+    });
+
+    describe('#willInsertElement', function () {
+
+      var cases = [
+        {
+          duration: 1800000,
+          selection: {
+            value: 1800000,
+            label: Em.I18n.t('jobs.customDateFilter.duration.30min')
+          },
+          title: 'should detect preset option by value'
+        },
+        {
+          duration: Em.I18n.t('jobs.customDateFilter.duration.2hr'),
+          selection: {
+            value: 7200000,
+            label: Em.I18n.t('jobs.customDateFilter.duration.2hr')
+          },
+          title: 'should detect preset option by label'
+        },
+        {
+          duration: '40 minutes',
+          selection: {
+            value: 0,
+            label: Em.I18n.t('common.custom')
+          },
+          title: 'should set "Custom" option if preset one can\'t be detected'
+        }
+      ];
+
+      cases.forEach(function (item) {
+        it(item.title, function () {
+          select.set('selection', item.duration);
+          select.willInsertElement();
+          expect(select.get('selection')).to.eql(item.selection);
+        });
+      });
+
+    });
+
+  });
+
 });


[14/22] ambari git commit: AMBARI-14741. Ambari Web Unit Test failure on trunk (App.WizardStep8Controller) (onechiporenko)

Posted by nc...@apache.org.
AMBARI-14741. Ambari Web Unit Test failure on trunk (App.WizardStep8Controller) (onechiporenko)


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

Branch: refs/heads/branch-dev-patch-upgrade
Commit: c9bb7319e75b3c50031296dfd29bcd7a10f3fa87
Parents: a8887eb
Author: Oleg Nechiporenko <on...@apache.org>
Authored: Thu Jan 21 14:23:15 2016 +0200
Committer: Oleg Nechiporenko <on...@apache.org>
Committed: Thu Jan 21 14:26:33 2016 +0200

----------------------------------------------------------------------
 ambari-web/app/utils/ajax/ajax_queue.js | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/c9bb7319/ambari-web/app/utils/ajax/ajax_queue.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/utils/ajax/ajax_queue.js b/ambari-web/app/utils/ajax/ajax_queue.js
index 1c2106f..8a95d97 100644
--- a/ambari-web/app/utils/ajax/ajax_queue.js
+++ b/ambari-web/app/utils/ajax/ajax_queue.js
@@ -143,7 +143,6 @@ App.ajaxQueue = Em.Object.extend({
    * @method runNextRequest
    */
   runNextRequest: function() {
-    var self = this;
     var queue = this.get('queue');
     if (queue.length === 0) {
       this.finishedCallback();
@@ -152,7 +151,7 @@ App.ajaxQueue = Em.Object.extend({
     var r = App.ajax.send(queue.shift());
     this.propertyDidChange('queue');
     if (r) {
-      r.complete(this._complete);
+      r.complete(this._complete.bind(this));
     }
     else {
       if (this.get('abortOnError')) {


[15/22] ambari git commit: AMBARI-14694 Unnecessary multiple TreeMap creation (dsen)

Posted by nc...@apache.org.
AMBARI-14694 Unnecessary multiple TreeMap creation (dsen)


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

Branch: refs/heads/branch-dev-patch-upgrade
Commit: b0aeefc87daa7ed8040032a2998764f27bbdaa8d
Parents: c9bb731
Author: Dmytro Sen <ds...@apache.org>
Authored: Thu Jan 21 15:28:25 2016 +0200
Committer: Dmytro Sen <ds...@apache.org>
Committed: Thu Jan 21 15:28:25 2016 +0200

----------------------------------------------------------------------
 .../metrics/timeline/PhoenixHBaseAccessor.java                   | 2 +-
 .../metrics/timeline/aggregators/TimelineMetricReadHelper.java   | 4 ++--
 2 files changed, 3 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/b0aeefc8/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/PhoenixHBaseAccessor.java
----------------------------------------------------------------------
diff --git a/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/PhoenixHBaseAccessor.java b/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/PhoenixHBaseAccessor.java
index c5d7b0c..8325fb1 100644
--- a/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/PhoenixHBaseAccessor.java
+++ b/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/PhoenixHBaseAccessor.java
@@ -207,7 +207,7 @@ public class PhoenixHBaseAccessor {
 
   @SuppressWarnings("unchecked")
   public static TreeMap<Long, Double>  readMetricFromJSON(String json) throws IOException {
-    return (TreeMap<Long, Double>) mapper.readValue(json, metricValuesTypeRef);
+    return mapper.readValue(json, metricValuesTypeRef);
   }
 
   private Connection getConnectionRetryingOnException()

http://git-wip-us.apache.org/repos/asf/ambari/blob/b0aeefc8/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/aggregators/TimelineMetricReadHelper.java
----------------------------------------------------------------------
diff --git a/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/aggregators/TimelineMetricReadHelper.java b/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/aggregators/TimelineMetricReadHelper.java
index dc27614..c5e60fe 100644
--- a/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/aggregators/TimelineMetricReadHelper.java
+++ b/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/metrics/timeline/aggregators/TimelineMetricReadHelper.java
@@ -40,8 +40,8 @@ public class TimelineMetricReadHelper {
   public TimelineMetric getTimelineMetricFromResultSet(ResultSet rs)
       throws SQLException, IOException {
     TimelineMetric metric = getTimelineMetricCommonsFromResultSet(rs);
-    TreeMap<Long, Double> sortedByTimeMetrics = new TreeMap<Long, Double>(
-        PhoenixHBaseAccessor.readMetricFromJSON(rs.getString("METRICS")));
+    TreeMap<Long, Double> sortedByTimeMetrics =
+      PhoenixHBaseAccessor.readMetricFromJSON(rs.getString("METRICS"));
     metric.setMetricValues(sortedByTimeMetrics);
     return metric;
   }


[21/22] ambari git commit: AMBARI-14734. RU/EU, add PreCheck to prevent starting upgrade if a previous upgrade skipped the step Save DB State (alejandro)

Posted by nc...@apache.org.
AMBARI-14734. RU/EU, add PreCheck to prevent starting upgrade if a previous upgrade skipped the step Save DB State (alejandro)


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

Branch: refs/heads/branch-dev-patch-upgrade
Commit: 77ea2eba044f7ca9761e6e77799751d1b3a9f263
Parents: 780cb69
Author: Alejandro Fernandez <af...@hortonworks.com>
Authored: Tue Jan 19 18:04:27 2016 -0800
Committer: Alejandro Fernandez <af...@hortonworks.com>
Committed: Thu Jan 21 11:14:54 2016 -0800

----------------------------------------------------------------------
 .../server/checks/AbstractCheckDescriptor.java  |   4 +
 .../ambari/server/checks/CheckDescription.java  |   7 +
 .../HiveDynamicServiceDiscoveryCheck.java       |   2 +-
 .../checks/HiveMultipleMetastoreCheck.java      |   2 +-
 .../server/checks/HostMaintenanceModeCheck.java |   2 +-
 .../checks/HostsMasterMaintenanceCheck.java     |   2 +-
 .../server/checks/InstallPackagesCheck.java     |   2 +-
 ...apReduce2JobHistoryStatePreservingCheck.java |   2 +-
 .../server/checks/PreviousUpgradeCompleted.java | 144 +++++++++++++++++++
 .../server/checks/RangerPasswordCheck.java      |   2 +-
 .../checks/SecondaryNamenodeDeletedCheck.java   |   2 +-
 .../checks/ServicesMaintenanceModeCheck.java    |   2 +-
 .../ServicesMapReduceDistributedCacheCheck.java |   2 +-
 .../ServicesNamenodeHighAvailabilityCheck.java  |   2 +-
 .../checks/ServicesNamenodeTruncateCheck.java   |   2 +-
 .../ServicesTezDistributedCacheCheck.java       |   2 +-
 .../checks/ServicesYarnWorkPreservingCheck.java |   2 +-
 .../server/checks/StormRestAPIDeletedCheck.java |   2 +-
 .../checks/YarnRMHighAvailabilityCheck.java     |   2 +-
 .../YarnTimelineServerStatePreservingCheck.java |   2 +-
 .../server/orm/dao/HostRoleCommandDAO.java      |   9 ++
 .../server/checks/UpgradeCheckOrderTest.java    |  26 ++--
 .../ambari/server/state/CheckHelperTest.java    |   2 +
 23 files changed, 192 insertions(+), 34 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/77ea2eba/ambari-server/src/main/java/org/apache/ambari/server/checks/AbstractCheckDescriptor.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/checks/AbstractCheckDescriptor.java b/ambari-server/src/main/java/org/apache/ambari/server/checks/AbstractCheckDescriptor.java
index 80f1c1c..8a81aa9 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/checks/AbstractCheckDescriptor.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/checks/AbstractCheckDescriptor.java
@@ -29,6 +29,7 @@ import org.apache.ambari.server.configuration.Configuration;
 import org.apache.ambari.server.orm.dao.ClusterVersionDAO;
 import org.apache.ambari.server.orm.dao.HostVersionDAO;
 import org.apache.ambari.server.orm.dao.RepositoryVersionDAO;
+import org.apache.ambari.server.orm.dao.UpgradeDAO;
 import org.apache.ambari.server.state.Cluster;
 import org.apache.ambari.server.state.Clusters;
 import org.apache.ambari.server.state.Config;
@@ -67,6 +68,9 @@ public abstract class AbstractCheckDescriptor {
   Provider<RepositoryVersionDAO> repositoryVersionDaoProvider;
 
   @Inject
+  Provider<UpgradeDAO> upgradeDaoProvider;
+
+  @Inject
   Provider<RepositoryVersionHelper> repositoryVersionHelper;
 
   @Inject

http://git-wip-us.apache.org/repos/asf/ambari/blob/77ea2eba/ambari-server/src/main/java/org/apache/ambari/server/checks/CheckDescription.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/checks/CheckDescription.java b/ambari-server/src/main/java/org/apache/ambari/server/checks/CheckDescription.java
index d20203c..a8c0525 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/checks/CheckDescription.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/checks/CheckDescription.java
@@ -152,6 +152,13 @@ public enum CheckDescription {
             "The following Services must be reinstalled: {{fails}}. Try to reinstall the service components in INSTALL_FAILED state.");
       }}),
 
+  PREVIOUS_UPGRADE_COMPLETED(PrereqCheckType.CLUSTER,
+      "A previous upgrade did not complete.",
+      new HashMap<String, String>() {{
+        put(AbstractCheckDescriptor.DEFAULT,
+            "The last upgrade attempt did not complete. {{fails}}");
+      }}),
+
   INSTALL_PACKAGES_CHECK(PrereqCheckType.CLUSTER,
       "Install packages must be re-run",
       new HashMap<String, String>() {{

http://git-wip-us.apache.org/repos/asf/ambari/blob/77ea2eba/ambari-server/src/main/java/org/apache/ambari/server/checks/HiveDynamicServiceDiscoveryCheck.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/checks/HiveDynamicServiceDiscoveryCheck.java b/ambari-server/src/main/java/org/apache/ambari/server/checks/HiveDynamicServiceDiscoveryCheck.java
index 9ecabc7..77a85b9 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/checks/HiveDynamicServiceDiscoveryCheck.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/checks/HiveDynamicServiceDiscoveryCheck.java
@@ -39,7 +39,7 @@ import com.google.inject.Singleton;
  * is properly configured for dynamic discovery.
  */
 @Singleton
-@UpgradeCheck(group = UpgradeCheckGroup.DEFAULT, order = 1.0f, required = true)
+@UpgradeCheck(group = UpgradeCheckGroup.DEFAULT, order = 20.0f, required = true)
 public class HiveDynamicServiceDiscoveryCheck extends AbstractCheckDescriptor {
 
   static final String HIVE_DYNAMIC_SERVICE_DISCOVERY_ENABLED_KEY = "hive.dynamic-service.discovery.enabled.key";

http://git-wip-us.apache.org/repos/asf/ambari/blob/77ea2eba/ambari-server/src/main/java/org/apache/ambari/server/checks/HiveMultipleMetastoreCheck.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/checks/HiveMultipleMetastoreCheck.java b/ambari-server/src/main/java/org/apache/ambari/server/checks/HiveMultipleMetastoreCheck.java
index 14b8435..ea20a55 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/checks/HiveMultipleMetastoreCheck.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/checks/HiveMultipleMetastoreCheck.java
@@ -37,7 +37,7 @@ import com.google.inject.Singleton;
  * Metastore instances in the cluster.
  */
 @Singleton
-@UpgradeCheck(group = UpgradeCheckGroup.MULTIPLE_COMPONENT_WARNING, order = 1.0f)
+@UpgradeCheck(group = UpgradeCheckGroup.MULTIPLE_COMPONENT_WARNING, order = 20.1f)
 public class HiveMultipleMetastoreCheck extends AbstractCheckDescriptor {
 
   /**

http://git-wip-us.apache.org/repos/asf/ambari/blob/77ea2eba/ambari-server/src/main/java/org/apache/ambari/server/checks/HostMaintenanceModeCheck.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/checks/HostMaintenanceModeCheck.java b/ambari-server/src/main/java/org/apache/ambari/server/checks/HostMaintenanceModeCheck.java
index 8708ef4..5e7bdef 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/checks/HostMaintenanceModeCheck.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/checks/HostMaintenanceModeCheck.java
@@ -39,7 +39,7 @@ import com.google.inject.Singleton;
  * @see HostsHeartbeatCheck
  */
 @Singleton
-@UpgradeCheck(group = UpgradeCheckGroup.MAINTENANCE_MODE, order = 3.0f, required = true)
+@UpgradeCheck(group = UpgradeCheckGroup.MAINTENANCE_MODE, order = 7.0f, required = true)
 public class HostMaintenanceModeCheck extends AbstractCheckDescriptor {
 
   /**

http://git-wip-us.apache.org/repos/asf/ambari/blob/77ea2eba/ambari-server/src/main/java/org/apache/ambari/server/checks/HostsMasterMaintenanceCheck.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/checks/HostsMasterMaintenanceCheck.java b/ambari-server/src/main/java/org/apache/ambari/server/checks/HostsMasterMaintenanceCheck.java
index cdb7c61..eaedd3f 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/checks/HostsMasterMaintenanceCheck.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/checks/HostsMasterMaintenanceCheck.java
@@ -40,7 +40,7 @@ import com.google.inject.Singleton;
  * Checks that all hosts in maintenance state do not have master components.
  */
 @Singleton
-@UpgradeCheck(group = UpgradeCheckGroup.MAINTENANCE_MODE, order = 1.0f, required = true)
+@UpgradeCheck(group = UpgradeCheckGroup.MAINTENANCE_MODE, order = 5.0f, required = true)
 public class HostsMasterMaintenanceCheck extends AbstractCheckDescriptor {
 
   static final String KEY_NO_UPGRADE_NAME = "no_upgrade_name";

http://git-wip-us.apache.org/repos/asf/ambari/blob/77ea2eba/ambari-server/src/main/java/org/apache/ambari/server/checks/InstallPackagesCheck.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/checks/InstallPackagesCheck.java b/ambari-server/src/main/java/org/apache/ambari/server/checks/InstallPackagesCheck.java
index 1099418..52546d2 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/checks/InstallPackagesCheck.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/checks/InstallPackagesCheck.java
@@ -42,7 +42,7 @@ import com.google.inject.Singleton;
  * Checks if Install Packages needs to be re-run
  */
 @Singleton
-@UpgradeCheck(group = UpgradeCheckGroup.DEFAULT, order = 2.0f, required = true)
+@UpgradeCheck(group = UpgradeCheckGroup.DEFAULT, order = 3.0f, required = true)
 public class InstallPackagesCheck extends AbstractCheckDescriptor {
 
   /**

http://git-wip-us.apache.org/repos/asf/ambari/blob/77ea2eba/ambari-server/src/main/java/org/apache/ambari/server/checks/MapReduce2JobHistoryStatePreservingCheck.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/checks/MapReduce2JobHistoryStatePreservingCheck.java b/ambari-server/src/main/java/org/apache/ambari/server/checks/MapReduce2JobHistoryStatePreservingCheck.java
index 626438f..06ca162 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/checks/MapReduce2JobHistoryStatePreservingCheck.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/checks/MapReduce2JobHistoryStatePreservingCheck.java
@@ -38,7 +38,7 @@ import java.util.Map;
  * is used to check that the MR2 History server has state preserving mode enabled.
  */
 @Singleton
-@UpgradeCheck(group = UpgradeCheckGroup.CONFIGURATION_WARNING, order = 1.0f)
+@UpgradeCheck(group = UpgradeCheckGroup.CONFIGURATION_WARNING, order = 17.0f)
 public class MapReduce2JobHistoryStatePreservingCheck extends AbstractCheckDescriptor {
 
   final static String MAPREDUCE2_JOBHISTORY_RECOVERY_ENABLE_KEY =

http://git-wip-us.apache.org/repos/asf/ambari/blob/77ea2eba/ambari-server/src/main/java/org/apache/ambari/server/checks/PreviousUpgradeCompleted.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/checks/PreviousUpgradeCompleted.java b/ambari-server/src/main/java/org/apache/ambari/server/checks/PreviousUpgradeCompleted.java
new file mode 100644
index 0000000..dfe17e6
--- /dev/null
+++ b/ambari-server/src/main/java/org/apache/ambari/server/checks/PreviousUpgradeCompleted.java
@@ -0,0 +1,144 @@
+/*
+ * 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.
+ */
+package org.apache.ambari.server.checks;
+
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import org.apache.ambari.server.AmbariException;
+import org.apache.ambari.server.actionmanager.HostRoleStatus;
+import org.apache.ambari.server.controller.PrereqCheckRequest;
+import org.apache.ambari.server.orm.dao.HostRoleCommandDAO;
+import org.apache.ambari.server.orm.dao.RequestDAO;
+import org.apache.ambari.server.orm.entities.ClusterVersionEntity;
+import org.apache.ambari.server.orm.entities.HostRoleCommandEntity;
+import org.apache.ambari.server.orm.entities.HostVersionEntity;
+import org.apache.ambari.server.orm.entities.RepositoryVersionEntity;
+import org.apache.ambari.server.orm.entities.RequestEntity;
+import org.apache.ambari.server.orm.entities.UpgradeEntity;
+import org.apache.ambari.server.state.Cluster;
+import org.apache.ambari.server.state.Host;
+import org.apache.ambari.server.state.MaintenanceState;
+import org.apache.ambari.server.state.RepositoryVersionState;
+import org.apache.ambari.server.state.StackId;
+import org.apache.ambari.server.state.stack.PrereqCheckStatus;
+import org.apache.ambari.server.state.stack.PrerequisiteCheck;
+import org.apache.ambari.server.state.stack.upgrade.Direction;
+import org.apache.commons.lang.StringUtils;
+
+import javax.inject.Provider;
+import java.text.MessageFormat;
+import java.util.HashSet;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * Checks if Install Packages needs to be re-run
+ */
+@Singleton
+@UpgradeCheck(group = UpgradeCheckGroup.DEFAULT, order = 4.0f, required = true)
+public class PreviousUpgradeCompleted extends AbstractCheckDescriptor {
+
+  /**
+   * If this ever changes, we will need to keep the historic name.
+   */
+  public static final String FINALIZE_ACTION_CLASS_NAME = "org.apache.ambari.server.serveraction.upgrades.FinalizeUpgradeAction";
+  public static final String SET_CURRENT_COMMAND = "ambari-server set-current --cluster-name=$CLUSTERNAME --version-display-name=$VERSION_NAME";
+
+  @Inject
+  Provider<RequestDAO> requestDaoProvider;
+
+  @Inject
+  Provider<HostRoleCommandDAO> hostRoleCommandDaoProvider;
+
+  /**
+   * Constructor.
+   */
+  public PreviousUpgradeCompleted() {
+    super(CheckDescription.PREVIOUS_UPGRADE_COMPLETED);
+  }
+
+  @Override
+  public void perform(PrerequisiteCheck prerequisiteCheck, PrereqCheckRequest request) throws AmbariException {
+    final String clusterName = request.getClusterName();
+    final Cluster cluster = clustersProvider.get().getCluster(clusterName);
+
+    String errorMessage = null;
+
+    List<UpgradeEntity> upgrades= upgradeDaoProvider.get().findAll();
+    if (upgrades != null) {
+      Long lastStartTime = 0L;
+      UpgradeEntity mostRecentUpgrade = null;
+      UpgradeEntity correspondingDowngrade = null;
+      for (UpgradeEntity upgrade : upgrades) {
+        // Find the most recent upgrade for this cluster
+        if (upgrade.getClusterId() == cluster.getClusterId() && upgrade.getDirection() == Direction.UPGRADE) {
+          Long requestId = upgrade.getRequestId();
+          RequestEntity upgradeRequest = requestDaoProvider.get().findByPK(requestId);
+          if (upgradeRequest != null && upgradeRequest.getStartTime() > lastStartTime) {
+            mostRecentUpgrade = upgrade;
+            lastStartTime = upgradeRequest.getStartTime();
+          }
+        }
+      }
+
+      // Check for the corresponding downgrade.
+      if (mostRecentUpgrade != null) {
+        for (UpgradeEntity downgrade : upgrades) {
+          // Surprisingly, a Downgrade's from and to version are identical.
+          if (downgrade.getClusterId() == cluster.getClusterId() && downgrade.getDirection() == Direction.DOWNGRADE &&
+              downgrade.getFromVersion().equals(mostRecentUpgrade.getToVersion())) {
+            correspondingDowngrade = downgrade;
+            break;
+          }
+        }
+      }
+
+      // If it has no downgrade, then the "Save Cluster State" step should have COMPLETED.
+      if (correspondingDowngrade == null) {
+        // Should have only 1 element.
+        List<HostRoleCommandEntity> finalizeCommandList = hostRoleCommandDaoProvider.get().
+            findSortedCommandsByRequestIdAndCustomCommandName(mostRecentUpgrade.getRequestId(), FINALIZE_ACTION_CLASS_NAME);
+
+        // If the action is not COMPLETED, then something went wrong.
+        if (finalizeCommandList != null) {
+          for (HostRoleCommandEntity command : finalizeCommandList) {
+            if (command.getStatus() != HostRoleStatus.COMPLETED) {
+              errorMessage = MessageFormat.format("Upgrade attempt (id: {0}, request id: {1}, from version: {2}, " +
+                  "to version: {3}) did not complete task with id {4} since its state is {5} instead of COMPLETED.",
+                  mostRecentUpgrade.getId(), mostRecentUpgrade.getRequestId(), mostRecentUpgrade.getFromVersion(),
+                  mostRecentUpgrade.getToVersion(), command.getTaskId(), command.getStatus());
+              errorMessage += " Please ensure that you called:\n" + SET_CURRENT_COMMAND;
+              errorMessage += MessageFormat.format("\nFurther, change the status of host_role_command with " +
+                  "id {0} to COMPLETED", mostRecentUpgrade.getId());
+              break;
+            }
+          }
+        }
+      }
+    }
+
+    if (null != errorMessage) {
+      LinkedHashSet<String> failedOn = new LinkedHashSet<String>();
+      failedOn.add(cluster.getClusterName());
+      prerequisiteCheck.setFailedOn(failedOn);
+      prerequisiteCheck.setStatus(PrereqCheckStatus.FAIL);
+      prerequisiteCheck.setFailReason(errorMessage);
+    }
+  }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/77ea2eba/ambari-server/src/main/java/org/apache/ambari/server/checks/RangerPasswordCheck.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/checks/RangerPasswordCheck.java b/ambari-server/src/main/java/org/apache/ambari/server/checks/RangerPasswordCheck.java
index 72091a4..33f971a 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/checks/RangerPasswordCheck.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/checks/RangerPasswordCheck.java
@@ -50,7 +50,7 @@ import com.google.inject.Singleton;
  * user had changed the password using the Ranger UI.
  */
 @Singleton
-@UpgradeCheck(group = UpgradeCheckGroup.CONFIGURATION_WARNING, order = 1.1f, required=true)
+@UpgradeCheck(group = UpgradeCheckGroup.CONFIGURATION_WARNING, order = 23.0f, required=true)
 public class RangerPasswordCheck extends AbstractCheckDescriptor {
 
   private static final Logger LOG = LoggerFactory.getLogger(RangerPasswordCheck.class);

http://git-wip-us.apache.org/repos/asf/ambari/blob/77ea2eba/ambari-server/src/main/java/org/apache/ambari/server/checks/SecondaryNamenodeDeletedCheck.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/checks/SecondaryNamenodeDeletedCheck.java b/ambari-server/src/main/java/org/apache/ambari/server/checks/SecondaryNamenodeDeletedCheck.java
index d7c27d7..4893098 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/checks/SecondaryNamenodeDeletedCheck.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/checks/SecondaryNamenodeDeletedCheck.java
@@ -41,7 +41,7 @@ import com.google.inject.Singleton;
  * Checks that the Secondary NameNode is not present on any of the hosts.
  */
 @Singleton
-@UpgradeCheck(group = UpgradeCheckGroup.NAMENODE_HA, order = 2.0f)
+@UpgradeCheck(group = UpgradeCheckGroup.NAMENODE_HA, order = 16.0f)
 public class SecondaryNamenodeDeletedCheck extends AbstractCheckDescriptor {
   @Inject
   HostComponentStateDAO hostComponentStateDao;

http://git-wip-us.apache.org/repos/asf/ambari/blob/77ea2eba/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesMaintenanceModeCheck.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesMaintenanceModeCheck.java b/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesMaintenanceModeCheck.java
index 8d578d8..18a5bde 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesMaintenanceModeCheck.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesMaintenanceModeCheck.java
@@ -33,7 +33,7 @@ import com.google.inject.Singleton;
  * Checks that services are in the maintenance mode.
  */
 @Singleton
-@UpgradeCheck(group = UpgradeCheckGroup.MAINTENANCE_MODE, order = 2.0f, required = true)
+@UpgradeCheck(group = UpgradeCheckGroup.MAINTENANCE_MODE, order = 6.0f, required = true)
 public class ServicesMaintenanceModeCheck extends AbstractCheckDescriptor {
 
   /**

http://git-wip-us.apache.org/repos/asf/ambari/blob/77ea2eba/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesMapReduceDistributedCacheCheck.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesMapReduceDistributedCacheCheck.java b/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesMapReduceDistributedCacheCheck.java
index 8e98c99..3970e9e 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesMapReduceDistributedCacheCheck.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesMapReduceDistributedCacheCheck.java
@@ -39,7 +39,7 @@ import com.google.inject.Singleton;
  * Checks that MR jobs reference hadoop libraries from the distributed cache.
  */
 @Singleton
-@UpgradeCheck(group = UpgradeCheckGroup.NAMENODE_HA, order = 3.0f)
+@UpgradeCheck(group = UpgradeCheckGroup.NAMENODE_HA, order = 17.1f)
 public class ServicesMapReduceDistributedCacheCheck extends AbstractCheckDescriptor {
 
   static final String KEY_APP_CLASSPATH = "app_classpath";

http://git-wip-us.apache.org/repos/asf/ambari/blob/77ea2eba/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesNamenodeHighAvailabilityCheck.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesNamenodeHighAvailabilityCheck.java b/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesNamenodeHighAvailabilityCheck.java
index 44e183d..b7d2417 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesNamenodeHighAvailabilityCheck.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesNamenodeHighAvailabilityCheck.java
@@ -35,7 +35,7 @@ import com.google.inject.Singleton;
  * Checks that namenode high availability is enabled.
  */
 @Singleton
-@UpgradeCheck(group = UpgradeCheckGroup.NAMENODE_HA, order = 1.0f)
+@UpgradeCheck(group = UpgradeCheckGroup.NAMENODE_HA, order = 16.1f)
 public class ServicesNamenodeHighAvailabilityCheck extends AbstractCheckDescriptor {
 
   /**

http://git-wip-us.apache.org/repos/asf/ambari/blob/77ea2eba/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesNamenodeTruncateCheck.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesNamenodeTruncateCheck.java b/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesNamenodeTruncateCheck.java
index cbb8623..35be754 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesNamenodeTruncateCheck.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesNamenodeTruncateCheck.java
@@ -33,7 +33,7 @@ import java.util.Map;
  * Checks that namenode high availability is enabled.
  */
 @Singleton
-@UpgradeCheck(group = UpgradeCheckGroup.NAMENODE_HA, order = 1.1f)
+@UpgradeCheck(group = UpgradeCheckGroup.NAMENODE_HA, order = 16.2f)
 public class ServicesNamenodeTruncateCheck extends AbstractCheckDescriptor {
 
   /**

http://git-wip-us.apache.org/repos/asf/ambari/blob/77ea2eba/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesTezDistributedCacheCheck.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesTezDistributedCacheCheck.java b/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesTezDistributedCacheCheck.java
index 0a866eb..5dadcdd 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesTezDistributedCacheCheck.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesTezDistributedCacheCheck.java
@@ -39,7 +39,7 @@ import com.google.inject.Singleton;
  * Checks that Tez jobs reference hadoop libraries from the distributed cache.
  */
 @Singleton
-@UpgradeCheck(group = UpgradeCheckGroup.NAMENODE_HA, order = 4.0f)
+@UpgradeCheck(group = UpgradeCheckGroup.NAMENODE_HA, order = 21.0f)
 public class ServicesTezDistributedCacheCheck extends AbstractCheckDescriptor {
 
   static final String KEY_LIB_URI_MISSING = "tez_lib_uri_missing";

http://git-wip-us.apache.org/repos/asf/ambari/blob/77ea2eba/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesYarnWorkPreservingCheck.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesYarnWorkPreservingCheck.java b/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesYarnWorkPreservingCheck.java
index 062c11f..77605c1 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesYarnWorkPreservingCheck.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/checks/ServicesYarnWorkPreservingCheck.java
@@ -33,7 +33,7 @@ import java.util.Arrays;
  * Checks that YARN has work-preserving restart enabled.
  */
 @Singleton
-@UpgradeCheck(group = UpgradeCheckGroup.DEFAULT, order = 1.0f)
+@UpgradeCheck(group = UpgradeCheckGroup.DEFAULT, order = 17.1f)
 public class ServicesYarnWorkPreservingCheck extends AbstractCheckDescriptor {
 
   /**

http://git-wip-us.apache.org/repos/asf/ambari/blob/77ea2eba/ambari-server/src/main/java/org/apache/ambari/server/checks/StormRestAPIDeletedCheck.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/checks/StormRestAPIDeletedCheck.java b/ambari-server/src/main/java/org/apache/ambari/server/checks/StormRestAPIDeletedCheck.java
index d3672b1..7071681 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/checks/StormRestAPIDeletedCheck.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/checks/StormRestAPIDeletedCheck.java
@@ -40,7 +40,7 @@ import java.util.Set;
  * checks that STORM_REST_API Component is deleted when upgrading from HDP 2.1 to 2.2 or higher.
  */
 @Singleton
-@UpgradeCheck(group = UpgradeCheckGroup.TOPOLOGY, order = 1.0f, required= false)
+@UpgradeCheck(group = UpgradeCheckGroup.TOPOLOGY, order = 15.0f, required= false)
 public class StormRestAPIDeletedCheck extends AbstractCheckDescriptor {
 
   @Inject

http://git-wip-us.apache.org/repos/asf/ambari/blob/77ea2eba/ambari-server/src/main/java/org/apache/ambari/server/checks/YarnRMHighAvailabilityCheck.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/checks/YarnRMHighAvailabilityCheck.java b/ambari-server/src/main/java/org/apache/ambari/server/checks/YarnRMHighAvailabilityCheck.java
index 9f3bd6e..9dd4877 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/checks/YarnRMHighAvailabilityCheck.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/checks/YarnRMHighAvailabilityCheck.java
@@ -35,7 +35,7 @@ import com.google.inject.Singleton;
  * for ResourceManager..
  */
 @Singleton
-@UpgradeCheck(group = UpgradeCheckGroup.MULTIPLE_COMPONENT_WARNING, order = 2.0f)
+@UpgradeCheck(group = UpgradeCheckGroup.MULTIPLE_COMPONENT_WARNING, order = 17.2f)
 public class YarnRMHighAvailabilityCheck extends AbstractCheckDescriptor {
 
   /**

http://git-wip-us.apache.org/repos/asf/ambari/blob/77ea2eba/ambari-server/src/main/java/org/apache/ambari/server/checks/YarnTimelineServerStatePreservingCheck.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/checks/YarnTimelineServerStatePreservingCheck.java b/ambari-server/src/main/java/org/apache/ambari/server/checks/YarnTimelineServerStatePreservingCheck.java
index 5dbd0b4..8cb8020 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/checks/YarnTimelineServerStatePreservingCheck.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/checks/YarnTimelineServerStatePreservingCheck.java
@@ -38,7 +38,7 @@ import com.google.inject.Singleton;
  * present in HDP 2.2.4.2+.
  */
 @Singleton
-@UpgradeCheck(group = UpgradeCheckGroup.DEFAULT, order = 1.0f)
+@UpgradeCheck(group = UpgradeCheckGroup.DEFAULT, order = 17.3f)
 public class YarnTimelineServerStatePreservingCheck extends AbstractCheckDescriptor {
 
   private final static String YARN_TIMELINE_STATE_RECOVERY_ENABLED_KEY = "yarn.timeline-service.recovery.enabled";

http://git-wip-us.apache.org/repos/asf/ambari/blob/77ea2eba/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/HostRoleCommandDAO.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/HostRoleCommandDAO.java b/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/HostRoleCommandDAO.java
index 6e3c6b2..4fd03e5 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/HostRoleCommandDAO.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/HostRoleCommandDAO.java
@@ -208,6 +208,15 @@ public class HostRoleCommandDAO {
     return daoUtils.selectList(query, role, status);
   }
 
+  @RequiresSession
+  public List<HostRoleCommandEntity> findSortedCommandsByRequestIdAndCustomCommandName(Long requestId, String customCommandName) {
+    TypedQuery<HostRoleCommandEntity> query = entityManagerProvider.get().createQuery("SELECT hostRoleCommand " +
+        "FROM HostRoleCommandEntity hostRoleCommand " +
+        "WHERE hostRoleCommand.requestId=?1 AND hostRoleCommand.customCommandName=?2 " +
+        "ORDER BY hostRoleCommand.taskId", HostRoleCommandEntity.class);
+    return daoUtils.selectList(query, requestId, customCommandName);
+  }
+
 
   @RequiresSession
   public List<HostRoleCommandEntity> findSortedCommandsByStageAndHost(StageEntity stageEntity, HostEntity hostEntity) {

http://git-wip-us.apache.org/repos/asf/ambari/blob/77ea2eba/ambari-server/src/test/java/org/apache/ambari/server/checks/UpgradeCheckOrderTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/checks/UpgradeCheckOrderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/checks/UpgradeCheckOrderTest.java
index 7d70311..d4ff566 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/checks/UpgradeCheckOrderTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/checks/UpgradeCheckOrderTest.java
@@ -76,28 +76,20 @@ public class UpgradeCheckOrderTest {
     for (AbstractCheckDescriptor check : checks) {
       UpgradeCheckGroup group = UpgradeCheckGroup.DEFAULT;
       UpgradeCheckGroup lastGroup = UpgradeCheckGroup.DEFAULT;
-      Float order = 1.0f;
-      Float lastOrder = 1.0f;
 
-      if (null == lastCheck) {
-        lastCheck = check;
-      }
-
-      UpgradeCheck annotation = check.getClass().getAnnotation(UpgradeCheck.class);
-      UpgradeCheck lastAnnotation = lastCheck.getClass().getAnnotation(UpgradeCheck.class);
+      if (null != lastCheck) {
 
-      if (null != annotation) {
-        group = annotation.group();
-        order = annotation.order();
-      }
+        UpgradeCheck annotation = check.getClass().getAnnotation(UpgradeCheck.class);
+        UpgradeCheck lastAnnotation = lastCheck.getClass().getAnnotation(UpgradeCheck.class);
 
-      if (null != lastAnnotation) {
-        lastGroup = lastAnnotation.group();
-        lastOrder = lastAnnotation.order();
+        if (null != annotation && null != lastAnnotation) {
+          group = annotation.group();
+          lastGroup = lastAnnotation.group();
+          Assert.assertTrue(lastGroup.getOrder().compareTo(group.getOrder()) <= 0);
+        }
       }
 
-      Assert.assertTrue(lastGroup.getOrder().compareTo(group.getOrder()) <= 0);
-      Assert.assertTrue(lastOrder.compareTo(order) <= 0);
+      lastCheck = check;
     }
   }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/77ea2eba/ambari-server/src/test/java/org/apache/ambari/server/state/CheckHelperTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/state/CheckHelperTest.java b/ambari-server/src/test/java/org/apache/ambari/server/state/CheckHelperTest.java
index 0176f94..283a3ca 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/state/CheckHelperTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/state/CheckHelperTest.java
@@ -34,6 +34,7 @@ import org.apache.ambari.server.controller.PrereqCheckRequest;
 import org.apache.ambari.server.orm.dao.ClusterVersionDAO;
 import org.apache.ambari.server.orm.dao.HostVersionDAO;
 import org.apache.ambari.server.orm.dao.RepositoryVersionDAO;
+import org.apache.ambari.server.orm.dao.UpgradeDAO;
 import org.apache.ambari.server.state.stack.OsFamily;
 import org.apache.ambari.server.state.stack.PrereqCheckStatus;
 import org.apache.ambari.server.state.stack.PrerequisiteCheck;
@@ -128,6 +129,7 @@ public class CheckHelperTest {
         bind(Clusters.class).toInstance(clusters);
         bind(ClusterVersionDAO.class).toProvider(Providers.<ClusterVersionDAO>of(null));
         bind(HostVersionDAO.class).toProvider(Providers.<HostVersionDAO>of(null));
+        bind(UpgradeDAO.class).toProvider(Providers.<UpgradeDAO>of(null));
         bind(RepositoryVersionDAO.class).toProvider(Providers.<RepositoryVersionDAO>of(null));
         bind(RepositoryVersionHelper.class).toProvider(Providers.<RepositoryVersionHelper>of(null));
         bind(AmbariMetaInfo.class).toProvider(Providers.<AmbariMetaInfo>of(null));


[02/22] ambari git commit: AMBARI-14739. Capture package requirements that are optional and config dependent (aonishuk)

Posted by nc...@apache.org.
AMBARI-14739. Capture package requirements that are optional and config dependent (aonishuk)


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

Branch: refs/heads/branch-dev-patch-upgrade
Commit: 9f76f6019d09464e0f3fd04aba3b02bf059d003d
Parents: 8b7aa92
Author: Andrew Onishuk <ao...@hortonworks.com>
Authored: Wed Jan 20 19:08:04 2016 +0200
Committer: Andrew Onishuk <ao...@hortonworks.com>
Committed: Wed Jan 20 19:08:04 2016 +0200

----------------------------------------------------------------------
 .../python/resource_management/TestScript.py    |  4 +-
 .../libraries/functions/get_lzo_packages.py     |  5 +-
 .../libraries/functions/package_conditions.py   | 64 ++++++++++++++++++++
 .../libraries/script/script.py                  | 21 ++++++-
 .../2.1.1/services/AMBARI_METRICS/metainfo.xml  |  1 +
 .../ambari/server/state/ServiceOsSpecific.java  | 17 +++++-
 .../0.1.0/package/scripts/metrics_monitor.py    |  4 +-
 .../0.96.0.2.0/package/scripts/hbase_client.py  |  4 +-
 .../0.96.0.2.0/package/scripts/hbase_master.py  |  3 +-
 .../package/scripts/hbase_regionserver.py       |  3 +-
 .../0.96.0.2.0/package/scripts/params_linux.py  |  5 --
 .../package/scripts/phoenix_queryserver.py      |  3 +-
 .../common-services/HDFS/2.1.0.2.0/metainfo.xml |  4 ++
 .../HDFS/2.1.0.2.0/package/scripts/datanode.py  |  4 +-
 .../2.1.0.2.0/package/scripts/hdfs_client.py    |  4 +-
 .../2.1.0.2.0/package/scripts/journalnode.py    |  4 +-
 .../HDFS/2.1.0.2.0/package/scripts/namenode.py  |  4 +-
 .../2.1.0.2.0/package/scripts/nfsgateway.py     |  2 +-
 .../2.1.0.2.0/package/scripts/params_linux.py   |  4 --
 .../HDFS/2.1.0.2.0/package/scripts/snamenode.py |  2 +-
 .../2.1.0.2.0/package/scripts/zkfc_slave.py     |  2 +-
 .../HIVE/0.12.0.2.0/metainfo.xml                |  4 ++
 .../0.12.0.2.0/package/scripts/hcat_client.py   |  2 +-
 .../0.12.0.2.0/package/scripts/hive_client.py   |  2 +-
 .../package/scripts/hive_metastore.py           |  2 +-
 .../0.12.0.2.0/package/scripts/hive_server.py   |  2 +-
 .../0.12.0.2.0/package/scripts/mysql_server.py  |  2 +-
 .../0.12.0.2.0/package/scripts/params_linux.py  | 18 +-----
 .../package/scripts/params_windows.py           |  2 -
 .../package/scripts/webhcat_server.py           |  2 +-
 .../KERBEROS/1.10.3-10/metainfo.xml             |  6 ++
 .../package/scripts/kerberos_client.py          |  2 +-
 .../SQOOP/1.4.4.2.0/metainfo.xml                |  1 +
 .../custom_actions/scripts/install_packages.py  | 17 ++----
 .../stacks/HDP/2.1/services/HIVE/metainfo.xml   |  4 ++
 .../stacks/HDP/2.2/services/HBASE/metainfo.xml  |  2 +
 .../stacks/HDP/2.2/services/HDFS/metainfo.xml   |  4 ++
 .../stacks/HDP/2.2/services/HIVE/metainfo.xml   |  5 ++
 .../stacks/HDP/2.2/services/OOZIE/metainfo.xml  |  1 +
 .../stacks/HDP/2.2/services/SQOOP/metainfo.xml  |  1 +
 .../stacks/HDP/2.3/services/HDFS/metainfo.xml   |  3 +
 .../stacks/HDP/2.3/services/HIVE/metainfo.xml   |  7 +++
 .../stacks/HDP/2.3/services/OOZIE/metainfo.xml  |  1 +
 .../configs/install_packages_config.json        |  4 +-
 .../stacks/2.0.6/configs/hbase_no_phx.json      |  2 +-
 .../stacks/2.0.6/configs/hbase_with_phx.json    |  2 +-
 .../python/stacks/2.3/configs/pxf_default.json  |  2 +-
 47 files changed, 184 insertions(+), 80 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/9f76f601/ambari-agent/src/test/python/resource_management/TestScript.py
----------------------------------------------------------------------
diff --git a/ambari-agent/src/test/python/resource_management/TestScript.py b/ambari-agent/src/test/python/resource_management/TestScript.py
index fd31910..f6a5c8c 100644
--- a/ambari-agent/src/test/python/resource_management/TestScript.py
+++ b/ambari-agent/src/test/python/resource_management/TestScript.py
@@ -59,8 +59,8 @@ class TestScript(TestCase):
     }
     dummy_config = {
       'hostLevelParams' : {
-        'package_list' : "[{\"type\":\"rpm\",\"name\":\"hbase\"},"
-                         "{\"type\":\"rpm\",\"name\":\"yet-another-package\"}]",
+        'package_list' : "[{\"type\":\"rpm\",\"name\":\"hbase\", \"condition\": \"\"},"
+                         "{\"type\":\"rpm\",\"name\":\"yet-another-package\", \"condition\": \"\"}]",
         'repo_info' : "[{\"baseUrl\":\"http://public-repo-1.hortonworks.com/HDP/centos6/2.x/updates/2.0.6.0\",\"osType\":\"centos6\",\"repoId\":\"HDP-2.0._\",\"repoName\":\"HDP\",\"defaultBaseUrl\":\"http://public-repo-1.hortonworks.com/HDP/centos6/2.x/updates/2.0.6.0\"}]",
         'service_repo_info' : "[{\"mirrorsList\":\"abc\",\"osType\":\"centos6\",\"repoId\":\"HDP-2.0._\",\"repoName\":\"HDP\",\"defaultBaseUrl\":\"http://public-repo-1.hortonworks.com/HDP/centos6/2.x/updates/2.0.6.0\"}]"
       }

http://git-wip-us.apache.org/repos/asf/ambari/blob/9f76f601/ambari-common/src/main/python/resource_management/libraries/functions/get_lzo_packages.py
----------------------------------------------------------------------
diff --git a/ambari-common/src/main/python/resource_management/libraries/functions/get_lzo_packages.py b/ambari-common/src/main/python/resource_management/libraries/functions/get_lzo_packages.py
index 0537ec3..afb4314 100644
--- a/ambari-common/src/main/python/resource_management/libraries/functions/get_lzo_packages.py
+++ b/ambari-common/src/main/python/resource_management/libraries/functions/get_lzo_packages.py
@@ -38,10 +38,7 @@ def get_lzo_packages(stack_version_unformatted):
   hdp_stack_version = format_hdp_stack_version(stack_version_unformatted)
 
   if hdp_stack_version != "" and compare_versions(hdp_stack_version, '2.2') >= 0:
-    if OSCheck.is_redhat_family() or OSCheck.is_suse_family():
-      lzo_packages += [format("hadooplzo_*")]
-    elif OSCheck.is_ubuntu_family():
-      lzo_packages += [format("hadooplzo_*")]
+    lzo_packages += ["hadooplzo_*"]
   else:
     lzo_packages += ["hadoop-lzo"]
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/9f76f601/ambari-common/src/main/python/resource_management/libraries/functions/package_conditions.py
----------------------------------------------------------------------
diff --git a/ambari-common/src/main/python/resource_management/libraries/functions/package_conditions.py b/ambari-common/src/main/python/resource_management/libraries/functions/package_conditions.py
new file mode 100644
index 0000000..0fb0fe4
--- /dev/null
+++ b/ambari-common/src/main/python/resource_management/libraries/functions/package_conditions.py
@@ -0,0 +1,64 @@
+#!/usr/bin/env python
+"""
+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.
+
+Ambari Agent
+
+"""
+__all__ = ["is_lzo_enabled", "should_install_phoenix", "should_install_ams_collector", "should_install_mysql", "should_install_mysl_connector"]
+
+import os
+from resource_management.libraries.script import Script
+from resource_management.libraries.functions.default import default
+
+def should_install_lzo():
+  config = Script.get_config()
+  io_compression_codecs = default("/configurations/core-site/io.compression.codecs", None)
+  lzo_enabled = io_compression_codecs is not None and "com.hadoop.compression.lzo" in io_compression_codecs.lower()
+  return lzo_enabled
+
+def should_install_phoenix():
+  phoenix_hosts = default('/clusterHostInfo/phoenix_query_server_hosts', [])
+  phoenix_enabled = default('/configurations/hbase-env/phoenix_sql_enabled', False)
+  has_phoenix = len(phoenix_hosts) > 0
+  return phoenix_enabled or has_phoenix
+
+def should_install_ams_collector():
+  config = Script.get_config()
+  return 'role' in config and config['role'] == "METRICS_COLLECTOR"
+
+def should_install_mysql():
+  config = Script.get_config()
+  hive_database = config['configurations']['hive-env']['hive_database']
+  hive_use_existing_db = hive_database.startswith('Existing')
+  
+  if hive_use_existing_db or 'role' in config and config['role'] != "MYSQL_SERVER":
+    return False
+  return True
+
+def should_install_mysl_connector():
+  mysql_jdbc_driver_jar = "/usr/share/java/mysql-connector-java.jar"
+  return not os.path.exists(mysql_jdbc_driver_jar)
+
+def should_install_hive_atlas():
+  atlas_hosts = default('/clusterHostInfo/atlas_server_hosts', [])
+  has_atlas = len(atlas_hosts) > 0
+  return has_atlas
+
+def should_install_kerberos_server():
+  config = Script.get_config()
+  return 'role' in config and config['role'] != "KERBEROS_CLIENT"
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/9f76f601/ambari-common/src/main/python/resource_management/libraries/script/script.py
----------------------------------------------------------------------
diff --git a/ambari-common/src/main/python/resource_management/libraries/script/script.py b/ambari-common/src/main/python/resource_management/libraries/script/script.py
index 7101386..3bef342 100644
--- a/ambari-common/src/main/python/resource_management/libraries/script/script.py
+++ b/ambari-common/src/main/python/resource_management/libraries/script/script.py
@@ -28,6 +28,7 @@ import logging
 import platform
 import inspect
 import tarfile
+import resource_management
 from ambari_commons import OSCheck, OSConst
 from ambari_commons.constants import UPGRADE_TYPE_NON_ROLLING, UPGRADE_TYPE_ROLLING
 from ambari_commons.os_family_impl import OsFamilyFuncImpl, OsFamilyImpl
@@ -420,7 +421,7 @@ class Script(object):
     """
     self.install_packages(env)
 
-  def install_packages(self, env, exclude_packages=[]):
+  def install_packages(self, env):
     """
     List of packages that are required< by service is received from the server
     as a command parameter. The method installs all packages
@@ -442,7 +443,7 @@ class Script(object):
       if isinstance(package_list_str, basestring) and len(package_list_str) > 0:
         package_list = json.loads(package_list_str)
         for package in package_list:
-          if not Script.matches_any_regexp(package['name'], exclude_packages):
+          if Script.check_package_condition(package):
             name = self.format_package_name(package['name'])
             # HACK: On Windows, only install ambari-metrics packages using Choco Package Installer
             # TODO: Update this once choco packages for hadoop are created. This is because, service metainfo.xml support
@@ -465,6 +466,22 @@ class Script(object):
       reload_windows_env()
       
   @staticmethod
+  def check_package_condition(package):
+    from resource_management.libraries.functions import package_conditions
+    condition = package['condition']
+    name = package['name']
+    
+    if not condition:
+      return True
+    
+    try:
+      chooser_method = getattr(package_conditions, condition)
+    except AttributeError:
+      raise Fail("Condition with name '{0}', when installing package {1}. Please check package_conditions.py.".format(condition, name))
+
+    return chooser_method()
+      
+  @staticmethod
   def matches_any_regexp(string, regexp_list):
     for regex in regexp_list:
       # we cannot use here Python regex, since * will create some troubles matching plaintext names. 

http://git-wip-us.apache.org/repos/asf/ambari/blob/9f76f601/ambari-funtest/src/test/resources/stacks/HDP/2.1.1/services/AMBARI_METRICS/metainfo.xml
----------------------------------------------------------------------
diff --git a/ambari-funtest/src/test/resources/stacks/HDP/2.1.1/services/AMBARI_METRICS/metainfo.xml b/ambari-funtest/src/test/resources/stacks/HDP/2.1.1/services/AMBARI_METRICS/metainfo.xml
index aea1252..84735c2 100644
--- a/ambari-funtest/src/test/resources/stacks/HDP/2.1.1/services/AMBARI_METRICS/metainfo.xml
+++ b/ambari-funtest/src/test/resources/stacks/HDP/2.1.1/services/AMBARI_METRICS/metainfo.xml
@@ -69,6 +69,7 @@
           <packages>
             <package>
               <name>ambari-metrics-collector</name>
+              <condition>package_chooser.should_install_ams_collector()</condition>
             </package>
             <package>
               <name>ambari-metrics-monitor</name>

http://git-wip-us.apache.org/repos/asf/ambari/blob/9f76f601/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceOsSpecific.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceOsSpecific.java b/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceOsSpecific.java
index 47e244f..5e1d5d3 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceOsSpecific.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceOsSpecific.java
@@ -165,6 +165,7 @@ public class ServiceOsSpecific {
   @XmlAccessorType(XmlAccessType.FIELD)
   public static class Package {
     private String name;
+    private String condition = "";
 
     /**
      * If true, package will not be attempted to be upgraded during RU.
@@ -180,6 +181,14 @@ public class ServiceOsSpecific {
     public void setName(String name) {
       this.name = name;
     }
+    
+    public String getCondition() {
+      return condition;
+    }
+
+    public void setCondition(String condition) {
+      this.condition = condition;
+    }
 
     public Boolean getSkipUpgrade() {
       return skipUpgrade;
@@ -200,14 +209,18 @@ public class ServiceOsSpecific {
       Package aPackage = (Package) o;
 
       if (!name.equals(aPackage.name)) return false;
-      return skipUpgrade.equals(aPackage.skipUpgrade);
-
+      if (!skipUpgrade.equals(aPackage.skipUpgrade)) return false;
+      if (!condition.equals(aPackage.condition)) return false;
+      
+      return true;
     }
 
     @Override
     public int hashCode() {
       int result = name.hashCode();
       result = 31 * result + skipUpgrade.hashCode();
+      result = 31 * result + condition.hashCode();
+      
       return result;
     }
   }

http://git-wip-us.apache.org/repos/asf/ambari/blob/9f76f601/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/scripts/metrics_monitor.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/scripts/metrics_monitor.py b/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/scripts/metrics_monitor.py
index a1d6a1d..d98384b 100644
--- a/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/scripts/metrics_monitor.py
+++ b/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/scripts/metrics_monitor.py
@@ -25,7 +25,9 @@ from status import check_service_status
 
 class AmsMonitor(Script):
   def install(self, env):
-    self.install_packages(env, exclude_packages = ['ambari-metrics-collector'])
+    import params
+    env.set_params(params)
+    self.install_packages(env)
     self.configure(env) # for security
 
   def configure(self, env):

http://git-wip-us.apache.org/repos/asf/ambari/blob/9f76f601/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/hbase_client.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/hbase_client.py b/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/hbase_client.py
index 97213fd..ac34d40 100644
--- a/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/hbase_client.py
+++ b/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/hbase_client.py
@@ -30,8 +30,8 @@ from ambari_commons.os_family_impl import OsFamilyImpl
 class HbaseClient(Script):
   def install(self, env):
     import params
-    
-    self.install_packages(env, params.exclude_packages)
+    env.set_params(params)
+    self.install_packages(env)
     self.configure(env)
 
   def configure(self, env):

http://git-wip-us.apache.org/repos/asf/ambari/blob/9f76f601/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/hbase_master.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/hbase_master.py b/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/hbase_master.py
index fdd8f5a..9515f61 100644
--- a/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/hbase_master.py
+++ b/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/hbase_master.py
@@ -40,7 +40,8 @@ class HbaseMaster(Script):
 
   def install(self, env):
     import params
-    self.install_packages(env, params.exclude_packages)
+    env.set_params(params)
+    self.install_packages(env)
 
   def decommission(self, env):
     import params

http://git-wip-us.apache.org/repos/asf/ambari/blob/9f76f601/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/hbase_regionserver.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/hbase_regionserver.py b/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/hbase_regionserver.py
index ecab844..c17d219 100644
--- a/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/hbase_regionserver.py
+++ b/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/hbase_regionserver.py
@@ -34,7 +34,8 @@ from ambari_commons.os_family_impl import OsFamilyImpl
 class HbaseRegionServer(Script):
   def install(self, env):
     import params
-    self.install_packages(env, params.exclude_packages)
+    env.set_params(params)
+    self.install_packages(env)
 
   def configure(self, env):
     import params

http://git-wip-us.apache.org/repos/asf/ambari/blob/9f76f601/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/params_linux.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/params_linux.py b/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/params_linux.py
index 4a44676..337f09d 100644
--- a/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/params_linux.py
+++ b/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/params_linux.py
@@ -113,11 +113,6 @@ phoenix_hosts = default('/clusterHostInfo/phoenix_query_server_hosts', [])
 phoenix_enabled = default('/configurations/hbase-env/phoenix_sql_enabled', False)
 has_phoenix = len(phoenix_hosts) > 0
 
-if not has_phoenix and not phoenix_enabled:
-  exclude_packages = ['phoenix*']
-else:
-  exclude_packages = []
-
 underscored_version = stack_version_unformatted.replace('.', '_')
 dashed_version = stack_version_unformatted.replace('.', '-')
 if OSCheck.is_redhat_family() or OSCheck.is_suse_family():

http://git-wip-us.apache.org/repos/asf/ambari/blob/9f76f601/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/phoenix_queryserver.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/phoenix_queryserver.py b/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/phoenix_queryserver.py
index e894f95..693bb08 100644
--- a/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/phoenix_queryserver.py
+++ b/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/phoenix_queryserver.py
@@ -28,7 +28,8 @@ class PhoenixQueryServer(Script):
 
   def install(self, env):
     import params
-    self.install_packages(env, params.exclude_packages)
+    env.set_params(params)
+    self.install_packages(env)
 
 
   def get_stack_to_component(self):

http://git-wip-us.apache.org/repos/asf/ambari/blob/9f76f601/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/metainfo.xml
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/metainfo.xml b/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/metainfo.xml
index e3e16e3..752de0e 100644
--- a/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/metainfo.xml
+++ b/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/metainfo.xml
@@ -165,6 +165,7 @@
             <package>
               <name>hadoop-lzo</name>
               <skipUpgrade>true</skipUpgrade>
+              <condition>should_install_lzo</condition>
             </package>
           </packages>
         </osSpecific>
@@ -181,10 +182,12 @@
             <package>
               <name>lzo</name>
               <skipUpgrade>true</skipUpgrade>
+              <condition>should_install_lzo</condition>
             </package>
             <package>
               <name>hadoop-lzo-native</name>
               <skipUpgrade>true</skipUpgrade>
+              <condition>should_install_lzo</condition>
             </package>
             <package>
               <name>hadoop-libhdfs</name>
@@ -204,6 +207,7 @@
             <package>
               <name>liblzo2-2</name>
               <skipUpgrade>true</skipUpgrade>
+              <condition>should_install_lzo</condition>
             </package>
             <package>
               <name>hadoop-hdfs</name>

http://git-wip-us.apache.org/repos/asf/ambari/blob/9f76f601/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/datanode.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/datanode.py b/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/datanode.py
index 1d242e1..5adeab4 100644
--- a/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/datanode.py
+++ b/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/datanode.py
@@ -46,8 +46,8 @@ class DataNode(Script):
 
   def install(self, env):
     import params
-    self.install_packages(env, params.exclude_packages)
     env.set_params(params)
+    self.install_packages(env)
 
   def configure(self, env):
     import params
@@ -161,7 +161,7 @@ class DataNodeDefault(DataNode):
 class DataNodeWindows(DataNode):
   def install(self, env):
     import install_params
-    self.install_packages(env, install_params.exclude_packages)
+    self.install_packages(env)
 
 if __name__ == "__main__":
   DataNode().execute()

http://git-wip-us.apache.org/repos/asf/ambari/blob/9f76f601/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/hdfs_client.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/hdfs_client.py b/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/hdfs_client.py
index 16218b6..21c0eda 100644
--- a/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/hdfs_client.py
+++ b/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/hdfs_client.py
@@ -31,8 +31,8 @@ class HdfsClient(Script):
 
   def install(self, env):
     import params
-    self.install_packages(env, params.exclude_packages)
     env.set_params(params)
+    self.install_packages(env)
     self.configure(env)
 
   def configure(self, env):
@@ -113,7 +113,7 @@ class HdfsClientDefault(HdfsClient):
 class HdfsClientWindows(HdfsClient):
   def install(self, env):
     import install_params
-    self.install_packages(env, install_params.exclude_packages)
+    self.install_packages(env)
     self.configure(env)
 
 if __name__ == "__main__":

http://git-wip-us.apache.org/repos/asf/ambari/blob/9f76f601/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/journalnode.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/journalnode.py b/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/journalnode.py
index ad4283c..7715f6c 100644
--- a/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/journalnode.py
+++ b/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/journalnode.py
@@ -36,8 +36,8 @@ from ambari_commons import OSConst
 class JournalNode(Script):
   def install(self, env):
     import params
-    self.install_packages(env, params.exclude_packages)
     env.set_params(params)
+    self.install_packages(env)  
 
 @OsFamilyImpl(os_family=OsFamilyImpl.DEFAULT)
 class JournalNodeDefault(JournalNode):
@@ -164,7 +164,7 @@ class JournalNodeDefault(JournalNode):
 class JournalNodeWindows(JournalNode):
   def install(self, env):
     import install_params
-    self.install_packages(env, install_params.exclude_packages)
+    self.install_packages(env)
 
   def start(self, env):
     import params

http://git-wip-us.apache.org/repos/asf/ambari/blob/9f76f601/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/namenode.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/namenode.py b/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/namenode.py
index 9a42702..910bc0a 100644
--- a/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/namenode.py
+++ b/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/namenode.py
@@ -82,8 +82,8 @@ class NameNode(Script):
 
   def install(self, env):
     import params
-    self.install_packages(env, params.exclude_packages)
     env.set_params(params)
+    self.install_packages(env)
     #TODO we need this for HA because of manual steps
     self.configure(env)
 
@@ -347,7 +347,7 @@ class NameNodeDefault(NameNode):
 class NameNodeWindows(NameNode):
   def install(self, env):
     import install_params
-    self.install_packages(env, install_params.exclude_packages)
+    self.install_packages(env)
     #TODO we need this for HA because of manual steps
     self.configure(env)
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/9f76f601/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/nfsgateway.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/nfsgateway.py b/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/nfsgateway.py
index df5569e..4b9ad06 100644
--- a/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/nfsgateway.py
+++ b/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/nfsgateway.py
@@ -39,7 +39,7 @@ class NFSGateway(Script):
 
     env.set_params(params)
 
-    self.install_packages(env, params.exclude_packages)
+    self.install_packages(env)
 
   def pre_upgrade_restart(self, env, upgrade_type=None):
     import params

http://git-wip-us.apache.org/repos/asf/ambari/blob/9f76f601/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/params_linux.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/params_linux.py b/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/params_linux.py
index c923e23..29c4784 100644
--- a/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/params_linux.py
+++ b/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/params_linux.py
@@ -341,10 +341,6 @@ HdfsResource = functools.partial(
 io_compression_codecs = default("/configurations/core-site/io.compression.codecs", None)
 lzo_enabled = io_compression_codecs is not None and "com.hadoop.compression.lzo" in io_compression_codecs.lower()
 lzo_packages = get_lzo_packages(stack_version_unformatted)
-
-exclude_packages = []
-if not lzo_enabled:
-  exclude_packages += lzo_packages
   
 name_node_params = default("/commandParams/namenode", None)
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/9f76f601/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/snamenode.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/snamenode.py b/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/snamenode.py
index 1748955..b8a1726 100644
--- a/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/snamenode.py
+++ b/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/snamenode.py
@@ -36,7 +36,7 @@ class SNameNode(Script):
   def install(self, env):
     import params
     env.set_params(params)
-    self.install_packages(env, params.exclude_packages)
+    self.install_packages(env)
 
   def configure(self, env):
     import params

http://git-wip-us.apache.org/repos/asf/ambari/blob/9f76f601/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/zkfc_slave.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/zkfc_slave.py b/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/zkfc_slave.py
index 148e605..3558681 100644
--- a/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/zkfc_slave.py
+++ b/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/zkfc_slave.py
@@ -39,7 +39,7 @@ class ZkfcSlave(Script):
   def install(self, env):
     import params
     env.set_params(params)
-    self.install_packages(env, params.exclude_packages)
+    self.install_packages(env)
 
   def configure(self, env):
     import params

http://git-wip-us.apache.org/repos/asf/ambari/blob/9f76f601/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/metainfo.xml
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/metainfo.xml b/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/metainfo.xml
index 634b2fc..fc93ee6 100644
--- a/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/metainfo.xml
+++ b/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/metainfo.xml
@@ -255,6 +255,7 @@
             <package>
               <name>mysql-connector-java</name>
               <skipUpgrade>true</skipUpgrade>
+              <condition>should_install_mysl_connector</condition>
             </package>
           </packages>
         </osSpecific>
@@ -273,6 +274,7 @@
             <package>
               <name>mysql-server</name>
               <skipUpgrade>true</skipUpgrade>
+              <condition>should_install_mysql</condition>
             </package>
           </packages>
         </osSpecific>
@@ -282,10 +284,12 @@
             <package>
               <name>mysql-community-release</name>
               <skipUpgrade>true</skipUpgrade>
+              <condition>should_install_mysql</condition>
             </package>
             <package>
               <name>mysql-community-server</name>
               <skipUpgrade>true</skipUpgrade>
+              <condition>should_install_mysql</condition>
             </package>
           </packages>
         </osSpecific>

http://git-wip-us.apache.org/repos/asf/ambari/blob/9f76f601/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/hcat_client.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/hcat_client.py b/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/hcat_client.py
index b372085..70bebb4 100644
--- a/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/hcat_client.py
+++ b/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/hcat_client.py
@@ -31,7 +31,7 @@ from resource_management.libraries.script.script import Script
 class HCatClient(Script):
   def install(self, env):
     import params
-    self.install_packages(env, exclude_packages=params.hive_exclude_packages)
+    self.install_packages(env)
     self.configure(env)
 
   def configure(self, env):

http://git-wip-us.apache.org/repos/asf/ambari/blob/9f76f601/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/hive_client.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/hive_client.py b/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/hive_client.py
index 117b456..e4aace3 100644
--- a/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/hive_client.py
+++ b/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/hive_client.py
@@ -28,7 +28,7 @@ from ambari_commons import OSConst
 class HiveClient(Script):
   def install(self, env):
     import params
-    self.install_packages(env, exclude_packages=params.hive_exclude_packages)
+    self.install_packages(env)
     self.configure(env)
 
   def status(self, env):

http://git-wip-us.apache.org/repos/asf/ambari/blob/9f76f601/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/hive_metastore.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/hive_metastore.py b/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/hive_metastore.py
index 5866cd0..59ecbbb 100644
--- a/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/hive_metastore.py
+++ b/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/hive_metastore.py
@@ -47,7 +47,7 @@ LEGACY_HIVE_SERVER_CONF = "/etc/hive/conf.server"
 class HiveMetastore(Script):
   def install(self, env):
     import params
-    self.install_packages(env, exclude_packages = params.hive_exclude_packages)
+    self.install_packages(env)
 
 
   def start(self, env, upgrade_type=None):

http://git-wip-us.apache.org/repos/asf/ambari/blob/9f76f601/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/hive_server.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/hive_server.py b/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/hive_server.py
index 96c05ca..a81e4f6 100644
--- a/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/hive_server.py
+++ b/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/hive_server.py
@@ -47,7 +47,7 @@ from hive_service import hive_service
 class HiveServer(Script):
   def install(self, env):
     import params
-    self.install_packages(env, exclude_packages=params.hive_exclude_packages)
+    self.install_packages(env)
 
   def configure(self, env):
     import params

http://git-wip-us.apache.org/repos/asf/ambari/blob/9f76f601/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/mysql_server.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/mysql_server.py b/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/mysql_server.py
index dcfb567..851dc02 100644
--- a/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/mysql_server.py
+++ b/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/mysql_server.py
@@ -30,7 +30,7 @@ from mysql_utils import mysql_configure
 class MysqlServer(Script):
   def install(self, env):
     import params
-    self.install_packages(env, exclude_packages=params.hive_exclude_packages)
+    self.install_packages(env)
     self.configure(env)
 
   def clean(self, env):

http://git-wip-us.apache.org/repos/asf/ambari/blob/9f76f601/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/params_linux.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/params_linux.py b/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/params_linux.py
index a2131b0..cd3741d 100644
--- a/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/params_linux.py
+++ b/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/params_linux.py
@@ -384,19 +384,6 @@ hive_authorization_enabled = config['configurations']['hive-site']['hive.securit
 
 mysql_jdbc_driver_jar = "/usr/share/java/mysql-connector-java.jar"
 hive_use_existing_db = hive_database.startswith('Existing')
-hive_exclude_packages = []
-
-# There are other packages that contain /usr/share/java/mysql-connector-java.jar (like libmysql-java),
-# trying to install mysql-connector-java upon them can cause packages to conflict.
-if hive_use_existing_db:
-  hive_exclude_packages = ['mysql-connector-java', 'mysql', 'mysql-server',
-                           'mysql-community-release', 'mysql-community-server']
-else:
-  if 'role' in config and config['role'] != "MYSQL_SERVER":
-    hive_exclude_packages = ['mysql', 'mysql-server', 'mysql-community-release',
-                             'mysql-community-server']
-  if os.path.exists(mysql_jdbc_driver_jar):
-    hive_exclude_packages.append('mysql-connector-java')
 
 
 hive_site_config = dict(config['configurations']['hive-site'])
@@ -410,10 +397,7 @@ classpath_addition = ""
 atlas_plugin_package = "atlas-metadata*-hive-plugin"
 atlas_ubuntu_plugin_package = "atlas-metadata.*-hive-plugin"
 
-if not has_atlas:
-  hive_exclude_packages.append(atlas_plugin_package)
-  hive_exclude_packages.append(atlas_ubuntu_plugin_package)
-else:
+if has_atlas:
   # client.properties
   atlas_client_props = {}
   auth_enabled = config['configurations']['application-properties'].get(

http://git-wip-us.apache.org/repos/asf/ambari/blob/9f76f601/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/params_windows.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/params_windows.py b/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/params_windows.py
index f2524b2..359604f 100644
--- a/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/params_windows.py
+++ b/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/params_windows.py
@@ -61,8 +61,6 @@ hive_metastore_db_type = config['configurations']['hive-env']['hive_database_typ
 hive_metastore_user_name = config['configurations']['hive-site']['javax.jdo.option.ConnectionUserName']
 hive_metastore_user_passwd = config['configurations']['hive-site']['javax.jdo.option.ConnectionPassword']
 
-hive_exclude_packages = []
-
 hive_execution_engine = config["configurations"]["hive-site"]["hive.execution.engine"]
 
 ######## Metastore Schema

http://git-wip-us.apache.org/repos/asf/ambari/blob/9f76f601/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/webhcat_server.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/webhcat_server.py b/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/webhcat_server.py
index f0f31a8..c12b168 100644
--- a/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/webhcat_server.py
+++ b/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/webhcat_server.py
@@ -33,7 +33,7 @@ from ambari_commons.os_family_impl import OsFamilyImpl
 class WebHCatServer(Script):
   def install(self, env):
     import params
-    self.install_packages(env, exclude_packages=params.hive_exclude_packages)
+    self.install_packages(env)
 
   def start(self, env, upgrade_type=None):
     import params

http://git-wip-us.apache.org/repos/asf/ambari/blob/9f76f601/ambari-server/src/main/resources/common-services/KERBEROS/1.10.3-10/metainfo.xml
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/common-services/KERBEROS/1.10.3-10/metainfo.xml b/ambari-server/src/main/resources/common-services/KERBEROS/1.10.3-10/metainfo.xml
index 72f159a..ec462a7 100644
--- a/ambari-server/src/main/resources/common-services/KERBEROS/1.10.3-10/metainfo.xml
+++ b/ambari-server/src/main/resources/common-services/KERBEROS/1.10.3-10/metainfo.xml
@@ -78,10 +78,12 @@
             <package>
               <name>krb5-server</name>
               <skipUpgrade>true</skipUpgrade>
+              <condition>should_install_kerberos_server</condition>
             </package>
             <package>
               <name>krb5-libs</name>
               <skipUpgrade>true</skipUpgrade>
+              <condition>should_install_kerberos_server</condition>
             </package>
             <package>
               <name>krb5-workstation</name>
@@ -96,10 +98,12 @@
             <package>
               <name>krb5-kdc</name>
               <skipUpgrade>true</skipUpgrade>
+              <condition>should_install_kerberos_server</condition>
             </package>
             <package>
               <name>krb5-admin-server</name>
               <skipUpgrade>true</skipUpgrade>
+              <condition>should_install_kerberos_server</condition>
             </package>
             <package>
               <name>krb5-user</name>
@@ -118,6 +122,7 @@
             <package>
               <name>krb5</name>
               <skipUpgrade>true</skipUpgrade>
+              <condition>should_install_kerberos_server</condition>
             </package>
             <package>
               <name>krb5-client</name>
@@ -126,6 +131,7 @@
             <package>
               <name>krb5-server</name>
               <skipUpgrade>true</skipUpgrade>
+              <condition>should_install_kerberos_server</condition>
             </package>
           </packages>
         </osSpecific>

http://git-wip-us.apache.org/repos/asf/ambari/blob/9f76f601/ambari-server/src/main/resources/common-services/KERBEROS/1.10.3-10/package/scripts/kerberos_client.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/common-services/KERBEROS/1.10.3-10/package/scripts/kerberos_client.py b/ambari-server/src/main/resources/common-services/KERBEROS/1.10.3-10/package/scripts/kerberos_client.py
index 580545d..013aabc 100644
--- a/ambari-server/src/main/resources/common-services/KERBEROS/1.10.3-10/package/scripts/kerberos_client.py
+++ b/ambari-server/src/main/resources/common-services/KERBEROS/1.10.3-10/package/scripts/kerberos_client.py
@@ -24,7 +24,7 @@ class KerberosClient(KerberosScript):
   def install(self, env):
     install_packages = default('/configurations/kerberos-env/install_packages', "true")
     if install_packages:
-      self.install_packages(env, ['krb5-server', 'krb5-libs', 'krb5-auth-dialog', 'krb5', 'krb5-kdc', 'krb5-admin-server'])
+      self.install_packages(env)
     else:
       print "Kerberos client packages are not being installed, manual installation is required."
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/9f76f601/ambari-server/src/main/resources/common-services/SQOOP/1.4.4.2.0/metainfo.xml
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/common-services/SQOOP/1.4.4.2.0/metainfo.xml b/ambari-server/src/main/resources/common-services/SQOOP/1.4.4.2.0/metainfo.xml
index 0cf9c7d..b5db91b 100644
--- a/ambari-server/src/main/resources/common-services/SQOOP/1.4.4.2.0/metainfo.xml
+++ b/ambari-server/src/main/resources/common-services/SQOOP/1.4.4.2.0/metainfo.xml
@@ -72,6 +72,7 @@
             <package>
               <name>mysql-connector-java</name>
               <skipUpgrade>true</skipUpgrade>
+              <condition>should_install_mysl_connector</condition>
             </package>
           </packages>
         </osSpecific>

http://git-wip-us.apache.org/repos/asf/ambari/blob/9f76f601/ambari-server/src/main/resources/custom_actions/scripts/install_packages.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/custom_actions/scripts/install_packages.py b/ambari-server/src/main/resources/custom_actions/scripts/install_packages.py
index b28a5e0..bf80616 100644
--- a/ambari-server/src/main/resources/custom_actions/scripts/install_packages.py
+++ b/ambari-server/src/main/resources/custom_actions/scripts/install_packages.py
@@ -28,6 +28,7 @@ import os.path
 import ambari_simplejson as json  # simplejson is much faster comparing to Python 2.6 json module and has the same functions set.
 
 from resource_management import *
+import resource_management
 from resource_management.libraries.functions.list_ambari_managed_repos import list_ambari_managed_repos
 from ambari_commons.os_check import OSCheck, OSConst
 from resource_management.libraries.functions.packages_analyzer import allInstalledPackages
@@ -416,25 +417,15 @@ class InstallPackages(Script):
   def filter_package_list(self, package_list):
     """
     Note: that we have skipUpgrade option in metainfo.xml to filter packages,
+    as well as condition option to filter them conditionally,
     so use this method only if, for some reason the metainfo option cannot be used.
-    
-    Here we filter packages that are managed with custom logic in package
-    scripts. Usually this packages come from system repositories, and either
-     are not available when we restrict repository list, or should not be
-    installed on host at all.
+  
     :param package_list: original list
     :return: filtered package_list
     """
     filtered_package_list = []
     for package in package_list:
-      skip_package = False
-      
-      # skip upgrade for hadooplzo* versioned package, only if lzo is disabled 
-      io_compression_codecs = default("/configurations/core-site/io.compression.codecs", None)
-      if not io_compression_codecs or "com.hadoop.compression.lzo" not in io_compression_codecs:
-        skip_package = package['name'].startswith('hadooplzo')
-
-      if not skip_package:
+      if Script.check_package_condition(package):
         filtered_package_list.append(package)
     return filtered_package_list
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/9f76f601/ambari-server/src/main/resources/stacks/HDP/2.1/services/HIVE/metainfo.xml
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/stacks/HDP/2.1/services/HIVE/metainfo.xml b/ambari-server/src/main/resources/stacks/HDP/2.1/services/HIVE/metainfo.xml
index 5c9e8c2..279bcb7 100644
--- a/ambari-server/src/main/resources/stacks/HDP/2.1/services/HIVE/metainfo.xml
+++ b/ambari-server/src/main/resources/stacks/HDP/2.1/services/HIVE/metainfo.xml
@@ -58,6 +58,7 @@
             <package>
               <name>mysql-connector-java</name>
               <skipUpgrade>true</skipUpgrade>
+              <condition>should_install_mysl_connector</condition>
             </package>
           </packages>
         </osSpecific>
@@ -76,10 +77,12 @@
             <package>
               <name>mysql-community-release</name>
               <skipUpgrade>true</skipUpgrade>
+              <condition>should_install_mysql</condition>
             </package>
             <package>
               <name>mysql-community-server</name>
               <skipUpgrade>true</skipUpgrade>
+              <condition>should_install_mysql</condition>
             </package>
           </packages>
         </osSpecific>
@@ -89,6 +92,7 @@
             <package>
               <name>mysql-server</name>
               <skipUpgrade>true</skipUpgrade>
+              <condition>should_install_mysql</condition>
             </package>
           </packages>
         </osSpecific>

http://git-wip-us.apache.org/repos/asf/ambari/blob/9f76f601/ambari-server/src/main/resources/stacks/HDP/2.2/services/HBASE/metainfo.xml
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/stacks/HDP/2.2/services/HBASE/metainfo.xml b/ambari-server/src/main/resources/stacks/HDP/2.2/services/HBASE/metainfo.xml
index d80b5d1..e88f073 100644
--- a/ambari-server/src/main/resources/stacks/HDP/2.2/services/HBASE/metainfo.xml
+++ b/ambari-server/src/main/resources/stacks/HDP/2.2/services/HBASE/metainfo.xml
@@ -32,6 +32,7 @@
             </package>
             <package>
               <name>phoenix_${stack_version}</name>
+              <condition>should_install_phoenix</condition>
             </package>
           </packages>
         </osSpecific>
@@ -43,6 +44,7 @@
             </package>
             <package>
               <name>phoenix-${stack_version}</name>
+              <condition>should_install_phoenix</condition>
             </package>
           </packages>
         </osSpecific>

http://git-wip-us.apache.org/repos/asf/ambari/blob/9f76f601/ambari-server/src/main/resources/stacks/HDP/2.2/services/HDFS/metainfo.xml
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/stacks/HDP/2.2/services/HDFS/metainfo.xml b/ambari-server/src/main/resources/stacks/HDP/2.2/services/HDFS/metainfo.xml
index ca4b5c5..0c98a72 100644
--- a/ambari-server/src/main/resources/stacks/HDP/2.2/services/HDFS/metainfo.xml
+++ b/ambari-server/src/main/resources/stacks/HDP/2.2/services/HDFS/metainfo.xml
@@ -39,9 +39,11 @@
             <package>
               <name>lzo</name>
               <skipUpgrade>true</skipUpgrade>
+              <condition>should_install_lzo</condition>
             </package>
             <package>
               <name>hadooplzo_${stack_version}</name>
+              <condition>should_install_lzo</condition>
             </package>
             <package>
               <name>hadoop_${stack_version}-libhdfs</name>
@@ -78,10 +80,12 @@
             </package>
             <package>
               <name>hadooplzo-${stack_version}</name>
+              <condition>should_install_lzo</condition>
             </package>
             <package>
               <name>liblzo2-2</name>
               <skipUpgrade>true</skipUpgrade>
+              <condition>should_install_lzo</condition>
             </package>
             <package>
               <name>libhdfs0-${stack_version}</name>

http://git-wip-us.apache.org/repos/asf/ambari/blob/9f76f601/ambari-server/src/main/resources/stacks/HDP/2.2/services/HIVE/metainfo.xml
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/stacks/HDP/2.2/services/HIVE/metainfo.xml b/ambari-server/src/main/resources/stacks/HDP/2.2/services/HIVE/metainfo.xml
index ba87d8e..11921a6 100644
--- a/ambari-server/src/main/resources/stacks/HDP/2.2/services/HIVE/metainfo.xml
+++ b/ambari-server/src/main/resources/stacks/HDP/2.2/services/HIVE/metainfo.xml
@@ -63,6 +63,7 @@
             <package>
               <name>mysql-connector-java</name>
               <skipUpgrade>true</skipUpgrade>
+              <condition>should_install_mysl_connector</condition>
             </package>
           </packages>
         </osSpecific>
@@ -95,10 +96,12 @@
             <package>
               <name>mysql-community-release</name>
               <skipUpgrade>true</skipUpgrade>
+              <condition>should_install_mysql</condition>
             </package>
             <package>
               <name>mysql-community-server</name>
               <skipUpgrade>true</skipUpgrade>
+              <condition>should_install_mysql</condition>
             </package>
           </packages>
         </osSpecific>
@@ -122,6 +125,7 @@
             <package>
               <name>mysql-server</name>
               <skipUpgrade>true</skipUpgrade>
+              <condition>should_install_mysql</condition>
             </package>
           </packages>
         </osSpecific>
@@ -131,6 +135,7 @@
             <package>
               <name>mysql-client</name>
               <skipUpgrade>true</skipUpgrade>
+              <condition>should_install_mysql</condition>
             </package>
           </packages>
         </osSpecific>

http://git-wip-us.apache.org/repos/asf/ambari/blob/9f76f601/ambari-server/src/main/resources/stacks/HDP/2.2/services/OOZIE/metainfo.xml
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/stacks/HDP/2.2/services/OOZIE/metainfo.xml b/ambari-server/src/main/resources/stacks/HDP/2.2/services/OOZIE/metainfo.xml
index d5db93c..b5682e4 100644
--- a/ambari-server/src/main/resources/stacks/HDP/2.2/services/OOZIE/metainfo.xml
+++ b/ambari-server/src/main/resources/stacks/HDP/2.2/services/OOZIE/metainfo.xml
@@ -67,6 +67,7 @@
             <package>
               <name>mysql-connector-java</name>
               <skipUpgrade>true</skipUpgrade>
+              <condition>should_install_mysl_connector</condition>
             </package>
             <package>
               <name>extjs</name>

http://git-wip-us.apache.org/repos/asf/ambari/blob/9f76f601/ambari-server/src/main/resources/stacks/HDP/2.2/services/SQOOP/metainfo.xml
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/stacks/HDP/2.2/services/SQOOP/metainfo.xml b/ambari-server/src/main/resources/stacks/HDP/2.2/services/SQOOP/metainfo.xml
index eaa4051..d408f38 100644
--- a/ambari-server/src/main/resources/stacks/HDP/2.2/services/SQOOP/metainfo.xml
+++ b/ambari-server/src/main/resources/stacks/HDP/2.2/services/SQOOP/metainfo.xml
@@ -28,6 +28,7 @@
             <package>
               <name>mysql-connector-java</name>
               <skipUpgrade>true</skipUpgrade>
+              <condition>should_install_mysl_connector</condition>
             </package>
           </packages>
         </osSpecific>

http://git-wip-us.apache.org/repos/asf/ambari/blob/9f76f601/ambari-server/src/main/resources/stacks/HDP/2.3/services/HDFS/metainfo.xml
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/stacks/HDP/2.3/services/HDFS/metainfo.xml b/ambari-server/src/main/resources/stacks/HDP/2.3/services/HDFS/metainfo.xml
index cb0062f..ac6ddaf 100644
--- a/ambari-server/src/main/resources/stacks/HDP/2.3/services/HDFS/metainfo.xml
+++ b/ambari-server/src/main/resources/stacks/HDP/2.3/services/HDFS/metainfo.xml
@@ -70,9 +70,11 @@
             <package>
               <name>lzo</name>
               <skipUpgrade>true</skipUpgrade>
+              <condition>should_install_lzo</condition>
             </package>
             <package>
               <name>hadooplzo_${stack_version}</name>
+              <condition>should_install_lzo</condition>
             </package>
             <package>
               <name>hadoop_${stack_version}-libhdfs</name>
@@ -109,6 +111,7 @@
             </package>
             <package>
               <name>hadooplzo-${stack_version}</name>
+              <condition>should_install_lzo</condition>
             </package>
             <package>
               <name>libhdfs0-${stack_version}</name>

http://git-wip-us.apache.org/repos/asf/ambari/blob/9f76f601/ambari-server/src/main/resources/stacks/HDP/2.3/services/HIVE/metainfo.xml
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/stacks/HDP/2.3/services/HIVE/metainfo.xml b/ambari-server/src/main/resources/stacks/HDP/2.3/services/HIVE/metainfo.xml
index f184741..fcbb02e 100644
--- a/ambari-server/src/main/resources/stacks/HDP/2.3/services/HIVE/metainfo.xml
+++ b/ambari-server/src/main/resources/stacks/HDP/2.3/services/HIVE/metainfo.xml
@@ -29,6 +29,7 @@
             <package>
               <name>mysql-connector-java</name>
               <skipUpgrade>true</skipUpgrade>
+              <condition>should_install_mysl_connector</condition>
             </package>
           </packages>
         </osSpecific>
@@ -46,6 +47,7 @@
             </package>
             <package>
               <name>atlas-metadata_${stack_version}-hive-plugin</name>
+              <condition>should_install_hive_atlas</condition>
             </package>
           </packages>
         </osSpecific>
@@ -55,6 +57,7 @@
             <package>
               <name>mysql</name>
               <skipUpgrade>true</skipUpgrade>
+              <condition>should_install_mysql</condition>
             </package>
           </packages>
         </osSpecific>
@@ -64,10 +67,12 @@
             <package>
               <name>mysql-community-release</name>
               <skipUpgrade>true</skipUpgrade>
+              <condition>should_install_mysql</condition>
             </package>
             <package>
               <name>mysql-community-server</name>
               <skipUpgrade>true</skipUpgrade>
+              <condition>should_install_mysql</condition>
             </package>
           </packages>
         </osSpecific>
@@ -85,6 +90,7 @@
             </package>
             <package>
               <name>atlas-metadata-${stack_version}-hive-plugin</name>
+              <condition>should_install_hive_atlas</condition>
             </package>
           </packages>
         </osSpecific>
@@ -94,6 +100,7 @@
             <package>
               <name>mysql-server</name>
               <skipUpgrade>true</skipUpgrade>
+              <condition>should_install_mysql</condition>
             </package>
           </packages>
         </osSpecific>

http://git-wip-us.apache.org/repos/asf/ambari/blob/9f76f601/ambari-server/src/main/resources/stacks/HDP/2.3/services/OOZIE/metainfo.xml
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/stacks/HDP/2.3/services/OOZIE/metainfo.xml b/ambari-server/src/main/resources/stacks/HDP/2.3/services/OOZIE/metainfo.xml
index 8d1dda1..9b324bb 100644
--- a/ambari-server/src/main/resources/stacks/HDP/2.3/services/OOZIE/metainfo.xml
+++ b/ambari-server/src/main/resources/stacks/HDP/2.3/services/OOZIE/metainfo.xml
@@ -38,6 +38,7 @@
             <package>
               <name>mysql-connector-java</name>
               <skipUpgrade>true</skipUpgrade>
+              <condition>should_install_mysl_connector</condition>
             </package>
             <package>
               <name>extjs</name>

http://git-wip-us.apache.org/repos/asf/ambari/blob/9f76f601/ambari-server/src/test/python/custom_actions/configs/install_packages_config.json
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/python/custom_actions/configs/install_packages_config.json b/ambari-server/src/test/python/custom_actions/configs/install_packages_config.json
index fcd7765..957a3d8 100644
--- a/ambari-server/src/test/python/custom_actions/configs/install_packages_config.json
+++ b/ambari-server/src/test/python/custom_actions/configs/install_packages_config.json
@@ -26,7 +26,7 @@
         "stack_id": "HDP-2.2",
         "repository_version": "2.2.0.1-885",
         "base_urls": "[{\"name\":\"HDP-UTILS\",\"baseUrl\":\"http://repo1/HDP/centos5/2.x/updates/2.2.0.0\",\"repositoryId\":\"HDP-UTILS-1.1.0.20\"},{\"name\":\"HDP\",\"baseUrl\":\"http://repo1/HDP/centos5/2.x/updates/2.2.0.0\",\"repositoryId\":\"HDP-2.2\"}]",
-        "package_list": "[{\"name\":\"hadoop_${stack_version}\"},{\"name\":\"snappy\"},{\"name\":\"snappy-devel\"},{\"name\":\"lzo\"},{\"name\":\"hadooplzo_${stack_version}\"},{\"name\":\"hadoop_${stack_version}-libhdfs\"},{\"name\":\"ambari-log4j\"}]"
+        "package_list": "[{\"name\":\"hadoop_${stack_version}\", \"condition\": \"\"},{\"name\":\"snappy\", \"condition\": \"\"},{\"name\":\"snappy-devel\", \"condition\": \"\"},{\"name\":\"lzo\", \"condition\": \"\"},{\"name\":\"hadooplzo_${stack_version}\", \"condition\": \"\"},{\"name\":\"hadoop_${stack_version}-libhdfs\", \"condition\": \"\"},{\"name\":\"ambari-log4j\", \"condition\": \"\"}]"
     }, 
     "serviceName": "null", 
     "role": "install_packages", 
@@ -44,7 +44,7 @@
         "script_type": "PYTHON",
         "repository_version": "2.2.0.1-885",
         "base_urls": "[{\"name\":\"HDP-UTILS\",\"baseUrl\":\"http://repo1/HDP/centos5/2.x/updates/2.2.0.0\",\"repositoryId\":\"HDP-UTILS-1.1.0.20\"},{\"name\":\"HDP\",\"baseUrl\":\"http://repo1/HDP/centos5/2.x/updates/2.2.0.0\",\"repositoryId\":\"HDP-2.2\"}]",
-        "package_list": "[{\"name\":\"hadoop_${stack_version}\"},{\"name\":\"snappy\"},{\"name\":\"snappy-devel\"},{\"name\":\"lzo\"},{\"name\":\"hadooplzo_${stack_version}\"},{\"name\":\"hadoop_${stack_version}-libhdfs\"},{\"name\":\"ambari-log4j\"}]",
+        "package_list": "[{\"name\":\"hadoop_${stack_version}\", \"condition\": \"\"},{\"name\":\"snappy\", \"condition\": \"\"},{\"name\":\"snappy-devel\", \"condition\": \"\"},{\"name\":\"lzo\", \"condition\": \"\"},{\"name\":\"hadooplzo_${stack_version}\", \"condition\": \"\"},{\"name\":\"hadoop_${stack_version}-libhdfs\", \"condition\": \"\"},{\"name\":\"ambari-log4j\", \"condition\": \"\"}]",
         "script": "install_packages.py"
     }, 
     "commandId": "14-1", 

http://git-wip-us.apache.org/repos/asf/ambari/blob/9f76f601/ambari-server/src/test/python/stacks/2.0.6/configs/hbase_no_phx.json
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/python/stacks/2.0.6/configs/hbase_no_phx.json b/ambari-server/src/test/python/stacks/2.0.6/configs/hbase_no_phx.json
index e2e9965..1c2f04d 100644
--- a/ambari-server/src/test/python/stacks/2.0.6/configs/hbase_no_phx.json
+++ b/ambari-server/src/test/python/stacks/2.0.6/configs/hbase_no_phx.json
@@ -16,7 +16,7 @@
         "java_home": "/usr/jdk64/jdk1.7.0_45",
         "java_version": "8",
         "host_sys_prepped": "false",
-        "package_list": "[{\"name\":\"hbase_2_3_*\",\"skipUpgrade\":false},{\"name\":\"phoenix_2_3_*\",\"skipUpgrade\":false}]",
+        "package_list": "[{\"name\":\"hbase_2_3_*\",\"condition\":\"\",\"skipUpgrade\":false},{\"name\":\"phoenix_*\",\"condition\":\"{{has_phoenix or phoenix_enabled}}\",\"skipUpgrade\":false}]",
         "db_name": "ambari",
         "group_list": "[\"hadoop\",\"nobody\",\"users\"]",
         "user_list": "[\"hive\",\"oozie\",\"nobody\",\"ambari-qa\",\"flume\",\"hdfs\",\"storm\",\"mapred\",\"hbase\",\"tez\",\"zookeeper\",\"falcon\",\"sqoop\",\"yarn\",\"hcat\"]"

http://git-wip-us.apache.org/repos/asf/ambari/blob/9f76f601/ambari-server/src/test/python/stacks/2.0.6/configs/hbase_with_phx.json
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/python/stacks/2.0.6/configs/hbase_with_phx.json b/ambari-server/src/test/python/stacks/2.0.6/configs/hbase_with_phx.json
index 1a3b217..78131b1 100644
--- a/ambari-server/src/test/python/stacks/2.0.6/configs/hbase_with_phx.json
+++ b/ambari-server/src/test/python/stacks/2.0.6/configs/hbase_with_phx.json
@@ -16,7 +16,7 @@
         "java_home": "/usr/jdk64/jdk1.7.0_45",
         "java_version": "8",
         "host_sys_prepped": "false",
-        "package_list": "[{\"name\":\"hbase_2_3_*\",\"skipUpgrade\":false},{\"name\":\"phoenix_2_3_*\",\"skipUpgrade\":false}]",
+        "package_list": "[{\"name\":\"hbase_2_3_*\",\"condition\":\"\",\"skipUpgrade\":false},{\"name\":\"phoenix_2_3_*\",\"condition\":\"{{has_phoenix or phoenix_enabled}}\",\"skipUpgrade\":false}]",
         "db_name": "ambari",
         "group_list": "[\"hadoop\",\"nobody\",\"users\"]",
         "user_list": "[\"hive\",\"oozie\",\"nobody\",\"ambari-qa\",\"flume\",\"hdfs\",\"storm\",\"mapred\",\"hbase\",\"tez\",\"zookeeper\",\"falcon\",\"sqoop\",\"yarn\",\"hcat\"]"

http://git-wip-us.apache.org/repos/asf/ambari/blob/9f76f601/ambari-server/src/test/python/stacks/2.3/configs/pxf_default.json
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/python/stacks/2.3/configs/pxf_default.json b/ambari-server/src/test/python/stacks/2.3/configs/pxf_default.json
index a042dfd..ba06162 100644
--- a/ambari-server/src/test/python/stacks/2.3/configs/pxf_default.json
+++ b/ambari-server/src/test/python/stacks/2.3/configs/pxf_default.json
@@ -14,7 +14,7 @@
         "ambari_db_rca_username": "mapred",
         "java_home": "/usr/jdk64/jdk1.7.0_45",
         "db_name": "ambari",
-        "package_list": "[{\"name\":\"pxf-service\",\"skipUpgrade\":false},{\"name\":\"apache-tomcat\",\"skipUpgrade\":false},{\"name\":\"pxf-hive\",\"skipUpgrade\":false},{\"name\":\"pxf-hdfs\",\"skipUpgrade\":false},{\"name\":\"pxf-hbase\",\"skipUpgrade\":false}]"
+        "package_list": "[{\"name\":\"pxf-service\",\"skipUpgrade\":false, \"condition\": \"\"},{\"name\":\"apache-tomcat\",\"skipUpgrade\":false, \"condition\": \"\"},{\"name\":\"pxf-hive\",\"skipUpgrade\":false, \"condition\": \"\"},{\"name\":\"pxf-hdfs\",\"skipUpgrade\":false, \"condition\": \"\"},{\"name\":\"pxf-hbase\",\"skipUpgrade\":false, \"condition\": \"\"}]"
     },
     "commandType": "EXECUTION_COMMAND",
     "roleParams": {},


[13/22] ambari git commit: AMBARI-14740. Add params to alert definitions during ambari upgrade.(vbrodetskyi)

Posted by nc...@apache.org.
AMBARI-14740. Add params to alert definitions during ambari upgrade.(vbrodetskyi)


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

Branch: refs/heads/branch-dev-patch-upgrade
Commit: a8887eb175afdc0e9340647a83e0f02cddbfdb8b
Parents: 5380fef
Author: Vitaly Brodetskyi <vb...@hortonworks.com>
Authored: Thu Jan 21 09:32:58 2016 +0200
Committer: Vitaly Brodetskyi <vb...@hortonworks.com>
Committed: Thu Jan 21 09:32:58 2016 +0200

----------------------------------------------------------------------
 .../server/upgrade/SchemaUpgradeHelper.java     |   1 +
 .../server/upgrade/UpgradeCatalog240.java       | 298 +++++++++++++++++++
 .../server/upgrade/UpgradeCatalog240Test.java   | 130 ++++++++
 3 files changed, 429 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/a8887eb1/ambari-server/src/main/java/org/apache/ambari/server/upgrade/SchemaUpgradeHelper.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/upgrade/SchemaUpgradeHelper.java b/ambari-server/src/main/java/org/apache/ambari/server/upgrade/SchemaUpgradeHelper.java
index 82aa6ca..a07d42d 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/upgrade/SchemaUpgradeHelper.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/upgrade/SchemaUpgradeHelper.java
@@ -183,6 +183,7 @@ public class SchemaUpgradeHelper {
       catalogBinder.addBinding().to(UpgradeCatalog220.class);
       catalogBinder.addBinding().to(UpgradeCatalog221.class);
       catalogBinder.addBinding().to(UpgradeCatalog230.class);
+      catalogBinder.addBinding().to(UpgradeCatalog240.class);
       catalogBinder.addBinding().to(FinalUpgradeCatalog.class);
 
       EventBusSynchronizer.synchronizeAmbariEventPublisher(binder());

http://git-wip-us.apache.org/repos/asf/ambari/blob/a8887eb1/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog240.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog240.java b/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog240.java
new file mode 100644
index 0000000..1ccea5c
--- /dev/null
+++ b/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog240.java
@@ -0,0 +1,298 @@
+/*
+ * 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.
+ */
+
+package org.apache.ambari.server.upgrade;
+
+import com.google.gson.JsonArray;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+import com.google.gson.JsonPrimitive;
+import com.google.inject.Inject;
+import com.google.inject.Injector;
+import org.apache.ambari.server.AmbariException;
+import org.apache.ambari.server.controller.AmbariManagementController;
+import org.apache.ambari.server.orm.dao.AlertDefinitionDAO;
+import org.apache.ambari.server.orm.dao.DaoUtils;
+import org.apache.ambari.server.orm.entities.AlertDefinitionEntity;
+import org.apache.ambari.server.state.Cluster;
+import org.apache.ambari.server.state.Clusters;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+
+/**
+ * Upgrade catalog for version 2.4.0.
+ */
+public class UpgradeCatalog240 extends AbstractUpgradeCatalog {
+
+  @Inject
+  DaoUtils daoUtils;
+
+  /**
+   * Logger.
+   */
+  private static final Logger LOG = LoggerFactory.getLogger(UpgradeCatalog240.class);
+
+
+
+
+  // ----- Constructors ------------------------------------------------------
+
+  /**
+   * Don't forget to register new UpgradeCatalogs in {@link org.apache.ambari.server.upgrade.SchemaUpgradeHelper.UpgradeHelperModule#configure()}
+   *
+   * @param injector Guice injector to track dependencies and uses bindings to inject them.
+   */
+  @Inject
+  public UpgradeCatalog240(Injector injector) {
+    super(injector);
+    this.injector = injector;
+  }
+
+  // ----- UpgradeCatalog ----------------------------------------------------
+
+  /**
+   * {@inheritDoc}
+   */
+  @Override
+  public String getTargetVersion() {
+    return "2.4.0";
+  }
+
+  // ----- AbstractUpgradeCatalog --------------------------------------------
+
+  /**
+   * {@inheritDoc}
+   */
+  @Override
+  public String getSourceVersion() {
+    return "2.3.0";
+  }
+
+
+  @Override
+  protected void executeDDLUpdates() throws AmbariException, SQLException {
+    //To change body of implemented methods use File | Settings | File Templates.
+  }
+
+  @Override
+  protected void executePreDMLUpdates() throws AmbariException, SQLException {
+    //To change body of implemented methods use File | Settings | File Templates.
+  }
+
+  @Override
+  protected void executeDMLUpdates() throws AmbariException, SQLException {
+    addNewConfigurationsFromXml();
+    updateAlerts();
+
+  }
+
+  protected void updateAlerts() {
+    LOG.info("Updating alert definitions.");
+    AmbariManagementController ambariManagementController = injector.getInstance(AmbariManagementController.class);
+    AlertDefinitionDAO alertDefinitionDAO = injector.getInstance(AlertDefinitionDAO.class);
+    Clusters clusters = ambariManagementController.getClusters();
+
+    Map<String, Cluster> clusterMap = getCheckedClusterMap(clusters);
+    for (final Cluster cluster : clusterMap.values()) {
+      long clusterID = cluster.getClusterId();
+
+      final AlertDefinitionEntity namenodeLastCheckpointAlertDefinitionEntity = alertDefinitionDAO.findByName(
+              clusterID, "namenode_last_checkpoint");
+      final AlertDefinitionEntity namenodeHAHealthAlertDefinitionEntity = alertDefinitionDAO.findByName(
+              clusterID, "namenode_ha_health");
+      final AlertDefinitionEntity nodemanagerHealthAlertDefinitionEntity = alertDefinitionDAO.findByName(
+              clusterID, "yarn_nodemanager_health");
+      final AlertDefinitionEntity nodemanagerHealthSummaryAlertDefinitionEntity = alertDefinitionDAO.findByName(
+              clusterID, "nodemanager_health_summary");
+      final AlertDefinitionEntity hiveMetastoreProcessAlertDefinitionEntity = alertDefinitionDAO.findByName(
+              clusterID, "hive_metastore_process");
+      final AlertDefinitionEntity hiveServerProcessAlertDefinitionEntity = alertDefinitionDAO.findByName(
+              clusterID, "hive_server_process");
+      final AlertDefinitionEntity hiveWebhcatServerStatusAlertDefinitionEntity = alertDefinitionDAO.findByName(
+              clusterID, "hive_webhcat_server_status");
+      final AlertDefinitionEntity flumeAgentStatusAlertDefinitionEntity = alertDefinitionDAO.findByName(
+              clusterID, "flume_agent_status");
+
+      Map<AlertDefinitionEntity, List<String>> alertDefinitionParams = new HashMap<>();
+      alertDefinitionParams.put(namenodeLastCheckpointAlertDefinitionEntity,
+              new ArrayList<String>(Arrays.asList("connection.timeout", "checkpoint.time.warning.threshold", "checkpoint.time.critical.threshold")));
+      alertDefinitionParams.put(namenodeHAHealthAlertDefinitionEntity,
+              new ArrayList<String>(Arrays.asList("connection.timeout")));
+      alertDefinitionParams.put(nodemanagerHealthAlertDefinitionEntity,
+              new ArrayList<String>(Arrays.asList("connection.timeout")));
+      alertDefinitionParams.put(nodemanagerHealthSummaryAlertDefinitionEntity,
+              new ArrayList<String>(Arrays.asList("connection.timeout")));
+      alertDefinitionParams.put(hiveMetastoreProcessAlertDefinitionEntity,
+              new ArrayList<String>(Arrays.asList("default.smoke.user", "default.smoke.principal", "default.smoke.keytab")));
+      alertDefinitionParams.put(hiveServerProcessAlertDefinitionEntity,
+              new ArrayList<String>(Arrays.asList("default.smoke.user", "default.smoke.principal", "default.smoke.keytab")));
+      alertDefinitionParams.put(hiveWebhcatServerStatusAlertDefinitionEntity,
+              new ArrayList<String>(Arrays.asList("default.smoke.user", "connection.timeout")));
+      alertDefinitionParams.put(flumeAgentStatusAlertDefinitionEntity,
+              new ArrayList<String>(Arrays.asList("run.directory")));
+
+      for(Map.Entry<AlertDefinitionEntity, List<String>> entry : alertDefinitionParams.entrySet()){
+        AlertDefinitionEntity alertDefinition = entry.getKey();
+        String source = alertDefinition.getSource();
+
+        alertDefinition.setSource(addParam(source, entry.getValue()));
+        alertDefinition.setHash(UUID.randomUUID().toString());
+
+        alertDefinitionDAO.merge(alertDefinition);
+      }
+
+    }
+  }
+
+  protected String addParam(String source, List<String> params) {
+    JsonObject sourceJson = new JsonParser().parse(source).getAsJsonObject();
+    JsonArray parametersJson = sourceJson.getAsJsonArray("parameters");
+
+    boolean parameterExists = parametersJson != null && !parametersJson.isJsonNull();
+
+    if (parameterExists) {
+      Iterator<JsonElement> jsonElementIterator = parametersJson.iterator();
+      while(jsonElementIterator.hasNext()) {
+        JsonElement element = jsonElementIterator.next();
+        JsonElement name = element.getAsJsonObject().get("name");
+        if (name != null && !name.isJsonNull() && params.contains(name.getAsString())) {
+          params.remove(name.getAsString());
+        }
+      }
+      if (params.size() == 0) {
+        return sourceJson.toString();
+      }
+    }
+
+    List<JsonObject> paramsToAdd = new ArrayList<>();
+
+    if (params.contains("connection.timeout")) {
+      JsonObject param = new JsonObject();
+      param.add("name", new JsonPrimitive("connection.timeout"));
+      param.add("display_name", new JsonPrimitive("Connection Timeout"));
+      param.add("value", new JsonPrimitive(5.0));
+      param.add("type", new JsonPrimitive("NUMERIC"));
+      param.add("description", new JsonPrimitive("The maximum time before this alert is considered to be CRITICAL"));
+      param.add("units", new JsonPrimitive("seconds"));
+      param.add("threshold", new JsonPrimitive("CRITICAL"));
+
+      paramsToAdd.add(param);
+
+    }
+    if (params.contains("checkpoint.time.warning.threshold")) {
+      JsonObject param = new JsonObject();
+      param.add("name", new JsonPrimitive("checkpoint.time.warning.threshold"));
+      param.add("display_name", new JsonPrimitive("Checkpoint Warning"));
+      param.add("value", new JsonPrimitive(2.0));
+      param.add("type", new JsonPrimitive("PERCENT"));
+      param.add("description", new JsonPrimitive("The percentage of the last checkpoint time greater than the interval in order to trigger a warning alert."));
+      param.add("units", new JsonPrimitive("%"));
+      param.add("threshold", new JsonPrimitive("WARNING"));
+
+      paramsToAdd.add(param);
+
+    }
+    if (params.contains("checkpoint.time.critical.threshold")) {
+      JsonObject param = new JsonObject();
+      param.add("name", new JsonPrimitive("checkpoint.time.critical.threshold"));
+      param.add("display_name", new JsonPrimitive("Checkpoint Critical"));
+      param.add("value", new JsonPrimitive(2.0));
+      param.add("type", new JsonPrimitive("PERCENT"));
+      param.add("description", new JsonPrimitive("The percentage of the last checkpoint time greater than the interval in order to trigger a critical alert."));
+      param.add("units", new JsonPrimitive("%"));
+      param.add("threshold", new JsonPrimitive("CRITICAL"));
+
+      paramsToAdd.add(param);
+
+    }
+    if (params.contains("default.smoke.user")) {
+      JsonObject param = new JsonObject();
+      param.add("name", new JsonPrimitive("default.smoke.user"));
+      param.add("display_name", new JsonPrimitive("Default Smoke User"));
+      param.add("value", new JsonPrimitive("ambari-qa"));
+      param.add("type", new JsonPrimitive("STRING"));
+      param.add("description", new JsonPrimitive("The user that will run the Hive commands if not specified in cluster-env/smokeuser"));
+
+      paramsToAdd.add(param);
+
+    }
+    if (params.contains("default.smoke.principal")) {
+      JsonObject param = new JsonObject();
+      param.add("name", new JsonPrimitive("default.smoke.principal"));
+      param.add("display_name", new JsonPrimitive("Default Smoke Principal"));
+      param.add("value", new JsonPrimitive("ambari-qa@EXAMPLE.COM"));
+      param.add("type", new JsonPrimitive("STRING"));
+      param.add("description", new JsonPrimitive("The principal to use when retrieving the kerberos ticket if not specified in cluster-env/smokeuser_principal_name"));
+
+      paramsToAdd.add(param);
+
+    }
+    if (params.contains("default.smoke.keytab")) {
+      JsonObject param = new JsonObject();
+      param.add("name", new JsonPrimitive("default.smoke.keytab"));
+      param.add("display_name", new JsonPrimitive("Default Smoke Keytab"));
+      param.add("value", new JsonPrimitive("/etc/security/keytabs/smokeuser.headless.keytab"));
+      param.add("type", new JsonPrimitive("STRING"));
+      param.add("description", new JsonPrimitive("The keytab to use when retrieving the kerberos ticket if not specified in cluster-env/smokeuser_keytab"));
+
+      paramsToAdd.add(param);
+
+    }
+    if (params.contains("run.directory")) {
+      JsonObject param = new JsonObject();
+      param.add("name", new JsonPrimitive("run.directory"));
+      param.add("display_name", new JsonPrimitive("Run Directory"));
+      param.add("value", new JsonPrimitive("/var/run/flume"));
+      param.add("type", new JsonPrimitive("STRING"));
+      param.add("description", new JsonPrimitive("The directory where flume agent processes will place their PID files."));
+
+      paramsToAdd.add(param);
+
+    }
+
+
+    if (!parameterExists) {
+      parametersJson = new JsonArray();
+      for (JsonObject param : paramsToAdd) {
+        parametersJson.add(param);
+      }
+      sourceJson.add("parameters", parametersJson);
+    } else {
+      for (JsonObject param : paramsToAdd) {
+        parametersJson.add(param);
+      }
+      sourceJson.remove("parameters");
+      sourceJson.add("parameters", parametersJson);
+    }
+
+    return sourceJson.toString();
+  }
+
+
+
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/a8887eb1/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog240Test.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog240Test.java b/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog240Test.java
new file mode 100644
index 0000000..d1d68f2
--- /dev/null
+++ b/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog240Test.java
@@ -0,0 +1,130 @@
+/*
+ * 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.
+ */
+
+package org.apache.ambari.server.upgrade;
+
+
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+import com.google.inject.Provider;
+import com.google.inject.persist.PersistService;
+import junit.framework.Assert;
+import org.apache.ambari.server.api.services.AmbariMetaInfo;
+import org.apache.ambari.server.orm.GuiceJpaInitializer;
+import org.apache.ambari.server.orm.InMemoryDefaultTestModule;
+import org.apache.ambari.server.orm.dao.StackDAO;
+import org.apache.ambari.server.orm.entities.StackEntity;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import javax.persistence.EntityManager;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import static org.easymock.EasyMock.createMockBuilder;
+import static org.easymock.EasyMock.createNiceMock;
+import static org.easymock.EasyMock.createStrictMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.expectLastCall;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.reset;
+import static org.easymock.EasyMock.verify;
+
+public class UpgradeCatalog240Test {
+  private Injector injector;
+  private Provider<EntityManager> entityManagerProvider = createStrictMock(Provider.class);
+  private EntityManager entityManager = createNiceMock(EntityManager.class);
+  private UpgradeCatalogHelper upgradeCatalogHelper;
+  private StackEntity desiredStackEntity;
+
+
+
+  @Before
+  public void init() {
+    reset(entityManagerProvider);
+    expect(entityManagerProvider.get()).andReturn(entityManager).anyTimes();
+    replay(entityManagerProvider);
+    injector = Guice.createInjector(new InMemoryDefaultTestModule());
+    injector.getInstance(GuiceJpaInitializer.class);
+
+    upgradeCatalogHelper = injector.getInstance(UpgradeCatalogHelper.class);
+    // inject AmbariMetaInfo to ensure that stacks get populated in the DB
+    injector.getInstance(AmbariMetaInfo.class);
+    // load the stack entity
+    StackDAO stackDAO = injector.getInstance(StackDAO.class);
+    desiredStackEntity = stackDAO.find("HDP", "2.2.0");
+  }
+
+  @After
+  public void tearDown() {
+    injector.getInstance(PersistService.class).stop();
+  }
+
+  @Test
+  public void testExecuteDMLUpdates() throws Exception {
+    Method addNewConfigurationsFromXml = AbstractUpgradeCatalog.class.getDeclaredMethod("addNewConfigurationsFromXml");
+    Method updateAlerts = UpgradeCatalog240.class.getDeclaredMethod("updateAlerts");
+
+
+
+    UpgradeCatalog240 upgradeCatalog240 = createMockBuilder(UpgradeCatalog240.class)
+            .addMockedMethod(addNewConfigurationsFromXml)
+            .addMockedMethod(updateAlerts)
+            .createMock();
+
+    upgradeCatalog240.addNewConfigurationsFromXml();
+    expectLastCall().once();
+    upgradeCatalog240.updateAlerts();
+    expectLastCall().once();
+
+
+    replay(upgradeCatalog240);
+
+    upgradeCatalog240.executeDMLUpdates();
+
+    verify(upgradeCatalog240);
+  }
+
+  @Test
+  public void test_addParam_ParamsNotAvailable() {
+
+    UpgradeCatalog240 upgradeCatalog240 = new UpgradeCatalog240(injector);
+    String inputSource = "{ \"path\" : \"test_path\", \"type\" : \"SCRIPT\"}";
+    List<String> params = Arrays.asList("connection.timeout", "checkpoint.time.warning.threshold", "checkpoint.time.critical.threshold");
+    String expectedSource = "{\"path\":\"test_path\",\"type\":\"SCRIPT\",\"parameters\":[{\"name\":\"connection.timeout\",\"display_name\":\"Connection Timeout\",\"value\":5.0,\"type\":\"NUMERIC\",\"description\":\"The maximum time before this alert is considered to be CRITICAL\",\"units\":\"seconds\",\"threshold\":\"CRITICAL\"},{\"name\":\"checkpoint.time.warning.threshold\",\"display_name\":\"Checkpoint Warning\",\"value\":2.0,\"type\":\"PERCENT\",\"description\":\"The percentage of the last checkpoint time greater than the interval in order to trigger a warning alert.\",\"units\":\"%\",\"threshold\":\"WARNING\"},{\"name\":\"checkpoint.time.critical.threshold\",\"display_name\":\"Checkpoint Critical\",\"value\":2.0,\"type\":\"PERCENT\",\"description\":\"The percentage of the last checkpoint time greater than the interval in order to trigger a critical alert.\",\"units\":\"%\",\"threshold\":\"CRITICAL\"}]}";
+
+    String result = upgradeCatalog240.addParam(inputSource, params);
+    Assert.assertEquals(result, expectedSource);
+  }
+
+  @Test
+  public void test_addParam_ParamsAvailableWithOneOFNeededItem() {
+
+    UpgradeCatalog240 upgradeCatalog240 = new UpgradeCatalog240(injector);
+    String inputSource = "{\"path\":\"test_path\",\"type\":\"SCRIPT\",\"parameters\":[{\"name\":\"connection.timeout\",\"display_name\":\"Connection Timeout\",\"value\":5.0,\"type\":\"NUMERIC\",\"description\":\"The maximum time before this alert is considered to be CRITICAL\",\"units\":\"seconds\",\"threshold\":\"CRITICAL\"}]}";
+    List<String> params = new ArrayList<String>(Arrays.asList("connection.timeout", "checkpoint.time.warning.threshold", "checkpoint.time.critical.threshold"));
+    String expectedSource = "{\"path\":\"test_path\",\"type\":\"SCRIPT\",\"parameters\":[{\"name\":\"connection.timeout\",\"display_name\":\"Connection Timeout\",\"value\":5.0,\"type\":\"NUMERIC\",\"description\":\"The maximum time before this alert is considered to be CRITICAL\",\"units\":\"seconds\",\"threshold\":\"CRITICAL\"},{\"name\":\"checkpoint.time.warning.threshold\",\"display_name\":\"Checkpoint Warning\",\"value\":2.0,\"type\":\"PERCENT\",\"description\":\"The percentage of the last checkpoint time greater than the interval in order to trigger a warning alert.\",\"units\":\"%\",\"threshold\":\"WARNING\"},{\"name\":\"checkpoint.time.critical.threshold\",\"display_name\":\"Checkpoint Critical\",\"value\":2.0,\"type\":\"PERCENT\",\"description\":\"The percentage of the last checkpoint time greater than the interval in order to trigger a critical alert.\",\"units\":\"%\",\"threshold\":\"CRITICAL\"}]}";
+
+    String result = upgradeCatalog240.addParam(inputSource, params);
+    Assert.assertEquals(result, expectedSource);
+  }
+
+}


[18/22] ambari git commit: AMBARI-14739. Capture package requirements that are optional and config dependent (aonishuk)

Posted by nc...@apache.org.
AMBARI-14739. Capture package requirements that are optional and config dependent (aonishuk)


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

Branch: refs/heads/branch-dev-patch-upgrade
Commit: 59ed986cfdab8632e610a7eff9271009b011151d
Parents: 1217a56
Author: Andrew Onishuk <ao...@hortonworks.com>
Authored: Thu Jan 21 19:39:06 2016 +0200
Committer: Andrew Onishuk <ao...@hortonworks.com>
Committed: Thu Jan 21 19:39:06 2016 +0200

----------------------------------------------------------------------
 .../src/test/python/stacks/2.0.6/configs/hbase_no_phx.json         | 2 +-
 .../src/test/python/stacks/2.0.6/configs/hbase_with_phx.json       | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/59ed986c/ambari-server/src/test/python/stacks/2.0.6/configs/hbase_no_phx.json
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/python/stacks/2.0.6/configs/hbase_no_phx.json b/ambari-server/src/test/python/stacks/2.0.6/configs/hbase_no_phx.json
index 1c2f04d..8d3b60b 100644
--- a/ambari-server/src/test/python/stacks/2.0.6/configs/hbase_no_phx.json
+++ b/ambari-server/src/test/python/stacks/2.0.6/configs/hbase_no_phx.json
@@ -16,7 +16,7 @@
         "java_home": "/usr/jdk64/jdk1.7.0_45",
         "java_version": "8",
         "host_sys_prepped": "false",
-        "package_list": "[{\"name\":\"hbase_2_3_*\",\"condition\":\"\",\"skipUpgrade\":false},{\"name\":\"phoenix_*\",\"condition\":\"{{has_phoenix or phoenix_enabled}}\",\"skipUpgrade\":false}]",
+        "package_list": "[{\"name\":\"hbase_2_3_*\",\"condition\":\"\",\"skipUpgrade\":false},{\"name\":\"phoenix_*\",\"condition\":\"should_install_phoenix\",\"skipUpgrade\":false}]",
         "db_name": "ambari",
         "group_list": "[\"hadoop\",\"nobody\",\"users\"]",
         "user_list": "[\"hive\",\"oozie\",\"nobody\",\"ambari-qa\",\"flume\",\"hdfs\",\"storm\",\"mapred\",\"hbase\",\"tez\",\"zookeeper\",\"falcon\",\"sqoop\",\"yarn\",\"hcat\"]"

http://git-wip-us.apache.org/repos/asf/ambari/blob/59ed986c/ambari-server/src/test/python/stacks/2.0.6/configs/hbase_with_phx.json
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/python/stacks/2.0.6/configs/hbase_with_phx.json b/ambari-server/src/test/python/stacks/2.0.6/configs/hbase_with_phx.json
index 78131b1..84db160 100644
--- a/ambari-server/src/test/python/stacks/2.0.6/configs/hbase_with_phx.json
+++ b/ambari-server/src/test/python/stacks/2.0.6/configs/hbase_with_phx.json
@@ -16,7 +16,7 @@
         "java_home": "/usr/jdk64/jdk1.7.0_45",
         "java_version": "8",
         "host_sys_prepped": "false",
-        "package_list": "[{\"name\":\"hbase_2_3_*\",\"condition\":\"\",\"skipUpgrade\":false},{\"name\":\"phoenix_2_3_*\",\"condition\":\"{{has_phoenix or phoenix_enabled}}\",\"skipUpgrade\":false}]",
+        "package_list": "[{\"name\":\"hbase_2_3_*\",\"condition\":\"\",\"skipUpgrade\":false},{\"name\":\"phoenix_2_3_*\",\"condition\":\"should_install_phoenix\",\"skipUpgrade\":false}]",
         "db_name": "ambari",
         "group_list": "[\"hadoop\",\"nobody\",\"users\"]",
         "user_list": "[\"hive\",\"oozie\",\"nobody\",\"ambari-qa\",\"flume\",\"hdfs\",\"storm\",\"mapred\",\"hbase\",\"tez\",\"zookeeper\",\"falcon\",\"sqoop\",\"yarn\",\"hcat\"]"


[12/22] ambari git commit: AMBARI-14713: Service checks for PXF using HDFS and HBase (nalex via jaoki)

Posted by nc...@apache.org.
AMBARI-14713: Service checks for PXF using HDFS and HBase (nalex via jaoki)


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

Branch: refs/heads/branch-dev-patch-upgrade
Commit: 5380fefdee8c73780d9a40e00e68e53f4d665c9c
Parents: 03a0f9f
Author: Jun Aoki <ja...@apache.org>
Authored: Wed Jan 20 16:01:14 2016 -0800
Committer: Jun Aoki <ja...@apache.org>
Committed: Wed Jan 20 16:01:14 2016 -0800

----------------------------------------------------------------------
 .../common-services/PXF/3.0.0/metainfo.xml      |   6 +
 .../PXF/3.0.0/package/scripts/params.py         |  31 ++-
 .../PXF/3.0.0/package/scripts/pxf_constants.py  |  26 ++
 .../PXF/3.0.0/package/scripts/pxf_utils.py      |  49 ++++
 .../PXF/3.0.0/package/scripts/service_check.py  | 266 +++++++++++++++++++
 5 files changed, 377 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/5380fefd/ambari-server/src/main/resources/common-services/PXF/3.0.0/metainfo.xml
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/common-services/PXF/3.0.0/metainfo.xml b/ambari-server/src/main/resources/common-services/PXF/3.0.0/metainfo.xml
index cb2411c..1797b29 100644
--- a/ambari-server/src/main/resources/common-services/PXF/3.0.0/metainfo.xml
+++ b/ambari-server/src/main/resources/common-services/PXF/3.0.0/metainfo.xml
@@ -66,6 +66,12 @@
         </osSpecific>
       </osSpecifics>
 
+      <commandScript>
+        <script>scripts/service_check.py</script>
+        <scriptType>PYTHON</scriptType>
+        <timeout>300</timeout>
+      </commandScript>
+
       <configuration-dependencies>
         <config-type>pxf-profiles</config-type>
         <config-type>pxf-public-classpath</config-type>

http://git-wip-us.apache.org/repos/asf/ambari/blob/5380fefd/ambari-server/src/main/resources/common-services/PXF/3.0.0/package/scripts/params.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/common-services/PXF/3.0.0/package/scripts/params.py b/ambari-server/src/main/resources/common-services/PXF/3.0.0/package/scripts/params.py
index 1d77787..36dc7c1 100644
--- a/ambari-server/src/main/resources/common-services/PXF/3.0.0/package/scripts/params.py
+++ b/ambari-server/src/main/resources/common-services/PXF/3.0.0/package/scripts/params.py
@@ -16,17 +16,23 @@ See the License for the specific language governing permissions and
 limitations under the License.
 """
 
+import os
+import functools
+
 from resource_management import Script
+from resource_management.libraries.functions.default import default
+from resource_management.libraries.functions import get_kinit_path
+from resource_management.libraries.resources.hdfs_resource import HdfsResource
 
 config = Script.get_config()
 
-
 pxf_service_name = "pxf-service"
 stack_name = str(config["hostLevelParams"]["stack_name"])
 
 # Users and Groups
 pxf_user = "pxf"
 pxf_group = pxf_user
+hdfs_superuser = config['configurations']['hadoop-env']['hdfs_user']
 hdfs_superuser_group = config["configurations"]["hdfs-site"]["dfs.permissions.superusergroup"]
 user_group = config["configurations"]["cluster-env"]["user_group"]
 tomcat_group = "tomcat"
@@ -44,3 +50,26 @@ default_exec_timeout = 600
 # security related
 security_enabled = config['configurations']['cluster-env']['security_enabled']
 realm_name = config['configurations']['kerberos-env']['realm']
+
+#HBase
+is_hbase_installed = default("/clusterHostInfo/hbase_master_hosts", None) is not None
+
+# HDFS
+hdfs_site = config['configurations']['hdfs-site']
+default_fs = config['configurations']['core-site']['fs.defaultFS']
+
+security_enabled = config['configurations']['cluster-env']['security_enabled']
+hdfs_user_keytab = config['configurations']['hadoop-env']['hdfs_user_keytab']
+kinit_path_local = get_kinit_path(default('/configurations/kerberos-env/executable_search_paths', None))
+hdfs_principal_name = config['configurations']['hadoop-env']['hdfs_principal_name']
+
+# HDFSResource partial function
+HdfsResource = functools.partial(HdfsResource,
+    user=hdfs_superuser,
+    security_enabled=security_enabled,
+    keytab=hdfs_user_keytab,
+    kinit_path_local=kinit_path_local,
+    principal_name=hdfs_principal_name,
+    hdfs_site=hdfs_site,
+    default_fs=default_fs)
+

http://git-wip-us.apache.org/repos/asf/ambari/blob/5380fefd/ambari-server/src/main/resources/common-services/PXF/3.0.0/package/scripts/pxf_constants.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/common-services/PXF/3.0.0/package/scripts/pxf_constants.py b/ambari-server/src/main/resources/common-services/PXF/3.0.0/package/scripts/pxf_constants.py
new file mode 100644
index 0000000..3138379
--- /dev/null
+++ b/ambari-server/src/main/resources/common-services/PXF/3.0.0/package/scripts/pxf_constants.py
@@ -0,0 +1,26 @@
+"""
+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.
+"""
+
+PXF_PORT = 51200
+
+# Service Check params 
+service_check_hostname = "localhost"
+pxf_hdfs_test_dir = "/pxf_hdfs_smoke_test"
+pxf_hdfs_read_test_file = pxf_hdfs_test_dir + "/pxf_smoke_test_read_data"
+pxf_hdfs_write_test_file = pxf_hdfs_test_dir + "/pxf_smoke_test_write_data"
+pxf_hbase_test_table = "pxf_hbase_smoke_test_table"

http://git-wip-us.apache.org/repos/asf/ambari/blob/5380fefd/ambari-server/src/main/resources/common-services/PXF/3.0.0/package/scripts/pxf_utils.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/common-services/PXF/3.0.0/package/scripts/pxf_utils.py b/ambari-server/src/main/resources/common-services/PXF/3.0.0/package/scripts/pxf_utils.py
new file mode 100644
index 0000000..fe12d9a
--- /dev/null
+++ b/ambari-server/src/main/resources/common-services/PXF/3.0.0/package/scripts/pxf_utils.py
@@ -0,0 +1,49 @@
+"""
+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.
+"""
+from resource_management.core.logger import Logger
+
+import socket
+import urllib2
+import urllib
+import subprocess
+
+def makeHTTPCall(url, header={}, body=None):
+  # timeout in seconds
+  timeout = 10
+  socket.setdefaulttimeout(timeout)
+
+  try:
+    data = None
+    if body:
+      data = urllib.urlencode(body)
+    req = urllib2.Request(url, data, header)
+
+    response = urllib2.urlopen(req)
+    responseContent = response.read()
+    return responseContent
+  except urllib2.URLError as e:
+    if hasattr(e, 'reason'):
+      Logger.error( 'Reason' + str(e.reason))
+    if hasattr(e, 'code'):
+      Logger.error('Error code: ' + str(e.code))
+    raise e
+    
+
+def runLocalCmd(cmd):
+  return subprocess.call(cmd, shell=True)  
+

http://git-wip-us.apache.org/repos/asf/ambari/blob/5380fefd/ambari-server/src/main/resources/common-services/PXF/3.0.0/package/scripts/service_check.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/common-services/PXF/3.0.0/package/scripts/service_check.py b/ambari-server/src/main/resources/common-services/PXF/3.0.0/package/scripts/service_check.py
new file mode 100644
index 0000000..72b59e4
--- /dev/null
+++ b/ambari-server/src/main/resources/common-services/PXF/3.0.0/package/scripts/service_check.py
@@ -0,0 +1,266 @@
+"""
+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.
+"""
+from resource_management.libraries.script import Script
+from resource_management.core.exceptions import Fail
+from resource_management.core.logger import Logger
+from resource_management.core.system import System
+from resource_management.core.resources.system import Execute
+
+from pxf_utils import makeHTTPCall, runLocalCmd
+import pxf_constants
+
+import sys
+
+class PXFServiceCheck(Script):
+  """
+  Runs a set of simple PXF tests to verify if the service has been setup correctly
+  """
+  pxf_version = None
+  base_url = "http://" + pxf_constants.service_check_hostname + ":" + str(pxf_constants.PXF_PORT) + "/pxf/"
+  commonPXFHeaders = {
+    "X-GP-SEGMENT-COUNT": "1",
+    "X-GP-URL-PORT": pxf_constants.PXF_PORT,
+    "X-GP-SEGMENT-ID": "-1",
+    "X-GP-HAS-FILTER": "0",
+    "Accept": "application/json",
+    "X-GP-ALIGNMENT": "8",
+    "X-GP-ATTRS": "0",
+    "X-GP-FORMAT": "TEXT",
+    "X-GP-URL-HOST": pxf_constants.service_check_hostname
+  }
+
+
+  def service_check(self, env):
+    Logger.info("Starting PXF service checks..")
+
+    import params
+    self.pxf_version = self.__get_pxf_protocol_version()
+    try:
+      self.cleanup_test_data()
+      self.run_hdfs_tests()
+      if params.is_hbase_installed:
+        self.run_hbase_tests()
+    except:
+      msg = "PXF service check failed"
+      Logger.error(msg)
+      raise Fail(msg)
+    finally:
+      self.cleanup_test_data()
+
+    Logger.info("Service check completed successfully")
+
+
+  def cleanup_test_data(self):
+    """
+    Cleans up the temporary test data generated for service check
+    """
+    Logger.info("Cleaning up PXF smoke check temporary data")
+
+    import params
+    self.__cleanup_hdfs_data()
+    if params.is_hbase_installed:
+      self.__cleanup_hbase_data()
+
+
+  def __get_pxf_protocol_version(self):
+    """
+    Gets the pxf protocol version number
+    """
+    Logger.info("Fetching PXF protocol version")
+    url = self.base_url + "ProtocolVersion"
+    response = makeHTTPCall(url)
+    Logger.info(response)
+    # Sample response: 'PXF protocol version v14'
+    if response:
+      import re
+      # Extract the v14 from the output
+      match =  re.search('.*(v\d*).*', response)
+      if match:
+         return match.group(1)      
+
+    msg = "Unable to determine PXF version"
+    Logger.error(msg)
+    raise Fail(msg)
+
+
+  def run_hdfs_tests(self):
+    """
+    Runs a set of PXF HDFS checks
+    """
+    Logger.info("Running PXF HDFS checks")
+    self.__check_if_client_exists("HDFS")
+    self.__write_hdfs_data()
+    self.__check_pxf_hdfs_read()
+    self.__check_pxf_hdfs_write()
+
+
+  def __write_hdfs_data(self):
+    """
+    Writes some test HDFS data for the tests
+    """
+    Logger.info("Writing temporary HDFS test data")
+    import params
+    params.HdfsResource(pxf_constants.pxf_hdfs_test_dir,
+        type="directory",
+        action="create_on_execute",
+        mode=0777
+        )
+
+    params.HdfsResource(pxf_constants.pxf_hdfs_read_test_file,
+        type="file",
+        source="/etc/passwd",
+        action="create_on_execute"
+        )
+
+ 
+  def __check_pxf_read(self, headers):
+    """
+    Performs a generic PXF read 
+    """
+    url = self.base_url + self.pxf_version + "/Fragmenter/getFragments?path="
+    try:
+      response = makeHTTPCall(url, headers)
+      if not "PXFFragments" in response:
+        Logger.error("Unable to find PXFFragments in the response")
+        raise 
+    except:
+      msg = "PXF data read failed"
+      raise Fail(msg)
+
+
+  def __check_pxf_hdfs_read(self):
+    """
+    Reads the test HDFS data through PXF
+    """
+    Logger.info("Testing PXF HDFS read")
+    headers = { 
+        "X-GP-DATA-DIR": pxf_constants.pxf_hdfs_test_dir,
+        "X-GP-profile": "HdfsTextSimple",
+        }
+    headers.update(self.commonPXFHeaders)
+    self.__check_pxf_read(headers)
+
+
+  def __check_pxf_hdfs_write(self):
+    """
+    Writes some test HDFS data through PXF
+    """
+    Logger.info("Testing PXF HDFS write")
+    headers = self.commonPXFHeaders.copy()
+    headers.update({
+      "X-GP-Profile" : "HdfsTextSimple",
+      "Content-Type":"application/octet-stream",
+      "Expect": "100-continue",
+      "X-GP-ALIGNMENT": "4",
+      "X-GP-SEGMENT-ID": "0",
+      "X-GP-SEGMENT-COUNT": "3",
+      "X-GP-URI": "pxf://" + pxf_constants.service_check_hostname + ":" + str(pxf_constants.PXF_PORT) + pxf_constants.pxf_hdfs_test_dir + "/?Profile=HdfsTextSimple",
+      "X-GP-DATA-DIR": pxf_constants.pxf_hdfs_test_dir + "/" 
+    })
+
+    body = {"Sample" : " text"}
+    url = self.base_url + self.pxf_version + "/Writable/stream?path=" + pxf_constants.pxf_hdfs_write_test_file
+    try:
+      response = makeHTTPCall(url, headers, body)
+      if not "wrote" in response:
+        Logger.error("Unable to confirm write from the response")
+        raise 
+    except:
+      msg = "PXF HDFS data write test failed"
+      raise Fail(msg)
+
+
+  def __cleanup_hdfs_data(self):
+    """
+    Cleans up the test HDFS data
+    """
+    Logger.info("Cleaning up temporary HDFS test data")
+    import params
+    params.HdfsResource(pxf_constants.pxf_hdfs_read_test_file,
+        type="file",
+        action="delete_on_execute"
+        )
+    params.HdfsResource(pxf_constants.pxf_hdfs_test_dir,
+        type="directory",
+        action="delete_on_execute"
+        )
+
+
+  def run_hbase_tests(self):
+    """
+    Runs a set of PXF HBase checks
+    """
+    Logger.info("Running PXF HBase checks")
+    self.__check_if_client_exists("HBase")
+    self.__write_hbase_data()
+    self.__check_pxf_hbase_read()
+
+
+  def __write_hbase_data(self):
+    """
+    Creates a temporary HBase table for the service checks
+    """
+    Logger.info("Creating temporary HBase test data")
+    Execute("echo \"create '" + pxf_constants.pxf_hbase_test_table + "', 'cf'\"|hbase shell", logoutput = True)
+    Execute("echo \"put '" + pxf_constants.pxf_hbase_test_table + "', 'row1', 'cf:a', 'value1'; put '" + pxf_constants.pxf_hbase_test_table + "', 'row1', 'cf:b', 'value2'\" | hbase shell", logoutput = True)
+
+
+  def __check_pxf_hbase_read(self):
+    """
+    Checks reading HBase data through PXF
+    """
+    Logger.info("Testing PXF HBase data read")
+    headers = { 
+        "X-GP-DATA-DIR": pxf_constants.pxf_hbase_test_table,
+        "X-GP-profile": "HBase",
+        }
+    headers.update(self.commonPXFHeaders)
+
+    self.__check_pxf_read(headers)
+
+
+  def __cleanup_hbase_data(self):
+    """
+    Cleans up the test HBase data
+    """
+    Logger.info("Cleaning up HBase test data")
+    Execute("echo \"disable '" + pxf_constants.pxf_hbase_test_table + "'\"|hbase shell > /dev/null 2>&1", logoutput = True)
+    Execute("echo \"drop '" + pxf_constants.pxf_hbase_test_table + "'\"|hbase shell > /dev/null 2>&1", logoutput = True)
+
+
+  def __package_exists(self, pkg):
+    """
+    Low level function to check if a rpm is installed
+    """
+    if System.get_instance().os_family == "suse":
+      return not runLocalCmd("zypper search " + pkg)
+    else:
+      return not runLocalCmd("yum list installed | grep -i " + pkg)
+
+
+  def __check_if_client_exists(self, serviceName):
+    Logger.info("Checking if " + serviceName + " client libraries exist")
+    if not self.__package_exists(serviceName):
+      error_msg = serviceName + "client libraries do not exist on the PXF node"
+      Logger.error(msg)
+      raise Fail(msg)
+
+
+if __name__ == "__main__":
+  PXFServiceCheck().execute()
+


[06/22] ambari git commit: Revert "AMBARI-14718. on region server restart ambari is setting /tmp to hbase:hadoop (aonishuk)"

Posted by nc...@apache.org.
Revert "AMBARI-14718. on region server restart ambari is setting /tmp to hbase:hadoop (aonishuk)"

This reverts commit 1c2c6a9f6678931936585761a242651b8a6871ce.


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

Branch: refs/heads/branch-dev-patch-upgrade
Commit: 862336189317b6dab6e86377049532d5264f0636
Parents: ddf479e
Author: Mahadev Konar <ma...@apache.org>
Authored: Wed Jan 20 10:32:35 2016 -0800
Committer: Mahadev Konar <ma...@apache.org>
Committed: Wed Jan 20 10:32:35 2016 -0800

----------------------------------------------------------------------
 .../HBASE/0.96.0.2.0/configuration/hbase-env.xml             | 2 +-
 .../HBASE/0.96.0.2.0/package/scripts/hbase.py                | 5 +++--
 .../HBASE/0.96.0.2.0/package/scripts/params_linux.py         | 2 ++
 .../src/test/python/stacks/2.0.6/HBASE/test_hbase_client.py  | 4 ++++
 .../src/test/python/stacks/2.0.6/HBASE/test_hbase_master.py  | 6 ++++++
 .../python/stacks/2.0.6/HBASE/test_hbase_regionserver.py     | 8 ++++++++
 .../python/stacks/2.0.6/HBASE/test_phoenix_queryserver.py    | 4 ++++
 7 files changed, 28 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/86233618/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/configuration/hbase-env.xml
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/configuration/hbase-env.xml b/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/configuration/hbase-env.xml
index 62c7c93..cabd4fd 100644
--- a/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/configuration/hbase-env.xml
+++ b/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/configuration/hbase-env.xml
@@ -115,7 +115,7 @@ and the -Xmn ratio (hbase_regionserver_xmn_ratio) exceeds this value.
 
   <property>
     <name>hbase_java_io_tmpdir</name>
-    <value>{{exec_tmp_dir}}/hbase_java_io_tmpdir</value>
+    <value>/tmp</value>
     <description>Used in hbase-env.sh as HBASE_OPTS=-Djava.io.tmpdir=java_io_tmpdir</description>
     <value-attributes>
       <type>directory</type>

http://git-wip-us.apache.org/repos/asf/ambari/blob/86233618/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/hbase.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/hbase.py b/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/hbase.py
index 71ce02b..c407a93 100644
--- a/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/hbase.py
+++ b/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/hbase.py
@@ -22,7 +22,6 @@ from resource_management import *
 import sys
 from ambari_commons.os_family_impl import OsFamilyFuncImpl, OsFamilyImpl
 from ambari_commons import OSConst
-from resource_management.core.source import InlineTemplate
 
 
 @OsFamilyFuncImpl(os_family=OSConst.WINSRV_FAMILY)
@@ -57,7 +56,9 @@ def hbase(name=None):
       create_parents = True
   )
    
-  Directory(InlineTemplate(params.java_io_tmpdir).get_content(),
+  Directory(params.java_io_tmpdir,
+      owner = params.hbase_user,
+      group = params.user_group,
       create_parents = True,
       mode=0777
   )

http://git-wip-us.apache.org/repos/asf/ambari/blob/86233618/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/params_linux.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/params_linux.py b/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/params_linux.py
index 337f09d..f37844c 100644
--- a/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/params_linux.py
+++ b/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/params_linux.py
@@ -36,6 +36,8 @@ from resource_management.libraries.functions import is_empty
 from resource_management.libraries.functions import get_unique_id_and_date
 from resource_management.libraries.script.script import Script
 
+from resource_management.libraries.functions.substitute_vars import substitute_vars
+
 # server configurations
 config = Script.get_config()
 exec_tmp_dir = Script.get_tmp_dir()

http://git-wip-us.apache.org/repos/asf/ambari/blob/86233618/ambari-server/src/test/python/stacks/2.0.6/HBASE/test_hbase_client.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/python/stacks/2.0.6/HBASE/test_hbase_client.py b/ambari-server/src/test/python/stacks/2.0.6/HBASE/test_hbase_client.py
index 6dc4b0b..9f3e19e 100644
--- a/ambari-server/src/test/python/stacks/2.0.6/HBASE/test_hbase_client.py
+++ b/ambari-server/src/test/python/stacks/2.0.6/HBASE/test_hbase_client.py
@@ -47,6 +47,8 @@ class TestHBaseClient(RMFTestCase):
       create_parents = True,
     )
     self.assertResourceCalled('Directory', '/tmp',
+      owner = 'hbase',
+      group = 'hadoop',
       create_parents = True,
       mode = 0777
     )
@@ -143,6 +145,8 @@ class TestHBaseClient(RMFTestCase):
       create_parents = True,
     )
     self.assertResourceCalled('Directory', '/tmp',
+      owner = 'hbase',
+      group = 'hadoop',
       create_parents = True,
       mode = 0777
     )

http://git-wip-us.apache.org/repos/asf/ambari/blob/86233618/ambari-server/src/test/python/stacks/2.0.6/HBASE/test_hbase_master.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/python/stacks/2.0.6/HBASE/test_hbase_master.py b/ambari-server/src/test/python/stacks/2.0.6/HBASE/test_hbase_master.py
index 13b2e33..7c6d10e 100644
--- a/ambari-server/src/test/python/stacks/2.0.6/HBASE/test_hbase_master.py
+++ b/ambari-server/src/test/python/stacks/2.0.6/HBASE/test_hbase_master.py
@@ -243,6 +243,8 @@ class TestHBaseMaster(RMFTestCase):
       create_parents = True,
     )
     self.assertResourceCalled('Directory', '/tmp',
+      owner = 'hbase',
+      group = 'hadoop',
       create_parents = True,
       mode = 0777
     )
@@ -378,6 +380,8 @@ class TestHBaseMaster(RMFTestCase):
       create_parents = True,
     )
     self.assertResourceCalled('Directory', '/tmp',
+      owner = 'hbase',
+      group = 'hadoop',
       create_parents = True,
       mode = 0777
     )
@@ -522,6 +526,8 @@ class TestHBaseMaster(RMFTestCase):
       group = 'hadoop',
       create_parents = True)
     self.assertResourceCalled('Directory', '/tmp',
+      owner = 'hbase',
+      group = 'hadoop',
       create_parents = True,
       mode = 0777
     )

http://git-wip-us.apache.org/repos/asf/ambari/blob/86233618/ambari-server/src/test/python/stacks/2.0.6/HBASE/test_hbase_regionserver.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/python/stacks/2.0.6/HBASE/test_hbase_regionserver.py b/ambari-server/src/test/python/stacks/2.0.6/HBASE/test_hbase_regionserver.py
index 58ca7ef..c36bd89 100644
--- a/ambari-server/src/test/python/stacks/2.0.6/HBASE/test_hbase_regionserver.py
+++ b/ambari-server/src/test/python/stacks/2.0.6/HBASE/test_hbase_regionserver.py
@@ -136,6 +136,8 @@ class TestHbaseRegionServer(RMFTestCase):
       create_parents = True,
     )
     self.assertResourceCalled('Directory', '/tmp',
+      owner = 'hbase',
+      group = 'hadoop',
       create_parents = True,
       mode = 0777
     )
@@ -232,6 +234,8 @@ class TestHbaseRegionServer(RMFTestCase):
       create_parents = True,
     )
     self.assertResourceCalled('Directory', '/tmp',
+      owner = 'hbase',
+      group = 'hadoop',
       create_parents = True,
       mode = 0777
     )
@@ -338,6 +342,8 @@ class TestHbaseRegionServer(RMFTestCase):
       group = 'hadoop',
       create_parents = True)
     self.assertResourceCalled('Directory', '/tmp',
+      owner = 'hbase',
+      group = 'hadoop',
       create_parents = True,
       mode = 0777
     )
@@ -452,6 +458,8 @@ class TestHbaseRegionServer(RMFTestCase):
       group = 'hadoop',
       create_parents = True)
     self.assertResourceCalled('Directory', '/tmp',
+      owner = 'hbase',
+      group = 'hadoop',
       create_parents = True,
       mode = 0777
     )

http://git-wip-us.apache.org/repos/asf/ambari/blob/86233618/ambari-server/src/test/python/stacks/2.0.6/HBASE/test_phoenix_queryserver.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/python/stacks/2.0.6/HBASE/test_phoenix_queryserver.py b/ambari-server/src/test/python/stacks/2.0.6/HBASE/test_phoenix_queryserver.py
index 7722af0..6f3199e 100644
--- a/ambari-server/src/test/python/stacks/2.0.6/HBASE/test_phoenix_queryserver.py
+++ b/ambari-server/src/test/python/stacks/2.0.6/HBASE/test_phoenix_queryserver.py
@@ -238,6 +238,8 @@ class TestPhoenixQueryServer(RMFTestCase):
       create_parents = True,
     )
     self.assertResourceCalled('Directory', '/tmp',
+      owner = 'hbase',
+      group = 'hadoop',
       create_parents = True,
       mode = 0777
     )
@@ -349,6 +351,8 @@ class TestPhoenixQueryServer(RMFTestCase):
       create_parents = True,
     )
     self.assertResourceCalled('Directory', '/tmp',
+      owner = 'hbase',
+      group = 'hadoop',
       create_parents = True,
       mode = 0777
     )


[19/22] ambari git commit: AMBARI-14747. When enable disable Kerberos multiple times - Kerberos configs becomes empty. (mpapirkovskyy)

Posted by nc...@apache.org.
AMBARI-14747. When enable disable Kerberos multiple times - Kerberos configs becomes empty. (mpapirkovskyy)


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

Branch: refs/heads/branch-dev-patch-upgrade
Commit: a9c644f94b9c03e47a7be518a5873428635a1fc4
Parents: 59ed986
Author: Myroslav Papirkovskyy <mp...@hortonworks.com>
Authored: Wed Jan 20 22:06:07 2016 +0200
Committer: Myroslav Papirkovskyy <mp...@hortonworks.com>
Committed: Thu Jan 21 20:20:36 2016 +0200

----------------------------------------------------------------------
 .../AmbariManagementControllerImpl.java         |  9 +++++++
 .../ambari/server/orm/dao/ClusterDAO.java       | 19 +++++++++++++
 .../apache/ambari/server/state/ServiceImpl.java | 28 +++++++++++++++++---
 .../AmbariManagementControllerImplTest.java     |  5 ++++
 .../server/state/cluster/ClusterTest.java       | 19 +++++++++++--
 5 files changed, 75 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/a9c644f9/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
index 41126f8..5010311 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
@@ -1502,6 +1502,15 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle
             isConfigurationCreationNeeded = true;
             break;
           } else {
+            if (clusterConfig.getServiceConfigVersions().isEmpty()) {
+              //If there's no service config versions containing this config, recreate it even if exactly equal
+              LOG.warn("Existing desired config doesn't belong to any service config version, " +
+                  "forcing config recreation, " +
+                  "clusterName={}, type = {}, tag={}", cluster.getClusterName(), clusterConfig.getType(),
+                  clusterConfig.getTag());
+              isConfigurationCreationNeeded = true;
+              break;
+            }
             for (Entry<String, String> property : requestConfigProperties.entrySet()) {
               if (!StringUtils.equals(property.getValue(), clusterConfigProperties.get(property.getKey()))) {
                 isConfigurationCreationNeeded = true;

http://git-wip-us.apache.org/repos/asf/ambari/blob/a9c644f9/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/ClusterDAO.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/ClusterDAO.java b/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/ClusterDAO.java
index 1c0e38a..7f499f0 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/ClusterDAO.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/ClusterDAO.java
@@ -241,6 +241,25 @@ public class ClusterDAO {
   }
 
   /**
+   * Gets selected mappings for provided config types
+   * @param clusterId cluster id
+   * @param types config types for mappings
+   * @return
+   */
+  @RequiresSession
+  public List<ClusterConfigMappingEntity> getSelectedConfigMappingByTypes(long clusterId, List<String> types) {
+    TypedQuery<ClusterConfigMappingEntity> query = entityManagerProvider.get().createQuery(
+        "SELECT mapping FROM ClusterConfigMappingEntity mapping " +
+            "WHERE mapping.clusterId = :clusterId AND mapping.typeName IN :type " +
+            "AND mapping.selectedInd > 0", ClusterConfigMappingEntity.class);
+
+    query.setParameter("clusterId", clusterId);
+    query.setParameter("type", types);
+
+    return daoUtils.selectList(query);
+  }
+
+  /**
    * Create Cluster entity in Database
    * @param clusterEntity entity to create
    */

http://git-wip-us.apache.org/repos/asf/ambari/blob/a9c644f9/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceImpl.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceImpl.java
index 0a998df..487489b 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceImpl.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceImpl.java
@@ -39,6 +39,7 @@ import org.apache.ambari.server.orm.dao.ServiceConfigDAO;
 import org.apache.ambari.server.orm.dao.ServiceDesiredStateDAO;
 import org.apache.ambari.server.orm.dao.StackDAO;
 import org.apache.ambari.server.orm.entities.ClusterConfigEntity;
+import org.apache.ambari.server.orm.entities.ClusterConfigMappingEntity;
 import org.apache.ambari.server.orm.entities.ClusterEntity;
 import org.apache.ambari.server.orm.entities.ClusterServiceEntity;
 import org.apache.ambari.server.orm.entities.ClusterServiceEntityPK;
@@ -563,10 +564,31 @@ public class ServiceImpl implements Service {
 
   @Transactional
   void deleteAllServiceConfigs() throws AmbariException {
+    ArrayList<String> serviceConfigTypes = new ArrayList<>();
+    ServiceConfigEntity lastServiceConfigEntity = serviceConfigDAO.findMaxVersion(getClusterId(), getName());
+    //ensure service config version exist
+    if (lastServiceConfigEntity != null) {
+      for (ClusterConfigEntity configEntity : lastServiceConfigEntity.getClusterConfigEntities()) {
+        serviceConfigTypes.add(configEntity.getType());
+      }
+
+      LOG.info("Deselecting config mapping for cluster, clusterId={}, configTypes={} ",
+          getClusterId(), serviceConfigTypes);
+
+      List<ClusterConfigMappingEntity> configMappingEntities =
+          clusterDAO.getSelectedConfigMappingByTypes(getClusterId(), serviceConfigTypes);
+
+      for (ClusterConfigMappingEntity configMappingEntity : configMappingEntities) {
+        configMappingEntity.setSelected(0);
+      }
+
+      clusterDAO.mergeConfigMappings(configMappingEntities);
+    }
+
     LOG.info("Deleting all serviceconfigs for service"
-      + ", clusterName=" + cluster.getClusterName()
-      + ", serviceName=" + getName());
-    
+        + ", clusterName=" + cluster.getClusterName()
+        + ", serviceName=" + getName());
+
     List<ServiceConfigEntity> serviceConfigEntities =
       serviceConfigDAO.findByService(cluster.getClusterId(), getName());
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/a9c644f9/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerImplTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerImplTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerImplTest.java
index 33d1c29..42e3b10 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerImplTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerImplTest.java
@@ -70,6 +70,7 @@ import org.apache.ambari.server.state.State;
 import org.easymock.Capture;
 import org.junit.Before;
 import org.junit.BeforeClass;
+import org.junit.Ignore;
 import org.junit.Test;
 import org.springframework.security.core.context.SecurityContextHolder;
 
@@ -585,8 +586,12 @@ public class AmbariManagementControllerImplTest {
   /**
    * Ensure that processing update request does not fail on configuration
    * properties with no value specified (no value = null reference value)
+   * TODO disabled for now as tests nothing, check what exactly should be tested here
+   * updateCluster request was noop due to equality on cluster and request configs (both contained null)
+   * mocks are too limited to pass further these base checks
    */
   @Test
+  @Ignore
   public void testUpdateClustersWithNullConfigPropertyValues() throws Exception {
     // member state mocks
     Capture<AmbariManagementController> controllerCapture = new Capture<AmbariManagementController>();

http://git-wip-us.apache.org/repos/asf/ambari/blob/a9c644f9/ambari-server/src/test/java/org/apache/ambari/server/state/cluster/ClusterTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/state/cluster/ClusterTest.java b/ambari-server/src/test/java/org/apache/ambari/server/state/cluster/ClusterTest.java
index 2c6b0c3..2ffcd5d 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/state/cluster/ClusterTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/state/cluster/ClusterTest.java
@@ -103,6 +103,7 @@ import org.apache.ambari.server.state.configgroup.ConfigGroupFactory;
 import org.apache.ambari.server.state.fsm.InvalidStateTransitionException;
 import org.apache.ambari.server.state.host.HostHealthyHeartbeatEvent;
 import org.apache.ambari.server.state.host.HostRegistrationRequestEvent;
+import org.apache.commons.lang.StringUtils;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Ignore;
@@ -1068,8 +1069,22 @@ public class ClusterTest {
     Assert.assertEquals(2,
       em.createQuery("SELECT config from ClusterConfigEntity config").getResultList().size());
     // ClusterConfigMapping
-    Assert.assertEquals(2,
-      em.createQuery("SELECT configmapping from ClusterConfigMappingEntity configmapping").getResultList().size());
+    List<ClusterConfigMappingEntity> configMappingEntities =
+        em.createQuery("SELECT configmapping from ClusterConfigMappingEntity configmapping",
+        ClusterConfigMappingEntity.class).getResultList();
+
+    Assert.assertEquals(2, configMappingEntities.size());
+
+    for (ClusterConfigMappingEntity configMappingEntity : configMappingEntities) {
+      if (StringUtils.equals(configMappingEntity.getType(), "core-site")) {
+        assertEquals("core-site is not part of HDFS in test stack, should remain mapped to cluster",
+            1, configMappingEntity.isSelected());
+      }
+      if (StringUtils.equals(configMappingEntity.getType(), "hdfs-site")) {
+        assertEquals("hdfs-site should be unmapped from cluster when HDFS service is removed",
+            0, configMappingEntity.isSelected());
+      }
+    }
 
     // ServiceConfigMapping
     Assert.assertEquals(0,


[20/22] ambari git commit: Unit Test for AMBARI-14729 : API does not return host component metrics. (avijayan)

Posted by nc...@apache.org.
Unit Test for AMBARI-14729 : API does not return host component metrics. (avijayan)


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

Branch: refs/heads/branch-dev-patch-upgrade
Commit: 780cb6912306beee5fad9b93652045d98ccdc362
Parents: a9c644f
Author: Aravindan Vijayan <av...@hortonworks.com>
Authored: Thu Jan 21 10:19:08 2016 -0800
Committer: Aravindan Vijayan <av...@hortonworks.com>
Committed: Thu Jan 21 10:21:54 2016 -0800

----------------------------------------------------------------------
 .../timeline/AMSPropertyProviderTest.java       | 179 ++++++++++++++++++-
 .../ams/single_host_component_metrics_h1.json   |  21 +++
 .../ams/single_host_component_metrics_h2.json   |  22 +++
 3 files changed, 214 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/780cb691/ambari-server/src/test/java/org/apache/ambari/server/controller/metrics/timeline/AMSPropertyProviderTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/metrics/timeline/AMSPropertyProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/metrics/timeline/AMSPropertyProviderTest.java
index 70cd303..1394081 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/metrics/timeline/AMSPropertyProviderTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/metrics/timeline/AMSPropertyProviderTest.java
@@ -82,6 +82,7 @@ public class AMSPropertyProviderTest {
   private static final String PROPERTY_ID1 = PropertyHelper.getPropertyId("metrics/cpu", "cpu_user");
   private static final String PROPERTY_ID2 = PropertyHelper.getPropertyId("metrics/memory", "mem_free");
   private static final String PROPERTY_ID3 = PropertyHelper.getPropertyId("metrics/dfs/datanode", "blocks_replicated");
+  private static final String PROPERTY_ID4 = PropertyHelper.getPropertyId("metrics/dfs/datanode", "blocks_removed");
   private static final String CLUSTER_NAME_PROPERTY_ID = PropertyHelper.getPropertyId("HostRoles", "cluster_name");
   private static final String HOST_NAME_PROPERTY_ID = PropertyHelper.getPropertyId("HostRoles", "host_name");
   private static final String COMPONENT_NAME_PROPERTY_ID = PropertyHelper.getPropertyId("HostRoles", "component_name");
@@ -122,6 +123,7 @@ public class AMSPropertyProviderTest {
     testAggregateFunctionForComponentMetrics();
     testFilterOutOfBandMetricData();
     testPopulateResourcesForHostComponentHostMetrics();
+    testPopulateResourcesForHostComponentMetricsForMultipleHosts();
   }
 
   @Test
@@ -139,6 +141,7 @@ public class AMSPropertyProviderTest {
     testAggregateFunctionForComponentMetrics();
     testFilterOutOfBandMetricData();
     testPopulateResourcesForHostComponentHostMetrics();
+    testPopulateResourcesForHostComponentMetricsForMultipleHosts();
   }
 
   @Test
@@ -156,6 +159,7 @@ public class AMSPropertyProviderTest {
     testAggregateFunctionForComponentMetrics();
     testFilterOutOfBandMetricData();
     testPopulateResourcesForHostComponentHostMetrics();
+    testPopulateResourcesForHostComponentMetricsForMultipleHosts();
   }
 
   @Test(expected = AuthorizationException.class)
@@ -175,6 +179,7 @@ public class AMSPropertyProviderTest {
     testAggregateFunctionForComponentMetrics();
     testFilterOutOfBandMetricData();
     testPopulateResourcesForHostComponentHostMetrics();
+    testPopulateResourcesForHostComponentMetricsForMultipleHosts();
   }
 
   public void testPopulateResourcesForSingleHostMetric() throws Exception {
@@ -789,8 +794,157 @@ public class AMSPropertyProviderTest {
     Assert.assertEquals(8, val.length);
   }
 
+  static class TestStreamProviderForHostComponentMultipleHostsMetricsTest extends TestStreamProvider {
+    String hostComponentMetricFilePath_h1 = FILE_PATH_PREFIX + "single_host_component_metrics_h1.json";
+    String hostComponentMetricFilePath_h2 = FILE_PATH_PREFIX + "single_host_component_metrics_h2.json";
+
+    public TestStreamProviderForHostComponentMultipleHostsMetricsTest(String fileName) {
+      super(fileName);
+    }
+
+    @Override
+    public InputStream readFrom(String spec) throws IOException {
+      if (spec.contains("h1")) {
+        this.fileName = hostComponentMetricFilePath_h1;
+      } else {
+        this.fileName = hostComponentMetricFilePath_h2;
+      }
+
+      specs.add(spec);
+
+      return super.readFrom(spec);
+    }
+  }
+
+  public void testPopulateResourcesForHostComponentMetricsForMultipleHosts() throws Exception {
+    setUpCommonMocks();
+    TestStreamProviderForHostComponentMultipleHostsMetricsTest streamProvider =
+      new TestStreamProviderForHostComponentMultipleHostsMetricsTest(null);
+    injectCacheEntryFactoryWithStreamProvider(streamProvider);
+    TestMetricHostProvider metricHostProvider = new TestMetricHostProvider("h1");
+    ComponentSSLConfiguration sslConfiguration = mock(ComponentSSLConfiguration.class);
+
+    TimelineMetricCacheProvider cacheProviderMock = EasyMock.createMock(TimelineMetricCacheProvider.class);
+    TimelineMetricCache cacheMock = EasyMock.createMock(TimelineMetricCache.class);
+    expect(cacheProviderMock.getTimelineMetricsCache()).andReturn(cacheMock).anyTimes();
+
+    Map<String, Map<String, PropertyInfo>> propertyIds = PropertyHelper.getMetricPropertyIds(Resource.Type.HostComponent);
+
+    Resource resource = new ResourceImpl(Resource.Type.Host);
+    resource.setProperty(CLUSTER_NAME_PROPERTY_ID, "c1");
+    resource.setProperty(HOST_NAME_PROPERTY_ID, "h1");
+    resource.setProperty(COMPONENT_NAME_PROPERTY_ID, "DATANODE");
+    Map<String, TemporalInfo> temporalInfoMap = new HashMap<String, TemporalInfo>();
+
+    temporalInfoMap.put(PROPERTY_ID4, new TemporalInfoImpl(1416445244801L, 1416448936464L, 1L));
+    Request request = PropertyHelper.getReadRequest(
+      new HashSet<String>() {{
+        add(PROPERTY_ID4);
+        add("params/padding/NONE"); // Ignore padding to match result size
+      }},
+      temporalInfoMap);
+
+    AMSPropertyProvider propertyProvider = new AMSHostComponentPropertyProvider(
+      propertyIds,
+      streamProvider,
+      sslConfiguration,
+      cacheProviderMock,
+      metricHostProvider,
+      CLUSTER_NAME_PROPERTY_ID,
+      HOST_NAME_PROPERTY_ID,
+      COMPONENT_NAME_PROPERTY_ID
+    );
+
+    Set<Resource> resources1 =
+      propertyProvider.populateResources(Collections.singleton(resource), request, null);
+    Assert.assertEquals(1, resources1.size());
+    Resource res1 = resources1.iterator().next();
+    Map<String, Object> properties = PropertyHelper.getProperties(resources1.iterator().next());
+    Assert.assertNotNull(properties);
+
+    /////////////////////////////////////
+    metricHostProvider = new TestMetricHostProvider("h2");
+    cacheProviderMock = EasyMock.createMock(TimelineMetricCacheProvider.class);
+    cacheMock = EasyMock.createMock(TimelineMetricCache.class);
+    expect(cacheProviderMock.getTimelineMetricsCache()).andReturn(cacheMock).anyTimes();
+
+    resource = new ResourceImpl(Resource.Type.Host);
+    resource.setProperty(CLUSTER_NAME_PROPERTY_ID, "c1");
+    resource.setProperty(HOST_NAME_PROPERTY_ID, "h2");
+    resource.setProperty(COMPONENT_NAME_PROPERTY_ID, "DATANODE");
+    temporalInfoMap = new HashMap<String, TemporalInfo>();
+    temporalInfoMap.put(PROPERTY_ID4, new TemporalInfoImpl(1416445244801L, 1416448936464L, 1L));
+    request = PropertyHelper.getReadRequest(
+      new HashSet<String>() {{
+        add(PROPERTY_ID4);
+        add("params/padding/NONE"); // Ignore padding to match result size
+      }},
+      temporalInfoMap);
+
+    propertyProvider = new AMSHostComponentPropertyProvider(
+      propertyIds,
+      streamProvider,
+      sslConfiguration,
+      cacheProviderMock,
+      metricHostProvider,
+      CLUSTER_NAME_PROPERTY_ID,
+      HOST_NAME_PROPERTY_ID,
+      COMPONENT_NAME_PROPERTY_ID
+    );
+
+    resource.setProperty(HOST_NAME_PROPERTY_ID, "h2");
+
+    Set<Resource> resources2 =
+      propertyProvider.populateResources(Collections.singleton(resource), request, null);
+    Assert.assertEquals(1, resources2.size());
+    Resource res2 = resources2.iterator().next();
+    properties = PropertyHelper.getProperties(resources2.iterator().next());
+    Assert.assertNotNull(properties);
+
+    Set<String> specs = streamProvider.getAllSpecs();
+    Assert.assertEquals(2, specs.size());
+
+    URIBuilder uriBuilder1 = AMSPropertyProvider.getAMSUriBuilder("localhost", 8188);
+    Number[][] val;
+
+    for (String spec : specs) {
+      Assert.assertNotNull(spec);
+
+      if (spec.contains("h2")) {
+        uriBuilder1.setParameter("metricNames", "dfs.datanode.blocks_removed");
+        uriBuilder1.setParameter("hostname", "h2");
+        uriBuilder1.setParameter("appId", "DATANODE");
+        uriBuilder1.setParameter("startTime", "1416445244801");
+        uriBuilder1.setParameter("endTime", "1416448936464");
+        Assert.assertEquals(uriBuilder1.toString(), spec);
+        val = (Number[][]) res2.getPropertyValue(PROPERTY_ID4);
+        Assert.assertNotNull("No value for property " + PROPERTY_ID4, val);
+        Assert.assertEquals(9, val.length);
+      } else {
+        uriBuilder1.setParameter("metricNames", "dfs.datanode.blocks_removed");
+        uriBuilder1.setParameter("hostname", "h1");
+        uriBuilder1.setParameter("appId", "DATANODE");
+        uriBuilder1.setParameter("startTime", "1416445244801");
+        uriBuilder1.setParameter("endTime", "1416448936464");
+        Assert.assertEquals(uriBuilder1.toString(), spec);
+        val = (Number[][]) res1.getPropertyValue(PROPERTY_ID4);
+        Assert.assertNotNull("No value for property " + PROPERTY_ID4, val);
+        Assert.assertEquals(8, val.length);
+      }
+    }
+  }
+
   public static class TestMetricHostProvider implements MetricHostProvider {
 
+    private String hostName;
+
+    public TestMetricHostProvider() {
+    }
+
+    public TestMetricHostProvider(String hostName) {
+      this.hostName = hostName;
+    }
+
     @Override
     public String getCollectorHostName(String clusterName, MetricsService service)
       throws SystemException {
@@ -799,7 +953,7 @@ public class AMSPropertyProviderTest {
 
     @Override
     public String getHostName(String clusterName, String componentName) throws SystemException {
-      return "h1";
+      return (hostName != null) ? hostName : "h1";
     }
 
     @Override
@@ -820,21 +974,30 @@ public class AMSPropertyProviderTest {
 
   // Helper function to setup common Mocks.
   private void setUpCommonMocks() throws AmbariException {
-
-    AmbariManagementController amc = createNiceMock(AmbariManagementController.class);
+    AmbariManagementController ams = createNiceMock(AmbariManagementController.class);
     PowerMock.mockStatic(AmbariServer.class);
-    expect(AmbariServer.getController()).andReturn(amc).anyTimes();
+    expect(AmbariServer.getController()).andReturn(ams).anyTimes();
+    AmbariMetaInfo ambariMetaInfo = createNiceMock(AmbariMetaInfo.class);
     Clusters clusters = createNiceMock(Clusters.class);
     Cluster cluster = createNiceMock(Cluster.class);
-    expect(amc.getClusters()).andReturn(clusters).anyTimes();
-    expect(clusters.getCluster(CLUSTER_NAME_PROPERTY_ID)).andReturn(cluster).anyTimes();
-    expect(cluster.getResourceId()).andReturn(2L).anyTimes();
+    ComponentInfo componentInfo = createNiceMock(ComponentInfo.class);
+    StackId stackId= new StackId("HDP","2.2");
+    expect(ams.getClusters()).andReturn(clusters).anyTimes();
     try {
       expect(clusters.getCluster(anyObject(String.class))).andReturn(cluster).anyTimes();
     } catch (AmbariException e) {
       e.printStackTrace();
     }
-    replay(amc, clusters, cluster);
+    expect(cluster.getCurrentStackVersion()).andReturn(stackId).anyTimes();
+    expect(ams.getAmbariMetaInfo()).andReturn(ambariMetaInfo).anyTimes();
+    expect(ambariMetaInfo.getComponentToService(anyObject(String.class),
+      anyObject(String.class), anyObject(String.class))).andReturn("HDFS").anyTimes();
+    expect(ambariMetaInfo.getComponent(anyObject(String.class),anyObject(String.class),
+      anyObject(String.class), anyObject(String.class)))
+      .andReturn(componentInfo).anyTimes();
+    expect(componentInfo.getTimelineAppid()).andReturn(null).anyTimes();
+
+    replay(ams, clusters, cluster, ambariMetaInfo, componentInfo);
     PowerMock.replayAll();
   }
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/780cb691/ambari-server/src/test/resources/ams/single_host_component_metrics_h1.json
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/resources/ams/single_host_component_metrics_h1.json b/ambari-server/src/test/resources/ams/single_host_component_metrics_h1.json
new file mode 100644
index 0000000..988c249
--- /dev/null
+++ b/ambari-server/src/test/resources/ams/single_host_component_metrics_h1.json
@@ -0,0 +1,21 @@
+{
+  "metrics": [
+    {
+      "timestamp": 1416445244801,
+      "type": "Long",
+      "metricname": "dfs.datanode.blocks_removed",
+      "appid": "datanode",
+      "hostname": "h1",
+      "starttime": 1416445244801,
+      "metrics": {
+        "1416445244801": 0.0,
+        "1416445259801": 0.0,
+        "1416445274801": 0.0,
+        "1416445289801": 0.0,
+        "1416445304801": 0.0,
+        "1416445319801": 0.0,
+        "1416445364801": 0.0,
+        "1416445379801": 0.0
+      }
+    }
+  ]}

http://git-wip-us.apache.org/repos/asf/ambari/blob/780cb691/ambari-server/src/test/resources/ams/single_host_component_metrics_h2.json
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/resources/ams/single_host_component_metrics_h2.json b/ambari-server/src/test/resources/ams/single_host_component_metrics_h2.json
new file mode 100644
index 0000000..450cec8
--- /dev/null
+++ b/ambari-server/src/test/resources/ams/single_host_component_metrics_h2.json
@@ -0,0 +1,22 @@
+{
+  "metrics": [
+    {
+      "timestamp": 1416445244801,
+      "type": "Long",
+      "metricname": "dfs.datanode.blocks_removed",
+      "appid": "datanode",
+      "hostname": "h2",
+      "starttime": 1416445244801,
+      "metrics": {
+        "1416445244801": 1.0,
+        "1416445259801": 1.0,
+        "1416445274801": 1.0,
+        "1416445289801": 1.0,
+        "1416445304801": 1.0,
+        "1416445319801": 1.0,
+        "1416445364801": 1.0,
+        "1416445379801": 1.0,
+        "1416445384801": 1.0
+      }
+    }
+  ]}


[16/22] ambari git commit: AMBARI-14757 host check doesn't show warning about working firewall on the host (Suse only) (dsen)

Posted by nc...@apache.org.
AMBARI-14757 host check doesn't show warning about working firewall on the host (Suse only) (dsen)


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

Branch: refs/heads/branch-dev-patch-upgrade
Commit: 3c455299d4a189ac27ea3c1473b6a38ff1192c39
Parents: b0aeefc
Author: Dmytro Sen <ds...@apache.org>
Authored: Thu Jan 21 15:59:56 2016 +0200
Committer: Dmytro Sen <ds...@apache.org>
Committed: Thu Jan 21 15:59:56 2016 +0200

----------------------------------------------------------------------
 ambari-common/src/main/python/ambari_commons/firewall.py | 6 +++---
 ambari-server/src/test/python/TestAmbariServer.py        | 4 ++--
 2 files changed, 5 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/3c455299/ambari-common/src/main/python/ambari_commons/firewall.py
----------------------------------------------------------------------
diff --git a/ambari-common/src/main/python/ambari_commons/firewall.py b/ambari-common/src/main/python/ambari_commons/firewall.py
index e6a1ff9..64d396b 100644
--- a/ambari-common/src/main/python/ambari_commons/firewall.py
+++ b/ambari-common/src/main/python/ambari_commons/firewall.py
@@ -129,7 +129,7 @@ class Fedora18FirewallChecks(FirewallChecks):
 class SuseFirewallChecks(FirewallChecks):
   def __init__(self):
     super(SuseFirewallChecks, self).__init__()
-    self.FIREWALL_SERVICE_NAME = "SuSEfirewall2"
+    self.FIREWALL_SERVICE_NAME = "rcSuSEfirewall2"
 
   def get_command(self):
     return "%s %s" % (self.FIREWALL_SERVICE_NAME, self.SERVICE_SUBCMD)
@@ -137,9 +137,9 @@ class SuseFirewallChecks(FirewallChecks):
   def check_result(self):
     result = False
     if self.returncode == 0:
-      if "SuSEfirewall2 not active" in self.stdoutdata:
+      if "unused" in self.stdoutdata:
         result = False
-      elif "### iptables" in self.stdoutdata:
+      elif "running" in self.stdoutdata:
         result = True
     return result
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/3c455299/ambari-server/src/test/python/TestAmbariServer.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/python/TestAmbariServer.py b/ambari-server/src/test/python/TestAmbariServer.py
index ad4505a..b0e7e9c 100644
--- a/ambari-server/src/test/python/TestAmbariServer.py
+++ b/ambari-server/src/test/python/TestAmbariServer.py
@@ -1880,11 +1880,11 @@ class TestAmbariServer(TestCase):
     get_os_family_mock.return_value = OSConst.SUSE_FAMILY
 
     firewall_obj = Firewall().getFirewallObject()
-    p.communicate.return_value = ("### iptables", "err")
+    p.communicate.return_value = ("running", "err")
     p.returncode = 0
     self.assertEqual("SuseFirewallChecks", firewall_obj.__class__.__name__)
     self.assertTrue(firewall_obj.check_firewall())
-    p.communicate.return_value = ("SuSEfirewall2 not active", "err")
+    p.communicate.return_value = ("unused", "err")
     p.returncode = 0
     self.assertFalse(firewall_obj.check_firewall())
     self.assertEqual("err", firewall_obj.stderrdata)


[07/22] ambari git commit: AMBARI-14723. NPE when provisioning cluster with a Cluster template which doesn't contain all hostgroups defined in Blueprint. (Sandor Magyari via rnettleton)

Posted by nc...@apache.org.
AMBARI-14723. NPE when provisioning cluster with a Cluster template which doesn't contain all hostgroups defined in Blueprint. (Sandor Magyari via rnettleton)


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

Branch: refs/heads/branch-dev-patch-upgrade
Commit: f8fe788a2d208acff4a88fc5a1a17549cfe16100
Parents: 8623361
Author: Bob Nettleton <rn...@hortonworks.com>
Authored: Wed Jan 20 13:33:03 2016 -0500
Committer: Bob Nettleton <rn...@hortonworks.com>
Committed: Wed Jan 20 13:33:18 2016 -0500

----------------------------------------------------------------------
 .../server/topology/ClusterTopologyImpl.java    |  7 ++++-
 .../topology/ClusterTopologyImplTest.java       | 28 +++++++++++++++++++-
 2 files changed, 33 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/f8fe788a/ambari-server/src/main/java/org/apache/ambari/server/topology/ClusterTopologyImpl.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/topology/ClusterTopologyImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/topology/ClusterTopologyImpl.java
index 91965f1..05dc504 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/topology/ClusterTopologyImpl.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/topology/ClusterTopologyImpl.java
@@ -173,7 +173,12 @@ public class ClusterTopologyImpl implements ClusterTopology {
     Collection<String> hosts = new ArrayList<String>();
     Collection<String> hostGroups = getHostGroupsForComponent(component);
     for (String group : hostGroups) {
-      hosts.addAll(getHostGroupInfo().get(group).getHostNames());
+      HostGroupInfo hostGroupInfo = getHostGroupInfo().get(group);
+      if (hostGroupInfo != null) {
+        hosts.addAll(hostGroupInfo.getHostNames());
+      } else {
+        LOG.warn("HostGroup {} not found, when checking for hosts for component {}", group, component);
+      }
     }
     return hosts;
   }

http://git-wip-us.apache.org/repos/asf/ambari/blob/f8fe788a/ambari-server/src/test/java/org/apache/ambari/server/topology/ClusterTopologyImplTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/topology/ClusterTopologyImplTest.java b/ambari-server/src/test/java/org/apache/ambari/server/topology/ClusterTopologyImplTest.java
index 7c68482..95e58ae 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/topology/ClusterTopologyImplTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/topology/ClusterTopologyImplTest.java
@@ -24,6 +24,7 @@ import org.junit.Test;
 
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
@@ -101,6 +102,11 @@ public class ClusterTopologyImplTest {
     Set<Component> group1Components = new HashSet<Component>();
     group1Components.add(new Component("component1"));
     group1Components.add(new Component("component2"));
+
+    Set<String> group1ComponentNames = new HashSet<String>();
+    group1ComponentNames.add("component1");
+    group1ComponentNames.add("component2");
+
     Set<Component> group2Components = new HashSet<Component>();
     group2Components.add(new Component("component3"));
     Set<Component> group3Components = new HashSet<Component>();
@@ -123,6 +129,11 @@ public class ClusterTopologyImplTest {
     expect(group2.getComponents()).andReturn(group2Components).anyTimes();
     expect(group3.getComponents()).andReturn(group3Components).anyTimes();
     expect(group4.getComponents()).andReturn(group4Components).anyTimes();
+
+    expect(group1.getComponentNames()).andReturn(group1ComponentNames).anyTimes();
+    expect(group2.getComponentNames()).andReturn(Collections.singletonList("component3")).anyTimes();
+    expect(group3.getComponentNames()).andReturn(Collections.singletonList("component4")).anyTimes();
+    expect(group4.getComponentNames()).andReturn(Collections.singletonList("component5")).anyTimes();
   }
 
   @After
@@ -156,7 +167,7 @@ public class ClusterTopologyImplTest {
   }
 
   @Test
-  public void testCreate_validatorSuccess() throws Exception {
+     public void testCreate_validatorSuccess() throws Exception {
     TestTopologyRequest request = new TestTopologyRequest(TopologyRequest.Type.PROVISION);
 
     TopologyValidator validator = createStrictMock(TopologyValidator.class);
@@ -182,6 +193,21 @@ public class ClusterTopologyImplTest {
     new ClusterTopologyImpl(null, request);
   }
 
+  @Test
+  public void test_GetHostAssigmentForComponents() throws Exception {
+    TestTopologyRequest request = new TestTopologyRequest(TopologyRequest.Type.PROVISION);
+
+    TopologyValidator validator = createStrictMock(TopologyValidator.class);
+    topologyValidators.add(validator);
+
+    validator.validate((ClusterTopology) notNull());
+
+    replayAll();
+    replay(validator);
+
+    new ClusterTopologyImpl(null, request).getHostAssignmentsForComponent("component1");
+  }
+
   private class TestTopologyRequest implements TopologyRequest {
     private Type type;