blob: 42f6f913871cf4e3a5d22db9ce250e7c953ef056 [file] [log] [blame]
/**
* 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/service/reassign/step4_controller');
require('controllers/main/service/reassign_controller');
var testHelpers = require('test/helpers');
describe('App.ReassignMasterWizardStep4Controller', function () {
var controller = App.ReassignMasterWizardStep4Controller.create({
content: Em.Object.create({
reassign: Em.Object.create(),
reassignHosts: Em.Object.create()
})
});
describe('#getHostComponentsNames()', function () {
it('No host-components', function () {
controller.set('hostComponents', []);
expect(controller.getHostComponentsNames()).to.be.empty;
});
it('one host-components', function () {
controller.set('hostComponents', ['COMP1']);
expect(controller.getHostComponentsNames()).to.equal('Comp1');
});
it('ZKFC host-components', function () {
controller.set('hostComponents', ['COMP1', 'ZKFC']);
expect(controller.getHostComponentsNames()).to.equal('Comp1+ZKFC');
});
});
describe('#testDBConnection', function() {
beforeEach(function() {
controller.set('requiredProperties', Em.A([]));
controller.set('content.configs', Em.Object.create({
'hive-site': {
'javax.jdo.option.ConnectionDriverName': 'mysql'
}
}));
controller.set('content.reassign.component_name', 'HIVE_SERVER');
sinon.stub(controller, 'getConnectionProperty', Em.K);
sinon.stub(App.router, 'get', Em.K);
});
afterEach(function() {
controller.getConnectionProperty.restore();
App.router.get.restore();
});
describe('tests database connection', function() {
beforeEach(function () {
sinon.stub(controller, 'prepareDBCheckAction', Em.K);
});
afterEach(function () {
controller.prepareDBCheckAction.restore();
});
it('prepareDBCheckAction is called once', function() {
controller.testDBConnection();
expect(controller.prepareDBCheckAction.calledOnce).to.be.true;
});
});
it('tests prepareDBCheckAction', function() {
controller.prepareDBCheckAction();
var args = testHelpers.findAjaxRequest('name', 'cluster.custom_action.create');
expect(args).exists;
});
});
describe('#removeUnneededTasks()', function () {
var isHaEnabled = false;
var commands;
var commandsForDB;
beforeEach(function () {
sinon.stub(App, 'get', function () {
return isHaEnabled;
});
commands = [
{ id: 1, command: 'stopRequiredServices' },
{ id: 2, command: 'cleanMySqlServer' },
{ id: 3, command: 'createHostComponents' },
{ id: 4, command: 'putHostComponentsInMaintenanceMode' },
{ id: 5, command: 'reconfigure' },
{ id: 6, command: 'installHostComponents' },
{ id: 7, command: 'startZooKeeperServers' },
{ id: 8, command: 'startNameNode' },
{ id: 9, command: 'deleteHostComponents' },
{ id: 10, command: 'configureMySqlServer' },
{ id: 11, command: 'startMySqlServer' },
{ id: 12, command: 'startNewMySqlServer' },
{ id: 13, command: 'startRequiredServices' }
];
commandsForDB = [
{ id: 1, command: 'createHostComponents' },
{ id: 2, command: 'installHostComponents' },
{ id: 3, command: 'configureMySqlServer' },
{ id: 4, command: 'restartMySqlServer' },
{ id: 5, command: 'testDBConnection' },
{ id: 6, command: 'stopRequiredServices' },
{ id: 7, command: 'cleanMySqlServer' },
{ id: 8, command: 'putHostComponentsInMaintenanceMode' },
{ id: 9, command: 'reconfigure' },
{ id: 10, command: 'deleteHostComponents' },
{ id: 11, command: 'configureMySqlServer' },
{ id: 12, command: 'startRequiredServices' }
];
});
afterEach(function () {
App.get.restore();
});
it('hasManualSteps is false', function () {
controller.set('tasks', commands);
controller.set('content.hasManualSteps', false);
controller.removeUnneededTasks();
expect(controller.get('tasks').mapProperty('id')).to.eql([1, 3, 4, 6, 9, 12, 13]);
});
it('reassign component is not NameNode and HA disabled', function () {
controller.set('tasks', commands);
controller.set('content.hasManualSteps', true);
controller.set('content.reassign.component_name', 'COMP1');
isHaEnabled = false;
controller.removeUnneededTasks();
expect(controller.get('tasks').mapProperty('id')).to.eql([1, 3, 4, 6]);
});
it('reassign component is not NameNode and HA enabled', function () {
controller.set('tasks', commands);
controller.set('content.hasManualSteps', true);
controller.set('content.reassign.component_name', 'COMP1');
isHaEnabled = true;
controller.removeUnneededTasks();
expect(controller.get('tasks').mapProperty('id')).to.eql([1, 3, 4, 6]);
});
it('reassign component is NameNode and HA disabled', function () {
controller.set('tasks', commands);
controller.set('content.hasManualSteps', true);
controller.set('content.reassign.component_name', 'NAMENODE');
isHaEnabled = false;
controller.removeUnneededTasks();
expect(controller.get('tasks').mapProperty('id')).to.eql([1, 3, 4, 6]);
});
it('reassign component is NameNode and HA enabled', function () {
controller.set('tasks', commands);
controller.set('content.hasManualSteps', true);
controller.set('content.reassign.component_name', 'NAMENODE');
isHaEnabled = true;
controller.removeUnneededTasks();
expect(controller.get('tasks').mapProperty('id')).to.eql([1, 3, 4, 6, 7, 8]);
});
it('component with reconfiguration', function () {
controller.set('tasks', commands);
controller.set('content.hasManualSteps', false);
controller.set('content.reassign.component_name', 'COMP1');
controller.set('wizardController', {
isComponentWithReconfiguration: true
});
controller.removeUnneededTasks();
expect(controller.get('tasks').mapProperty('id')).to.eql([1, 3, 4, 5, 6, 9, 13]);
});
it('reassign component is HiveServer and db type is mysql', function () {
controller.set('tasks', commandsForDB);
controller.set('content.hasManualSteps', false);
controller.set('content.databaseType', 'mysql');
controller.set('content.reassign.component_name', 'HIVE_SERVER');
isHaEnabled = false;
controller.removeUnneededTasks();
expect(controller.get('tasks').mapProperty('id')).to.eql([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]);
});
it('reassign component is HiveServer and db type is not mysql', function () {
controller.set('tasks', commandsForDB);
controller.set('content.hasManualSteps', false);
controller.set('content.databaseType', 'derby');
controller.set('content.reassign.component_name', 'HIVE_SERVER');
isHaEnabled = false;
controller.removeUnneededTasks();
expect(controller.get('tasks').mapProperty('id')).to.eql([1, 2, 6, 8, 9, 10, 12]);
});
it('reassign component is Oozie Server and db type is derby', function () {
controller.set('tasks', commandsForDB);
controller.set('content.hasManualSteps', true);
controller.set('content.databaseType', 'derby');
controller.set('content.reassign.component_name', 'OOZIE_SERVER');
isHaEnabled = false;
controller.removeUnneededTasks();
expect(controller.get('tasks').mapProperty('id')).to.eql([1,2,6,8,9]);
});
it('reassign component is Oozie Server and db type is mysql', function () {
controller.set('content.hasManualSteps', false);
controller.set('content.databaseType', 'mysql');
controller.set('content.reassign.component_name', 'OOZIE_SERVER');
isHaEnabled = false;
controller.set('tasks', commandsForDB);
controller.removeUnneededTasks();
expect(controller.get('tasks').mapProperty('id')).to.eql([1,2,3,4,5,6,7,8,9,10,11,12]);
});
it('reassign component is Mysql Server', function () {
controller.set('content.hasManualSteps', false);
controller.set('content.databaseType', 'mysql');
controller.set('content.reassign.component_name', 'MYSQL_SERVER');
isHaEnabled = false;
controller.set('tasks', commandsForDB);
controller.removeUnneededTasks();
expect(controller.get('tasks').mapProperty('id')).to.eql([1,2,3,4,5,6,8,9,10,11,12]);
});
});
describe("#stopRequiredServices()", function() {
before(function () {
controller.set('wizardController', App.get('router.reassignMasterController'));
sinon.stub(controller, 'stopServices', Em.K);
});
after(function () {
controller.stopServices.restore();
});
it('stopServices is called with valid list of services', function() {
controller.set('content.reassign.component_name', 'HISTORYSERVER');
controller.set('content.componentsToStopAllServices', ['NAMENODE', 'SECONDARY_NAMENODE'])
controller.stopRequiredServices();
expect(controller.stopServices.calledWith(['MAPREDUCE2', 'HIVE', 'PIG', 'OOZIE'], true)).to.be.true;
});
});
describe('#initializeTasks()', function () {
beforeEach(function () {
controller.set('tasks', []);
sinon.stub(controller, 'getHostComponentsNames', Em.K);
sinon.stub(controller, 'removeUnneededTasks', Em.K);
this.mock = sinon.stub(controller, 'isComponentWithDB');
});
afterEach(function () {
controller.removeUnneededTasks.restore();
controller.getHostComponentsNames.restore();
this.mock.restore();
});
it('No commands (isComponentWithDB = false)', function () {
controller.set('commands', []);
controller.set('commandsForDB', []);
this.mock.returns(false);
controller.initializeTasks();
expect(controller.get('tasks')).to.be.empty;
});
it('No commands (isComponentWithDB = true)', function () {
controller.set('commands', []);
controller.set('commandsForDB', []);
this.mock.returns(true);
controller.initializeTasks();
expect(controller.get('tasks')).to.be.empty;
});
it('One command', function () {
controller.set('commands', ['COMMAND1']);
controller.set('commandsForDB', ['COMMAND1']);
controller.initializeTasks();
expect(controller.get('tasks')[0].get('id')).to.equal(0);
expect(controller.get('tasks')[0].get('command')).to.equal('COMMAND1');
});
});
describe('#hideRollbackButton()', function () {
it('No showRollback command', function () {
controller.set('tasks', [Em.Object.create({
showRollback: false
})]);
controller.hideRollbackButton();
expect(controller.get('tasks')[0].get('showRollback')).to.be.false;
});
it('showRollback command is present', function () {
controller.set('tasks', [Em.Object.create({
showRollback: true
})]);
controller.hideRollbackButton();
expect(controller.get('tasks')[0].get('showRollback')).to.be.false;
});
});
describe('#onComponentsTasksSuccess()', function () {
beforeEach(function () {
sinon.stub(controller, 'onTaskCompleted', Em.K);
});
afterEach(function () {
controller.onTaskCompleted.restore();
});
it('One host-component', function () {
controller.set('multiTaskCounter', 1);
controller.set('hostComponents', [
{}
]);
controller.onComponentsTasksSuccess();
expect(controller.get('multiTaskCounter')).to.equal(0);
expect(controller.onTaskCompleted.calledOnce).to.be.true;
});
it('two host-components', function () {
controller.set('multiTaskCounter', 2);
controller.set('hostComponents', [
{},
{}
]);
controller.onComponentsTasksSuccess();
expect(controller.get('multiTaskCounter')).to.equal(1);
expect(controller.onTaskCompleted.called).to.be.false;
});
});
describe('#stopServices()', function () {
it('request is sent', function () {
var servicesToStop;
controller.stopServices(servicesToStop, true, true);
var args = testHelpers.findAjaxRequest('name', 'common.services.update');
expect(args).exists;
});
});
describe('#createHostComponents()', function () {
beforeEach(function () {
sinon.stub(controller, 'createComponent', Em.K);
});
afterEach(function () {
controller.createComponent.restore();
controller.set('dependentHostComponents', []);
});
it('createComponent should be called for each host-component', function () {
controller.set('hostComponents', ['COMP1']);
controller.set('dependentHostComponents', ['COMP2']);
controller.set('content.reassignHosts.target', 'host1');
controller.set('content.reassign.service_id', 'SERVICE1');
controller.createHostComponents();
expect(controller.get('multiTaskCounter')).to.equal(2);
expect(controller.createComponent.getCall(0).args).to.be.eql([
'COMP1', 'host1', 'SERVICE1'
]);
expect(controller.createComponent.getCall(1).args).to.be.eql([
'COMP2', 'host1', 'SERVICE1'
]);
});
});
describe('#onCreateComponent()', function () {
beforeEach(function () {
sinon.stub(controller, 'onComponentsTasksSuccess', Em.K);
});
afterEach(function () {
controller.onComponentsTasksSuccess.restore();
});
it('onComponentsTasksSuccess is called once', function () {
controller.onCreateComponent();
expect(controller.onComponentsTasksSuccess.calledOnce).to.be.true;
});
});
describe('#putHostComponentsInMaintenanceMode()', function () {
beforeEach(function(){
sinon.stub(controller, 'onComponentsTasksSuccess', Em.K);
controller.set('content.reassignHosts.source', 'source');
});
afterEach(function(){
controller.onComponentsTasksSuccess.restore();
});
it('No host-components', function () {
controller.set('hostComponents', []);
controller.putHostComponentsInMaintenanceMode();
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();
var args = testHelpers.findAjaxRequest('name', 'common.host.host_component.passive');
expect(args).exists;
expect(controller.get('multiTaskCounter')).to.equal(1);
});
});
describe('#installHostComponents()', function () {
beforeEach(function () {
sinon.stub(controller, 'updateComponent', Em.K);
});
afterEach(function () {
controller.updateComponent.restore();
controller.set('dependentHostComponents', []);
});
it('No host-components', function () {
controller.set('hostComponents', []);
controller.installHostComponents();
expect(controller.get('multiTaskCounter')).to.equal(0);
expect(controller.updateComponent.called).to.be.false;
});
it('createComponent should be called for each host-component', function () {
controller.set('hostComponents', ['COMP1']);
controller.set('dependentHostComponents', ['COMP2']);
controller.set('content.reassignHosts.target', 'host1');
controller.set('content.reassign.service_id', 'SERVICE1');
controller.installHostComponents();
expect(controller.get('multiTaskCounter')).to.equal(2);
expect(controller.updateComponent.getCall(0).args).to.be.eql([
'COMP1', 'host1', 'SERVICE1', 'Install', 2
]);
expect(controller.updateComponent.getCall(1).args).to.be.eql([
'COMP2', 'host1', 'SERVICE1', 'Install', 2
]);
});
});
describe('#reconfigure()', function () {
beforeEach(function () {
sinon.stub(controller, 'saveClusterStatus', Em.K);
sinon.stub(controller, 'saveConfigsToServer', Em.K);
});
afterEach(function () {
controller.saveClusterStatus.restore();
controller.saveConfigsToServer.restore();
});
it('saveClusterStatus is called once', function () {
controller.reconfigure();
expect(controller.saveClusterStatus.calledOnce).to.be.true;
});
it('saveConfigsToServer is called once', function () {
controller.reconfigure();
expect(controller.saveConfigsToServer.calledOnce).to.be.true;
});
});
describe('#loadStep()', function () {
beforeEach(function () {
controller.set('content.reassign.service_id', 'service1');
sinon.stub(controller, 'onTaskStatusChange', Em.K);
sinon.stub(controller, 'initializeTasks', Em.K);
sinon.stub(controller, 'setDependentHostComponents');
this.mockGet = sinon.stub(App, 'get').returns(true);
});
afterEach(function () {
controller.setDependentHostComponents.restore();
controller.onTaskStatusChange.restore();
controller.initializeTasks.restore();
this.mockGet.restore();
});
it('reassign component is NameNode and HA enabled', function () {
controller.set('content.reassign.component_name', 'NAMENODE');
controller.loadStep();
expect(controller.get('hostComponents')).to.eql(['NAMENODE', 'ZKFC']);
expect(controller.get('serviceName')).to.eql(['service1']);
});
it('reassign component is NameNode and HA disabled', function () {
this.mockGet.returns(false);
controller.set('content.reassign.component_name', 'NAMENODE');
controller.loadStep();
expect(controller.get('hostComponents')).to.eql(['NAMENODE']);
expect(controller.get('serviceName')).to.eql(['service1']);
});
it('reassign component is JOBTRACKER and HA enabled', function () {
controller.set('content.reassign.component_name', 'JOBTRACKER');
controller.loadStep();
expect(controller.get('hostComponents')).to.eql(['JOBTRACKER']);
expect(controller.get('serviceName')).to.eql(['service1']);
});
it('reassign component is RESOURCEMANAGER and HA enabled', function () {
controller.set('content.reassign.component_name', 'RESOURCEMANAGER');
controller.loadStep();
expect(controller.get('hostComponents')).to.eql(['RESOURCEMANAGER']);
expect(controller.get('serviceName')).to.eql(['service1']);
});
it('setDependentHostComponents should be called', function () {
controller.set('content.reassign.component_name', 'RESOURCEMANAGER');
controller.loadStep();
expect(controller.setDependentHostComponents.calledOnce).to.be.true;
});
});
describe('#saveConfigsToServer()', 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();
});
it('getServiceConfigData is called with valid data', function () {
expect(controller.getServiceConfigData.calledWith([1])).to.be.true;
});
it('request is sent', function () {
expect(this.args).exists;
});
});
describe('#getComponentDir()', function () {
var configs = {
'hdfs-site': {
'dfs.name.dir': 'case1',
'dfs.namenode.name.dir': 'case2',
'dfs.namenode.checkpoint.dir': 'case3'
},
'core-site': {
'fs.checkpoint.dir': 'case4'
}
};
it('unknown component name', function () {
expect(controller.getComponentDir(configs, 'COMP1')).to.be.empty;
});
it('NAMENODE component', function () {
expect(controller.getComponentDir(configs, 'NAMENODE')).to.equal('case2');
});
it('SECONDARY_NAMENODE component', function () {
expect(controller.getComponentDir(configs, 'SECONDARY_NAMENODE')).to.equal('case3');
});
});
describe('#saveClusterStatus()', function () {
var mock = {
saveComponentDir: Em.K,
saveSecureConfigs: Em.K
};
beforeEach(function () {
sinon.stub(App.clusterStatus, 'setClusterStatus', Em.K);
sinon.stub(App.router, 'get', function() {
return mock;
});
sinon.spy(mock, 'saveComponentDir');
sinon.spy(mock, 'saveSecureConfigs');
});
afterEach(function () {
App.clusterStatus.setClusterStatus.restore();
App.router.get.restore();
mock.saveSecureConfigs.restore();
mock.saveComponentDir.restore();
});
it('componentDir undefined and secureConfigs is empty', function () {
expect(controller.saveClusterStatus([], null)).to.be.false;
});
it('componentDir defined and secureConfigs is empty', function () {
expect(controller.saveClusterStatus([], 'dir1')).to.be.true;
expect(mock.saveComponentDir.calledWith('dir1')).to.be.true;
expect(mock.saveSecureConfigs.calledWith([])).to.be.true;
});
it('componentDir undefined and secureConfigs has data', function () {
expect(controller.saveClusterStatus([1], null)).to.be.true;
expect(mock.saveComponentDir.calledWith(null)).to.be.true;
expect(mock.saveSecureConfigs.calledWith([1])).to.be.true;
});
it('componentDir defined and secureConfigs has data', function () {
expect(controller.saveClusterStatus([1], 'dir1')).to.be.true;
expect(mock.saveComponentDir.calledWith('dir1')).to.be.true;
expect(mock.saveSecureConfigs.calledWith([1])).to.be.true;
});
});
describe('#onSaveConfigs()', function () {
beforeEach(function () {
sinon.stub(controller, 'onTaskCompleted', Em.K);
});
afterEach(function () {
controller.onTaskCompleted.restore();
});
it('onTaskCompleted called once', function () {
controller.onSaveConfigs();
expect(controller.onTaskCompleted.calledOnce).to.be.true;
});
});
describe('#startZooKeeperServers()', function () {
beforeEach(function () {
sinon.stub(controller, 'updateComponent', Em.K);
});
afterEach(function () {
controller.updateComponent.restore();
});
it('updateComponent called with valid arguments', function () {
controller.set('content.masterComponentHosts', [{
component: 'ZOOKEEPER_SERVER',
hostName: 'host1'
}]);
controller.startZooKeeperServers();
expect(controller.updateComponent.calledWith('ZOOKEEPER_SERVER', ['host1'], 'ZOOKEEPER', 'Start')).to.be.true;
});
});
describe('#startNameNode()', function () {
beforeEach(function () {
sinon.stub(controller, 'updateComponent', Em.K);
controller.set('content.masterComponentHosts', [
{
component: 'NAMENODE',
hostName: 'host1'
},
{
component: 'NAMENODE',
hostName: 'host2'
}
]);
});
afterEach(function () {
controller.updateComponent.restore();
});
it('reassign host does not match current', function () {
controller.set('content.reassignHosts.source', 'host3');
controller.set('content.reassignHosts.target', 'host2');
controller.startNameNode();
expect(controller.updateComponent.getCall(0).args[0]).to.be.equal('NAMENODE');
expect(controller.updateComponent.getCall(0).args[1][0]).to.be.equal('host1');
expect(controller.updateComponent.getCall(0).args[2]).to.be.equal('HDFS');
expect(controller.updateComponent.getCall(0).args[3]).to.be.equal('Start');
});
it('reassign host matches current', function () {
controller.set('content.reassignHosts.target', 'host2');
controller.startNameNode();
expect(controller.updateComponent.calledWith('NAMENODE', ['host1'], 'HDFS', 'Start')).to.be.true;
});
});
describe('#startServices()', 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(this.args).exists;
});
});
describe('#deleteHostComponents()', function () {
it('No host components', function () {
controller.set('hostComponents', []);
controller.set('content.reassignHosts.source', 'host1');
controller.deleteHostComponents();
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();
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(args[1][0].data).to.eql({
"hostName": "host1",
"componentName": 2
});
});
});
describe('#onDeleteHostComponentsError()', function () {
beforeEach(function () {
sinon.stub(controller, 'onComponentsTasksSuccess', Em.K);
sinon.stub(controller, 'onTaskError', Em.K);
});
afterEach(function () {
controller.onComponentsTasksSuccess.restore();
controller.onTaskError.restore();
});
it('task success', function () {
var error = {
responseText: 'org.apache.ambari.server.controller.spi.NoSuchResourceException'
};
controller.onDeleteHostComponentsError(error);
expect(controller.onComponentsTasksSuccess.calledOnce).to.be.true;
});
it('unknown error', function () {
var error = {
responseText: ''
};
controller.onDeleteHostComponentsError(error);
expect(controller.onTaskError.calledOnce).to.be.true;
});
});
describe('#done()', function () {
beforeEach(function () {
sinon.stub(controller, 'removeObserver', Em.K);
sinon.stub(App.router, 'send', Em.K);
});
afterEach(function () {
controller.removeObserver.restore();
App.router.send.restore();
});
it('submit disabled', function () {
controller.set('isSubmitDisabled', true);
controller.done();
expect(App.router.send.called).to.be.false;
});
it('submit enabled and does not have manual steps', function () {
controller.set('isSubmitDisabled', false);
controller.set('content.hasManualSteps', false);
controller.done();
expect(controller.removeObserver.calledWith('tasks.@each.status', controller, 'onTaskStatusChange')).to.be.true;
expect(App.router.send.calledWith('complete')).to.be.true;
});
it('submit enabled and has manual steps', function () {
controller.set('isSubmitDisabled', false);
controller.set('content.hasManualSteps', true);
controller.done();
expect(controller.removeObserver.calledWith('tasks.@each.status', controller, 'onTaskStatusChange')).to.be.true;
expect(App.router.send.calledWith('next')).to.be.true;
});
});
describe('#getServiceConfigData()', function () {
var services = [];
var stackServices = [];
beforeEach(function () {
sinon.stub(App.Service, 'find', function () {
return services;
});
sinon.stub(App.StackService, 'find', function () {
return stackServices;
});
});
afterEach(function () {
App.Service.find.restore();
App.StackService.find.restore();
});
it('No services', function () {
services = [];
controller.set('content.reassign.component_name', 'COMP1');
expect(controller.getServiceConfigData({})).to.eql([]);
});
it('No services in stackServices', function () {
services = [Em.Object.create({serviceName: 'S1'})];
stackServices = [];
controller.set('content.reassign.component_name', 'COMP1');
expect(controller.getServiceConfigData({}, {})).to.eql([]);
});
it('Services in stackServices, but configTypesRendered is empty', function () {
services = [Em.Object.create({serviceName: 'S1'})];
stackServices = [Em.Object.create({
serviceName: 'S1',
configTypesRendered: {}
})];
controller.set('content.reassign.component_name', 'COMP1');
expect(controller.getServiceConfigData({}, {})[0]).to.equal("{\"Clusters\":{\"desired_config\":[]}}");
});
it('Services in stackServices, and configTypesRendered has data, but configs is empty', function () {
services = [Em.Object.create({serviceName: 'S1'})];
stackServices = [
Em.Object.create({
serviceName: 'S1',
configTypesRendered: {'type1': {}}
})
];
controller.set('content.reassign.component_name', 'COMP1');
expect(controller.getServiceConfigData({}, {})[0]).to.equal("{\"Clusters\":{\"desired_config\":[]}}");
});
it('Services in stackServices, and configTypesRendered has data, and configs present', function () {
services = [Em.Object.create({serviceName: 'S1'})];
stackServices = [
Em.Object.create({
serviceName: 'S1',
configTypesRendered: {'type1': {}}
})
];
var configs = {
'type1': {
'prop1': 'value1'
}
};
controller.set('content.reassign.component_name', 'COMP1');
expect(JSON.parse(controller.getServiceConfigData(configs, {})[0]).Clusters.desired_config.length).to.equal(1);
});
});
describe('#cleanMySqlServer()', function () {
beforeEach(function() {
sinon.stub(App.HostComponent, 'find', function() {
return Em.A([
Em.Object.create({
'componentName': 'MYSQL_SERVER',
'hostName': 'host1'
})
]);
});
});
afterEach(function() {
App.HostComponent.find.restore();
});
it('component_name is C1', function () {
controller.set('content.reassign.component_name', 'C1');
controller.cleanMySqlServer();
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();
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'
});
});
});
describe('#configureMySqlServer()', function () {
beforeEach(function() {
sinon.stub(App.HostComponent, 'find', function() {
return Em.A([
Em.Object.create({
'componentName': 'MYSQL_SERVER',
'hostName': 'host1'
})
]);
});
});
afterEach(function() {
App.HostComponent.find.restore();
});
it('component_name is C1', function () {
controller.set('content.reassign.component_name', 'C1');
controller.configureMySqlServer();
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();
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'
});
});
});
describe("#startRequiredServices()", function() {
beforeEach(function () {
sinon.stub(controller, 'startServices', Em.K);
});
afterEach(function () {
controller.startServices.restore();
});
it("component has related services", function() {
controller.set('content.reassign.component_name', 'HISTORYSERVER');
controller.startRequiredServices();
expect(controller.startServices.calledWith(false, ['MAPREDUCE2', 'HIVE', 'PIG', 'OOZIE'], true)).to.be.true;
});
it("component does not have related services", function() {
controller.set('content.reassign.component_name', 'C1');
controller.startRequiredServices();
expect(controller.startServices.calledWith(true)).to.be.true;
});
});
describe("#startMySqlServer()", function() {
beforeEach(function () {
sinon.stub(App.HostComponent, 'find').returns([
Em.Object.create({
componentName: 'MYSQL_SERVER',
hostName: 'host1'
})
]);
});
afterEach(function () {
App.HostComponent.find.restore();
});
it("valid request is sent", function() {
controller.startMySqlServer();
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"
}
});
});
});
describe("#restartMySqlServer()", function() {
beforeEach(function () {
sinon.stub(App.HostComponent, 'find').returns([
Em.Object.create({
componentName: 'MYSQL_SERVER',
hostName: 'host1'
})
]);
});
afterEach(function () {
App.HostComponent.find.restore();
});
it("valid request is sent", function() {
controller.set('content', Em.Object.create({
cluster: Em.Object.create({
name: 'cl1'
})
}));
controller.restartMySqlServer();
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"
}
});
});
});
describe("#startNewMySqlServer()", function() {
beforeEach(function () {
controller.set('content', Em.Object.create({
reassignHosts: Em.Object.create({
target: 'host1'
})
}));
controller.startNewMySqlServer();
this.args = testHelpers.findAjaxRequest('name', 'common.host.host_component.update');
});
it('valid request is sent', function() {
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"
}
});
});
});
describe.skip("#prepareDBCheckAction()", function() {
beforeEach(function () {
sinon.stub(App.router, 'get').returns({
'jdk_location': 'jdk_location',
'jdk.name': 'jdk.name',
'java.home': 'java.home'
});
sinon.stub(controller, 'getConnectionProperty').returns('prop1');
controller.set('content.reassignHosts', Em.Object.create({target: 'host1'}));
controller.reopen({
dbType: 'type1',
requiredProperties: [],
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 () {
expect(this.args[0]).exists;
expect(this.args[0].data).to.eql({
requestInfo: {
"context": "Check host",
"action": "check_host",
"parameters": {
"db_name": "type1",
"jdk_location": "jdk_location",
"jdk_name": "jdk.name",
"java_home": "java.home",
"threshold": 60,
"ambari_server_host": "",
"check_execute_list": "db_connection_check"
}
},
filteredHosts: ['host1']
});
});
});
describe('#setDependentHostComponents', function() {
beforeEach(function() {
sinon.stub(App.Host, 'find').returns(Em.Object.create({
hostComponents: [
Em.Object.create({
componentName: 'C1'
})
]
}));
sinon.stub(App.Service, 'find').returns([
Em.Object.create({
serviceName: 'S1'
}),
Em.Object.create({
serviceName: 'S2'
})
]);
sinon.stub(App.StackServiceComponent, 'find').returns(Em.Object.create({
dependencies: [
Em.Object.create({
componentName: 'C1',
serviceName: 'S1',
scope: 'host'
}),
Em.Object.create({
componentName: 'C2',
serviceName: 'S2',
scope: 'host'
}),
Em.Object.create({
componentName: 'C3',
serviceName: 'S3',
scope: 'host'
})
]
}));
});
afterEach(function() {
App.Host.find.restore();
App.Service.find.restore();
App.StackServiceComponent.find.restore();
});
it('should set dependentHostComponents', function() {
controller.setDependentHostComponents();
expect(controller.get('dependentHostComponents')).to.be.eql(['C2']);
});
});
});