You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by at...@apache.org on 2016/09/06 09:38:10 UTC

ambari git commit: AMBARI-18311 Cover controllers of Resource Manager HA with unit tests. (atkach)

Repository: ambari
Updated Branches:
  refs/heads/trunk 2a18fe4fe -> 151bde11f


AMBARI-18311 Cover controllers of Resource Manager HA with unit tests. (atkach)


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

Branch: refs/heads/trunk
Commit: 151bde11f66882fbe67733edf287c31c7881d9c4
Parents: 2a18fe4
Author: Andrii Tkach <at...@apache.org>
Authored: Mon Sep 5 21:22:06 2016 +0300
Committer: Andrii Tkach <at...@apache.org>
Committed: Tue Sep 6 12:37:20 2016 +0300

----------------------------------------------------------------------
 ambari-web/app/assets/test/tests.js             |   2 +
 .../resourceManager/step3_controller_test.js    | 301 ++++++++++++++++--
 .../resourceManager/step4_controller_test.js    | 305 +++++++++++++++++++
 .../resourceManager/wizard_controller_test.js   | 282 +++++++++++++++++
 .../service/reassign/step6_controller_test.js   |   3 +-
 5 files changed, 859 insertions(+), 34 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/151bde11/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 4c9b192..d2f3637 100644
--- a/ambari-web/app/assets/test/tests.js
+++ b/ambari-web/app/assets/test/tests.js
@@ -79,6 +79,8 @@ var files = [
   'test/controllers/main/admin/highAvailability/nameNode/step3_controller_test',
   'test/controllers/main/admin/highAvailability/nameNode/step4_controller_test',
   'test/controllers/main/admin/highAvailability/resourceManager/step3_controller_test',
+  'test/controllers/main/admin/highAvailability/resourceManager/step4_controller_test',
+  'test/controllers/main/admin/highAvailability/resourceManager/wizard_controller_test',
   'test/controllers/main/admin/highAvailability/hawq/addStandby/step3_controller_test',
   'test/controllers/main/admin/highAvailability/hawq/removeStandby/step2_controller_test',
   'test/controllers/main/admin/highAvailability/hawq/activateStandby/step2_controller_test',

http://git-wip-us.apache.org/repos/asf/ambari/blob/151bde11/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 3e6f7bb..665d8e6 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
@@ -19,15 +19,20 @@
 var App = require('app');
 require('controllers/main/admin/highAvailability/resourceManager/step3_controller');
 var testHelpers = require('test/helpers');
+var blueprintUtils = require('utils/blueprint');
 
 describe('App.RMHighAvailabilityWizardStep3Controller', function () {
+  var controller;
+
+  beforeEach(function() {
+    controller = App.RMHighAvailabilityWizardStep3Controller.create({
+      content: Em.Object.create({})
+    });
+  });
 
   describe('#isSubmitDisabled', function () {
 
-    var controller = App.RMHighAvailabilityWizardStep3Controller.create({
-        content: Em.Object.create({})
-      }),
-      cases = [
+    var cases = [
         {
           isLoaded: false,
           isSubmitDisabled: true,
@@ -51,10 +56,6 @@ describe('App.RMHighAvailabilityWizardStep3Controller', function () {
 
   describe('#loadConfigTagsSuccessCallback', function () {
 
-    var controller = App.RMHighAvailabilityWizardStep3Controller.create({
-      content: Em.Object.create({})
-    });
-
     it('should send proper ajax request', function () {
       controller.loadConfigTagsSuccessCallback({
         'Clusters': {
@@ -82,10 +83,7 @@ describe('App.RMHighAvailabilityWizardStep3Controller', function () {
 
   describe('#loadConfigsSuccessCallback', function () {
 
-    var controller = App.RMHighAvailabilityWizardStep3Controller.create({
-        content: Em.Object.create({})
-      }),
-      cases = [
+    var cases = [
         {
           'items': [],
           'params': {
@@ -184,10 +182,6 @@ describe('App.RMHighAvailabilityWizardStep3Controller', function () {
 
   describe('#loadConfigsSuccessCallback=loadConfigsErrorCallback(we have one callback for bouth cases)', function () {
 
-    var controller = App.RMHighAvailabilityWizardStep3Controller.create({
-      content: Em.Object.create({})
-    });
-
     beforeEach(function () {
       sinon.stub(controller, 'setDynamicConfigValues', Em.K);
     });
@@ -232,23 +226,7 @@ describe('App.RMHighAvailabilityWizardStep3Controller', function () {
       ]
     };
 
-    var controller = App.RMHighAvailabilityWizardStep3Controller.create({
-        content: Em.Object.create({
-          masterComponentHosts: [
-            {component: 'RESOURCEMANAGER', hostName: 'h0', isInstalled: true},
-            {component: 'RESOURCEMANAGER', hostName: 'h1', isInstalled: false},
-            {component: 'ZOOKEEPER_SERVER', hostName: 'h2', isInstalled: true},
-            {component: 'ZOOKEEPER_SERVER', hostName: 'h3', isInstalled: true}
-          ],
-          slaveComponentHosts: [],
-          hosts: {},
-          rmHosts: {
-            currentRM: 'h0',
-            additionalRM: 'h1'
-          }
-        })
-      }),
-      configs = {
+    var configs = {
         configs: [
           Em.Object.create({
             name: 'yarn.resourcemanager.hostname.rm1'
@@ -300,6 +278,20 @@ describe('App.RMHighAvailabilityWizardStep3Controller', function () {
           })
         ];
       });
+      controller.set('content', Em.Object.create({
+        masterComponentHosts: [
+          {component: 'RESOURCEMANAGER', hostName: 'h0', isInstalled: true},
+          {component: 'RESOURCEMANAGER', hostName: 'h1', isInstalled: false},
+          {component: 'ZOOKEEPER_SERVER', hostName: 'h2', isInstalled: true},
+          {component: 'ZOOKEEPER_SERVER', hostName: 'h3', isInstalled: true}
+        ],
+        slaveComponentHosts: [],
+        hosts: {},
+        rmHosts: {
+          currentRM: 'h0',
+          additionalRM: 'h1'
+        }
+      }));
       controller.setDynamicConfigValues(configs, data);
     });
 
@@ -363,7 +355,250 @@ describe('App.RMHighAvailabilityWizardStep3Controller', function () {
     it('hadoop.proxyuser.yarn.hosts recommendedValue', function () {
       expect(configs.configs.findProperty('name', 'hadoop.proxyuser.yarn.hosts').get('recommendedValue')).to.equal('h0,h1');
     });
+  });
+
+  describe("#loadStep()", function () {
+
+    beforeEach(function() {
+      sinon.stub(controller, 'renderConfigs');
+    });
+
+    afterEach(function() {
+      controller.renderConfigs.restore();
+    });
+
+    it("renderConfigs should be called", function() {
+      controller.loadStep();
+      expect(controller.renderConfigs.calledOnce).to.be.true;
+    });
+  });
+
+  describe("#renderConfigs()", function () {
+    var serviceConfig = App.ServiceConfig.create({
+      serviceName: 'MISC',
+      displayName: 'MISC',
+      configCategories: [],
+      showConfig: true,
+      configs: []
+    });
 
+    beforeEach(function() {
+      sinon.stub(controller, 'renderConfigProperties');
+      sinon.stub(App.Service, 'find').returns([Em.Object.create({
+        serviceName: 'S1'
+      })]);
+    });
+
+    afterEach(function() {
+      controller.renderConfigProperties.restore();
+      App.Service.find.restore();
+    });
+
+    it("renderConfigProperties should be called", function() {
+      controller.renderConfigs();
+      expect(controller.renderConfigProperties.getCall(0).args[1]).to.be.eql(serviceConfig);
+    });
+
+    it("App.ajax.send should be called", function() {
+      controller.renderConfigs();
+      var args = testHelpers.findAjaxRequest('name', 'config.tags');
+      expect(args[0]).to.be.eql({
+        name: 'config.tags',
+        sender: controller,
+        success: 'loadConfigTagsSuccessCallback',
+        error: 'loadConfigsErrorCallback',
+        data: {
+          serviceConfig: serviceConfig
+        }
+      });
+    });
+  });
+
+  describe("#renderConfigProperties()", function () {
+
+    beforeEach(function() {
+      sinon.stub(App.ServiceConfigProperty, 'create', function(obj) {
+        return obj;
+      });
+    });
+
+    afterEach(function() {
+      App.ServiceConfigProperty.create.restore();
+    });
+
+    it("config should be added", function() {
+      var componentConfig = {
+        configs: []
+      };
+      var _componentConfig = {
+        configs: [
+          Em.Object.create({
+            isReconfigurable: true
+          })
+        ]
+      };
+      controller.renderConfigProperties(_componentConfig, componentConfig);
+      expect(componentConfig.configs[0].get('isEditable')).to.be.true;
+    });
+  });
+
+  describe("#submit()", function () {
+    var container = {
+      getKDCSessionState: Em.clb
+    };
+
+    beforeEach(function() {
+      sinon.stub(App, 'get').returns(container);
+      sinon.stub(App.router, 'send');
+    });
+
+    afterEach(function() {
+      App.get.restore();
+      App.router.send.restore();
+    });
+
+    it("App.router.send should not be called", function() {
+      controller.reopen({
+        isSubmitDisabled: true
+      });
+      controller.submit();
+      expect(App.router.send.called).to.be.false;
+    });
+
+    it("App.router.send should be called", function() {
+      controller.reopen({
+        isSubmitDisabled: false
+      });
+      controller.submit();
+      expect(App.router.send.calledOnce).to.be.true;
+    });
+  });
+
+  describe("#loadRecommendations()", function () {
+
+    beforeEach(function() {
+      sinon.stub(controller, 'getCurrentMasterSlaveBlueprint').returns({
+        blueprint: {}
+      });
+      sinon.stub(blueprintUtils, 'getHostGroupByFqdn').returns('g1');
+      sinon.stub(blueprintUtils, 'addComponentToHostGroup');
+      sinon.stub(App.Service, 'find').returns([{serviceName: 'S1'}]);
+      this.mockGet = sinon.stub(App, 'get');
+      this.mockGet.withArgs('allHostNames').returns(['host1']);
+      this.mockGet.withArgs('stackVersionURL').returns('/stacks/HDP/versions/2.2');
+    });
+
+    afterEach(function() {
+      controller.getCurrentMasterSlaveBlueprint.restore();
+      blueprintUtils.getHostGroupByFqdn.restore();
+      blueprintUtils.addComponentToHostGroup.restore();
+      App.Service.find.restore();
+      this.mockGet.restore();
+    });
+
+    it("addComponentToHostGroup should be called", function() {
+      controller.loadRecommendations({});
+      expect(blueprintUtils.addComponentToHostGroup.getCall(0).args).to.be.eql([
+        {blueprint: {configurations:{}}}, 'RESOURCEMANAGER', 'g1'
+      ]);
+    });
+
+    it("App.ajax.send should be called", function() {
+      controller.loadRecommendations({});
+      var args = testHelpers.findAjaxRequest('name', 'config.recommendations');
+      expect(JSON.stringify(args[0])).to.be.equal(JSON.stringify({
+        name: 'config.recommendations',
+        sender: controller,
+        data: {
+          stackVersionUrl: "/stacks/HDP/versions/2.2",
+          dataToSend: {
+            recommend: 'configurations',
+            hosts: ["host1"],
+            services: ['S1'],
+            recommendations: {blueprint: {configurations:{}}}
+          }
+        }
+      }));
+    });
+  });
+
+  describe("#applyRecommendedConfigurations()", function () {
+    var configurations = Em.Object.create({
+        items: [
+          {
+            type: 'yarn-env',
+            properties: {
+              'yarn_user': 'user1'
+            }
+          }
+        ]
+      }),
+      recommendations = {
+        resources: [{
+          recommendations: {
+            blueprint: {
+              configurations: {
+                'core-site': {
+                  properties: {
+                    'hadoop.proxyuser.user1.hosts': 'host1',
+                    'hadoop.proxyuser.user2.hosts': 'host1'
+                  }
+                }
+              }
+            }
+          }
+        }]
+      };
+
+    beforeEach(function() {
+      sinon.stub(App.config, 'createDefaultConfig').returns({});
+      sinon.stub(App.config, 'getConfigTagFromFileName').returns('file1');
+      sinon.stub(App.ServiceConfigProperty, 'create', function(obj) {
+        return obj;
+      });
+    });
+
+    afterEach(function() {
+      App.config.createDefaultConfig.restore();
+      App.config.getConfigTagFromFileName.restore();
+      App.ServiceConfigProperty.create.restore();
+    });
+
+    it("config value should be set", function() {
+      var stepConfigs = Em.Object.create({
+        configs: [
+          Em.Object.create({
+            name: 'hadoop.proxyuser.user1.hosts'
+          })
+        ]
+      });
+      controller.applyRecommendedConfigurations(recommendations, configurations, stepConfigs);
+      expect(stepConfigs.get('configs')[0].get('recommendedValue')).to.be.equal('host1');
+      expect(stepConfigs.get('configs')[0].get('value')).to.be.equal('host1');
+    });
+
+    it("new property should be added", function() {
+      var stepConfigs = Em.Object.create({
+        configs: [
+          Em.Object.create({
+            name: 'hadoop.proxyuser.user2.hosts'
+          })
+        ]
+      });
+      controller.applyRecommendedConfigurations(recommendations, configurations, stepConfigs);
+      expect(App.config.createDefaultConfig.getCall(0).args).to.be.eql(['hadoop.proxyuser.user1.hosts', 'core-site', false, {
+        category : "HDFS",
+        isUserProperty: false,
+        isEditable: false,
+        isOverridable: false,
+        serviceName: 'MISC',
+        value: 'host1',
+        recommendedValue: 'host1'
+      }]);
+      expect(stepConfigs.get('configs')[1]).to.be.eql({
+        filename: 'file1'
+      });
+    });
   });
 
 });

http://git-wip-us.apache.org/repos/asf/ambari/blob/151bde11/ambari-web/test/controllers/main/admin/highAvailability/resourceManager/step4_controller_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/controllers/main/admin/highAvailability/resourceManager/step4_controller_test.js b/ambari-web/test/controllers/main/admin/highAvailability/resourceManager/step4_controller_test.js
new file mode 100644
index 0000000..b2bc940
--- /dev/null
+++ b/ambari-web/test/controllers/main/admin/highAvailability/resourceManager/step4_controller_test.js
@@ -0,0 +1,305 @@
+/**
+ * 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.
+ */
+
+var App = require('app');
+require('controllers/main/admin/highAvailability/resourceManager/step4_controller');
+var testHelpers = require('test/helpers');
+
+describe('App.RMHighAvailabilityWizardStep4Controller', function () {
+  var controller;
+
+  beforeEach(function() {
+    controller = App.RMHighAvailabilityWizardStep4Controller.create({
+      content: Em.Object.create({})
+    });
+  });
+
+  describe("#initializeTasks()", function () {
+
+    beforeEach(function() {
+      sinon.stub(App.Service, 'find').returns([]);
+    });
+
+    afterEach(function() {
+      App.Service.find.restore();
+    });
+
+    it("reconfigureHAWQ should be removed", function() {
+      controller.initializeTasks();
+      expect(controller.get('tasks').mapProperty('command')).to.not.contain('reconfigureHAWQ');
+    });
+  });
+
+  describe("#stopRequiredServices()", function () {
+
+    beforeEach(function() {
+      sinon.stub(controller, 'stopServices');
+    });
+
+    afterEach(function() {
+      controller.stopServices.restore();
+    });
+
+    it("stopServices should be called", function() {
+      controller.stopRequiredServices();
+      expect(controller.stopServices.calledWith(['HDFS'])).to.be.true;
+    });
+  });
+
+  describe("#installResourceManager()", function () {
+
+    beforeEach(function() {
+      sinon.stub(controller, 'createInstallComponentTask');
+    });
+
+    afterEach(function() {
+      controller.createInstallComponentTask.restore();
+    });
+
+    it("createInstallComponentTask should be called", function() {
+      controller.set('content.rmHosts', {additionalRM: 'host1'});
+      controller.installResourceManager();
+      expect(controller.createInstallComponentTask.calledWith('RESOURCEMANAGER', 'host1', 'YARN')).to.be.true;
+    });
+  });
+
+  describe("#reconfigureYARN()", function () {
+
+    beforeEach(function() {
+      sinon.stub(controller, 'loadConfigsTags');
+    });
+
+    afterEach(function() {
+      controller.loadConfigsTags.restore();
+    });
+
+    it("loadConfigsTags should be called", function() {
+      controller.reconfigureYARN();
+      expect(controller.loadConfigsTags.calledWith('Yarn')).to.be.true;
+    });
+  });
+
+  describe("#reconfigureHAWQ()", function () {
+
+    beforeEach(function() {
+      sinon.stub(controller, 'loadConfigsTags');
+    });
+
+    afterEach(function() {
+      controller.loadConfigsTags.restore();
+    });
+
+    it("loadConfigsTags should be called", function() {
+      controller.reconfigureHAWQ();
+      expect(controller.loadConfigsTags.calledWith('Hawq')).to.be.true;
+    });
+  });
+
+  describe("#reconfigureHDFS()", function () {
+
+    beforeEach(function() {
+      sinon.stub(controller, 'loadConfigsTags');
+    });
+
+    afterEach(function() {
+      controller.loadConfigsTags.restore();
+    });
+
+    it("loadConfigsTags should be called", function() {
+      controller.reconfigureHDFS();
+      expect(controller.loadConfigsTags.calledWith('Hdfs')).to.be.true;
+    });
+  });
+
+  describe("#loadConfigsTags()", function () {
+
+    it("App.ajax.send should be called", function() {
+      controller.loadConfigsTags('S1');
+      var args = testHelpers.findAjaxRequest('name', 'config.tags');
+      expect(args[0]).to.be.eql({
+        name: 'config.tags',
+        sender: controller,
+        success: 'onLoadS1ConfigsTags',
+        error: 'onTaskError'
+      });
+    });
+  });
+
+  describe("#onLoadYarnConfigsTags()", function () {
+
+    it("App.ajax.send should be called", function() {
+      var data = {
+        Clusters: {
+          desired_configs: {
+            'yarn-site': {
+              tag: 1
+            }
+          }
+        }
+      };
+      controller.onLoadYarnConfigsTags(data);
+      var args = testHelpers.findAjaxRequest('name', 'reassign.load_configs');
+      expect(args[0]).to.be.eql({
+        name: 'reassign.load_configs',
+        sender: controller,
+        data: {
+          urlParams: '(type=yarn-site&tag=1)',
+          type: 'yarn-site'
+        },
+        success: 'onLoadConfigs',
+        error: 'onTaskError'
+      });
+    });
+  });
+
+  describe("#onLoadHawqConfigsTags()", function () {
+
+    it("App.ajax.send should be called", function() {
+      var data = {
+        Clusters: {
+          desired_configs: {
+            'yarn-client': {
+              tag: 1
+            }
+          }
+        }
+      };
+      controller.onLoadHawqConfigsTags(data);
+      var args = testHelpers.findAjaxRequest('name', 'reassign.load_configs');
+      expect(args[0]).to.be.eql({
+        name: 'reassign.load_configs',
+        sender: controller,
+        data: {
+          urlParams: '(type=yarn-client&tag=1)',
+          type: 'yarn-client'
+        },
+        success: 'onLoadConfigs',
+        error: 'onTaskError'
+      });
+    });
+  });
+
+  describe("#onLoadHdfsConfigsTags()", function () {
+
+    it("App.ajax.send should be called", function() {
+      var data = {
+        Clusters: {
+          desired_configs: {
+            'core-site': {
+              tag: 1
+            }
+          }
+        }
+      };
+      controller.onLoadHdfsConfigsTags(data);
+      var args = testHelpers.findAjaxRequest('name', 'reassign.load_configs');
+      expect(args[0]).to.be.eql({
+        name: 'reassign.load_configs',
+        sender: controller,
+        data: {
+          urlParams: '(type=core-site&tag=1)',
+          type: 'core-site'
+        },
+        success: 'onLoadConfigs',
+        error: 'onTaskError'
+      });
+    });
+  });
+
+  describe("#onLoadConfigs()", function () {
+
+    beforeEach(function() {
+      sinon.stub(controller, 'reconfigureSites').returns({});
+      controller.set('content.configs', [
+        {
+          filename: 't1',
+          name: 'p1',
+          value: 'val1'
+        }
+      ]);
+      sinon.stub(App.format, 'role').returns('comp1');
+    });
+
+    afterEach(function() {
+      controller.reconfigureSites.restore();
+      App.format.role.restore();
+    });
+
+    it("reconfigureSites should be called", function() {
+      var data = {
+        items: [{
+          properties: {}
+        }]
+      };
+      var str = Em.I18n.t('admin.highAvailability.step4.save.configuration.note').format('comp1');
+      controller.onLoadConfigs(data, {}, {type: 't1'});
+      expect(controller.reconfigureSites.getCall(0).args).to.be.eql([['t1'], data, str]);
+    });
+
+    it("App.ajax.send should be called", function() {
+      var data = {
+        items: [{
+          properties: {}
+        }]
+      };
+      controller.onLoadConfigs(data, {}, {type: 't1'});
+      var args = testHelpers.findAjaxRequest('name', 'common.service.configurations');
+      expect(args[0]).to.be.eql({
+        name: 'common.service.configurations',
+        sender: controller,
+        data: {
+          desired_config: {}
+        },
+        success: 'onSaveConfigs',
+        error: 'onTaskError'
+      });
+    });
+  });
+
+  describe("#onSaveConfigs()", function () {
+
+    beforeEach(function() {
+      sinon.stub(controller, 'onTaskCompleted');
+    });
+
+    afterEach(function() {
+      controller.onTaskCompleted.restore();
+    });
+
+    it("onTaskCompleted should be called", function() {
+      controller.onSaveConfigs();
+      expect(controller.onTaskCompleted.calledOnce).to.be.true;
+    });
+  });
+
+  describe("#startAllServices()", function () {
+
+    beforeEach(function() {
+      sinon.stub(controller, 'startServices');
+    });
+
+    afterEach(function() {
+      controller.startServices.restore();
+    });
+
+    it("startServices should be called", function() {
+      controller.startAllServices();
+      expect(controller.startServices.calledWith(true)).to.be.true;
+    });
+  });
+});

http://git-wip-us.apache.org/repos/asf/ambari/blob/151bde11/ambari-web/test/controllers/main/admin/highAvailability/resourceManager/wizard_controller_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/controllers/main/admin/highAvailability/resourceManager/wizard_controller_test.js b/ambari-web/test/controllers/main/admin/highAvailability/resourceManager/wizard_controller_test.js
new file mode 100644
index 0000000..5a991d3
--- /dev/null
+++ b/ambari-web/test/controllers/main/admin/highAvailability/resourceManager/wizard_controller_test.js
@@ -0,0 +1,282 @@
+/**
+ * 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.
+ */
+
+var App = require('app');
+require('controllers/main/admin/highAvailability/resourceManager/wizard_controller');
+var testHelpers = require('test/helpers');
+
+describe('App.RMHighAvailabilityWizardController', function () {
+  var controller;
+
+  beforeEach(function() {
+    controller = App.RMHighAvailabilityWizardController.create({
+      content: Em.Object.create({})
+    });
+  });
+
+  describe("#loadMap 1st step callback", function () {
+
+    beforeEach(function() {
+      sinon.stub(controller, 'load');
+    });
+
+    afterEach(function() {
+      controller.load.restore();
+    });
+
+    it("load should be called", function() {
+      controller.get('loadMap.1')[0].callback.apply(controller);
+      expect(controller.load.calledWith('cluster')).to.be.true;
+    });
+  });
+
+  describe("#loadMap 2nd step callback", function () {
+
+    beforeEach(function() {
+      sinon.stub(controller, 'loadRmHosts');
+      sinon.stub(controller, 'loadServicesFromServer');
+      sinon.stub(controller, 'loadMasterComponentHosts').returns({done: Em.clb});
+      sinon.stub(controller, 'loadConfirmedHosts');
+      controller.get('loadMap.2')[0].callback.apply(controller);
+    });
+
+    afterEach(function() {
+      controller.loadRmHosts.restore();
+      controller.loadServicesFromServer.restore();
+      controller.loadMasterComponentHosts.restore();
+      controller.loadConfirmedHosts.restore();
+    });
+
+    it("loadRmHosts should be called", function() {
+      expect(controller.loadRmHosts.calledOnce).to.be.true;
+    });
+
+    it("loadServicesFromServer should be called", function() {
+      expect(controller.loadServicesFromServer.calledOnce).to.be.true;
+    });
+
+    it("loadMasterComponentHosts should be called", function() {
+      expect(controller.loadMasterComponentHosts.calledOnce).to.be.true;
+    });
+
+    it("loadConfirmedHosts should be called", function() {
+      expect(controller.loadConfirmedHosts.calledOnce).to.be.true;
+    });
+  });
+
+  describe("#loadMap 4th step callback", function () {
+
+    beforeEach(function() {
+      sinon.stub(controller, 'loadTasksStatuses');
+      sinon.stub(controller, 'loadTasksRequestIds');
+      sinon.stub(controller, 'loadRequestIds');
+      sinon.stub(controller, 'loadConfigs');
+      controller.get('loadMap.4')[0].callback.apply(controller);
+    });
+
+    afterEach(function() {
+      controller.loadTasksStatuses.restore();
+      controller.loadTasksRequestIds.restore();
+      controller.loadRequestIds.restore();
+      controller.loadConfigs.restore();
+    });
+
+    it("loadTasksStatuses should be called", function() {
+      expect(controller.loadTasksStatuses.calledOnce).to.be.true;
+    });
+
+    it("loadTasksRequestIds should be called", function() {
+      expect(controller.loadTasksRequestIds.calledOnce).to.be.true;
+    });
+
+    it("loadRequestIds should be called", function() {
+      expect(controller.loadRequestIds.calledOnce).to.be.true;
+    });
+
+    it("loadConfigs should be called", function() {
+      expect(controller.loadConfigs.calledOnce).to.be.true;
+    });
+  });
+
+  describe("#init()", function () {
+
+    beforeEach(function() {
+      sinon.stub(controller, 'clearStep');
+    });
+
+    afterEach(function() {
+      controller.clearStep.restore();
+    });
+
+    it("clearStep should be called", function() {
+      controller.init();
+      expect(controller.clearStep.calledOnce).to.be.true;
+    });
+  });
+
+  describe("#clearStep()", function () {
+
+    it("isFinished should be false", function() {
+      controller.clearStep();
+      expect(controller.get('isFinished')).to.be.false;
+    });
+  });
+
+  describe("#setCurrentStep()", function () {
+
+    beforeEach(function() {
+      sinon.stub(App.clusterStatus, 'setClusterStatus');
+    });
+
+    afterEach(function() {
+      App.clusterStatus.setClusterStatus.restore();
+    });
+
+    it("App.clusterStatus.setClusterStatus should be called", function() {
+      controller.setCurrentStep();
+      expect(App.clusterStatus.setClusterStatus.calledOnce).to.be.true;
+    });
+  });
+
+  describe("#saveRmHosts()", function () {
+
+    beforeEach(function() {
+      sinon.stub(controller, 'setDBProperty');
+    });
+
+    afterEach(function() {
+      controller.setDBProperty.restore();
+    });
+
+    it("rmHosts should be set", function() {
+      controller.saveRmHosts(['host1']);
+      expect(controller.get('content.rmHosts')).to.be.eql(['host1']);
+    });
+
+    it("setDBProperty should be called", function() {
+      controller.saveRmHosts(['host1']);
+      expect(controller.setDBProperty.calledWith('rmHosts', ['host1'])).to.be.true;
+    });
+  });
+
+  describe("#loadRmHosts()", function () {
+
+    beforeEach(function() {
+      sinon.stub(controller, 'getDBProperty').returns(['host1']);
+    });
+
+    afterEach(function() {
+      controller.getDBProperty.restore();
+    });
+
+    it("rmHosts should be set", function() {
+      controller.loadRmHosts();
+      expect(controller.get('content.rmHosts')).to.be.eql(['host1']);
+    });
+  });
+
+  describe("#saveConfigs()", function () {
+
+    beforeEach(function() {
+      sinon.stub(controller, 'setDBProperty');
+    });
+
+    afterEach(function() {
+      controller.setDBProperty.restore();
+    });
+
+    it("configs should be set", function() {
+      controller.saveConfigs([{}]);
+      expect(controller.get('content.configs')).to.be.eql([{}]);
+    });
+
+    it("setDBProperty should be called", function() {
+      controller.saveConfigs([{}]);
+      expect(controller.setDBProperty.calledWith('configs', [{}])).to.be.true;
+    });
+  });
+
+  describe("#loadConfigs()", function () {
+
+    beforeEach(function() {
+      sinon.stub(controller, 'getDBProperty').returns([{}]);
+    });
+
+    afterEach(function() {
+      controller.getDBProperty.restore();
+    });
+
+    it("configs should be set", function() {
+      controller.loadConfigs();
+      expect(controller.get('content.configs')).to.be.eql([{}]);
+    });
+  });
+
+  describe("#clearAllSteps()", function () {
+
+    beforeEach(function() {
+      sinon.stub(controller, 'clearInstallOptions');
+      sinon.stub(controller, 'getCluster').returns({});
+      controller.clearAllSteps();
+    });
+
+    afterEach(function() {
+      controller.clearInstallOptions.restore();
+      controller.getCluster.restore();
+    });
+
+    it("clearInstallOptions should be called", function() {
+      expect(controller.clearInstallOptions.calledOnce).to.be.true;
+    });
+
+    it("cluster should be set", function() {
+      expect(controller.get('content.cluster')).to.be.eql({});
+    });
+  });
+
+  describe("#finish()", function () {
+    var container = {
+      updateAll: Em.K
+    };
+
+    beforeEach(function() {
+      sinon.stub(controller, 'resetDbNamespace');
+      sinon.stub(App.router, 'get').returns(container);
+      sinon.stub(container, 'updateAll');
+      controller.finish();
+    });
+
+    afterEach(function() {
+      controller.resetDbNamespace.restore();
+      App.router.get.restore();
+      container.updateAll.restore();
+    });
+
+    it("resetDbNamespace should be called", function() {
+      expect(controller.resetDbNamespace.calledOnce).to.be.true;
+    });
+
+    it("updateAll should be called", function() {
+      expect(container.updateAll.calledOnce).to.be.true;
+    });
+
+    it("isFinished should be true", function() {
+      expect(controller.get('isFinished')).to.be.true;
+    });
+  });
+});

http://git-wip-us.apache.org/repos/asf/ambari/blob/151bde11/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 d155c01..c901bf6 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
@@ -30,7 +30,8 @@ describe('App.ReassignMasterWizardStep6Controller', function () {
         reassign: Em.Object.create(),
         reassignHosts: Em.Object.create()
       }),
-      startServices: Em.K
+      startServices: Em.K,
+      tasks: []
     });
   });