blob: c901bf624985e765547461c67392655bd60350c8 [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.
*/
App = require('app');
require('controllers/main/service/reassign/step6_controller');
var controller;
var testHelpers = require('test/helpers');
describe('App.ReassignMasterWizardStep6Controller', function () {
beforeEach(function () {
controller = App.ReassignMasterWizardStep6Controller.create({
content: Em.Object.create({
reassign: Em.Object.create(),
reassignHosts: Em.Object.create()
}),
startServices: Em.K,
tasks: []
});
});
describe('#initializeTasks()', function () {
it('No commands', function () {
controller.set('commands', []);
controller.set('hostComponents', []);
controller.initializeTasks();
expect(controller.get('tasks')).to.be.empty;
});
it('One command', function () {
controller.set('commands', ['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('#loadStep()', function () {
var isHaEnabled = true;
beforeEach(function () {
controller.set('content.reassign.service_id', 'service1');
sinon.stub(controller, 'onTaskStatusChange', Em.K);
sinon.stub(controller, 'initializeTasks', Em.K);
sinon.stub(App, 'get', function () {
return isHaEnabled;
});
});
afterEach(function () {
controller.onTaskStatusChange.restore();
controller.initializeTasks.restore();
App.get.restore();
});
it('reassign component is NameNode and HA enabled', function () {
isHaEnabled = true;
controller.set('content.reassign.component_name', 'NAMENODE');
controller.loadStep();
expect(controller.get('hostComponents')).to.eql(['NAMENODE', 'ZKFC']);
});
it('reassign component is NameNode and HA disabled', function () {
isHaEnabled = false;
controller.set('content.reassign.component_name', 'NAMENODE');
controller.loadStep();
expect(controller.get('hostComponents')).to.eql(['NAMENODE']);
});
it('reassign component is RESOURCEMANAGER', function () {
controller.set('content.reassign.component_name', 'RESOURCEMANAGER');
controller.loadStep();
expect(controller.get('hostComponents')).to.eql(['RESOURCEMANAGER']);
});
});
describe('#loadStep() for reassign NameNode with PXF service installed', function () {
var serviceStub, hostComponentStub, pxfHosts, dataNodeHosts;
var commands = [
'stopMysqlService',
'putHostComponentsInMaintenanceMode',
'stopHostComponentsInMaintenanceMode',
'deleteHostComponents',
'startAllServices'
];
var reassignHosts = {
"source": "c6401.ambari.apache.org",
"target": "c6403.ambari.apache.org"
};
beforeEach(function () {
controller.set('content.reassign.service_id', 'HDFS');
controller.set('content.reassign.component_name', 'NAMENODE');
controller.set('commands', commands.copy());
controller.set('content.reassignHosts', reassignHosts);
sinon.stub(controller, 'onTaskStatusChange', Em.K);
sinon.stub(controller, 'initializeTasks', Em.K);
serviceStub = sinon.stub(App.Service.find(), 'someProperty');
hostComponentStub = sinon.stub(App.HostComponent.find(), 'filterProperty');
serviceStub.withArgs('serviceName', 'PXF').returns(true);
});
afterEach(function () {
controller.onTaskStatusChange.restore();
controller.initializeTasks.restore();
serviceStub.restore();
hostComponentStub.restore();
});
var setUpHosts = function (_pxfHosts, _dataNodeHosts) {
hostComponentStub.withArgs('componentName', 'PXF').returns(_pxfHosts);
hostComponentStub.withArgs('componentName', 'DATANODE').returns(_dataNodeHosts);
};
it('does not delete PXF from source host if PXF and DATANODE are not installed on the source host', function () {
pxfHosts = [{"hostName": "c6402.ambari.apache.org"}];
dataNodeHosts = [{"hostName": "c6402.ambari.apache.org"}];
setUpHosts(pxfHosts, dataNodeHosts);
controller.loadStep();
expect(controller.get('hostComponents')).to.eql(['NAMENODE']);
});
it('does not delete PXF from source host if PXF is not installed on the source host and DATANODE is installed on the source host', function () {
pxfHosts = [{"hostName": "c6402.ambari.apache.org"}];
dataNodeHosts = [{"hostName": "c6401.ambari.apache.org"}, {"hostName": "c6402.ambari.apache.org"}];
setUpHosts(pxfHosts, dataNodeHosts);
controller.loadStep();
expect(controller.get('hostComponents')).to.eql(['NAMENODE']);
});
it('deletes PXF from source host if PXF is installed on the source host and DATANODE is not installed on the source host', function () {
pxfHosts = [{"hostName": "c6401.ambari.apache.org"}, {"hostName": "c6402.ambari.apache.org"}];
dataNodeHosts = [{"hostName": "c6402.ambari.apache.org"}];
setUpHosts(pxfHosts, dataNodeHosts);
controller.loadStep();
expect(controller.get('hostComponents')).to.eql(['NAMENODE', 'PXF']);
});
it('does not delete PXF from source host if PXF and DATANODE are installed on the source host', function () {
pxfHosts = [{"hostName": "c6401.ambari.apache.org"}, {"hostName": "c6402.ambari.apache.org"}];
dataNodeHosts = [{"hostName": "c6401.ambari.apache.org"}, {"hostName": "c6402.ambari.apache.org"}];
setUpHosts(pxfHosts, dataNodeHosts);
controller.loadStep();
expect(controller.get('hostComponents')).to.eql(['NAMENODE']);
});
it('does not install PXF on the target host if PXF is already installed on the target host', function () {
pxfHosts = [{"hostName": "c6403.ambari.apache.org"}];
setUpHosts(pxfHosts, []);
controller.loadStep();
expect(controller.get('commands').indexOf('installPxf')).to.eql(-1);
});
it('installs PXF on the target host if PXF is not installed on the target host', function () {
pxfHosts = [{"hostName": "c6401.ambari.apache.org"}, {"hostName": "c6402.ambari.apache.org"}];
setUpHosts(pxfHosts, []);
controller.loadStep();
expect(controller.get('commands').indexOf('installPxf')).to.be.equal(4);
});
});
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('#stopMysqlService()', function () {
it('stopMysqlService', function () {
controller.stopMysqlService();
var args = testHelpers.findAjaxRequest('name', 'common.host.host_component.update');
expect(args[0]).exists;
});
});
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("#removeTasks()", function() {
it("no tasks to delete", function() {
controller.set('tasks', [Em.Object.create()]);
controller.removeTasks([]);
expect(controller.get('tasks').length).to.equal(1);
});
it("one task to delete", function() {
controller.set('tasks', [Em.Object.create({command: 'task1'})]);
controller.removeTasks(['task1']);
expect(controller.get('tasks')).to.be.empty;
});
});
describe("#startAllServices()", function() {
beforeEach(function () {
sinon.stub(controller, 'startServices', Em.K);
});
afterEach(function () {
controller.startServices.restore();
});
it("startServices is called with valid arguments", function () {
controller.startAllServices();
expect(controller.startServices.calledWith(true)).to.be.true;
});
});
});