blob: c1614b9e80591ca194c666984740b9ccea347e85 [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/wizard/step2_controller');
require('models/host');
require('models/host_component');
require('messages');
var testHelpers = require('test/helpers');
var c;
function getController() {
return App.WizardStep2Controller.create({content: {controllerName: ''}});
}
describe('App.WizardStep2Controller', function () {
var userErrorTests = Em.A([
{
manualInstall: false,
user: '',
sshPort:'',
e: ''
},
{
manualInstall: true,
user: '',
sshPort:'',
e: null
},
{
manualInstall: true,
user: 'nobody',
sshPort:'123',
e: null
},
{
manualInstall: false,
user: 'nobody',
sshPort:'123',
e: null
}
]);
beforeEach(function() {
c = getController();
});
App.TestAliases.testAsComputedEqual(getController(), 'isInstaller', 'content.controllerName', 'installerController');
App.TestAliases.testAsComputedAlias(getController(), 'manualInstall', 'content.installOptions.manualInstall', 'boolean');
App.TestAliases.testAsComputedAlias(getController(), 'sshKey', 'content.installOptions.sshKey', 'string');
App.TestAliases.testAsComputedAlias(getController(), 'sshUser', 'content.installOptions.sshUser', 'string');
App.TestAliases.testAsComputedAlias(getController(), 'sshPort', 'content.installOptions.sshPort', 'string');
App.TestAliases.testAsComputedAlias(getController(), 'agentUser', 'content.installOptions.agentUser', 'string');
App.TestAliases.testAsComputedOr(getController(), 'isSubmitDisabled', ['hostsError', 'sshKeyError', 'sshUserError', 'sshPortError', 'agentUserError', 'App.router.btnClickInProgress']);
describe('#hostNames', function() {
it('should be equal to content.installOptions.hostNames', function() {
var controller = App.WizardStep2Controller.create({content: {installOptions: {hostNames: 'A,b,C'}}});
expect(controller.get('hostNames')).to.equal('a,b,c');
controller.set('content.installOptions.hostNames', 'a,B');
expect(controller.get('hostNames')).to.equal('a,b');
});
});
App.TestAliases.testAsComputedIfThenElse(getController(), 'installType', 'manualInstall', 'manualDriven', 'ambariDriven');
describe('#updateHostNameArr()', function () {
var controller = App.WizardStep2Controller.create({
hostNames: 'apache.ambari'
});
controller.updateHostNameArr();
it('should push to hostNameArr only new host names', function(){
expect(controller.get('hostNameArr').length).to.equal(1);
});
it('should push to inputtedAgainHostNames already installed host names', function(){
expect(controller.get('inputtedAgainHostNames').length).to.equal(0);
})
});
describe('#isAllHostNamesValid()', function () {
var controller = App.WizardStep2Controller.create({
hostNames: ''
});
it('should return true if all host names are valid', function(){
controller.set('hostNames', 'amache.org ambari.com');
expect(controller.isAllHostNamesValid()).to.equal(true);
});
var tests = Em.A([
'hostname',
'-hostname.com',
'hostname-.com',
'host_name.com',
'123.123.123.123',
'hostnamehostnamehostnamehostnamehostnamehostnamehostnamehostname.hostnamehostnamehostnamehostnamehostnamehostnamehostnamehostname.hostnamehostnamehostnamehostnamehostnamehostnamehostnamehostname.hostnamehostnamehostnamehostnamehostnamehostnamehostnamehostname',
'hostnamehostnamehostnamehostnamehostnamehostnamehostnamehostnamehostname.hostname'
]);
tests.forEach(function (test) {
it('should return false for invalid host names ' + test + ' ', function () {
controller.set('hostNames', test);
expect(controller.isAllHostNamesValid()).to.equal(false);
});
});
});
describe('#checkHostError()', function () {
var controller = App.WizardStep2Controller.create();
it('should set hostsError if hostNames is ""', function () {
controller.set('content', {'installOptions': {'hostNames': ''}});
controller.checkHostError();
expect(controller.get('hostsError').length).to.be.above(2);
});
it('should set hostsError to null if hostNames is valid', function () {
controller.set('content', {'installOptions': {'hostNames': 'ambari'}});
controller.checkHostError();
expect(controller.get('hostsError')).to.equal(null);
})
});
describe('#checkHostAfterSubmitHandler()', function () {
it('should be called after changing hasSubmitted', function (done) {
var controller = App.WizardStep2Controller.create({
checkHostError: function () {
done();
}
});
controller.set('hasSubmitted', true);
});
it('should be called after changing hostNames', function (done) {
var controller = App.WizardStep2Controller.create({
hasSubmitted: true,
checkHostError: function () {
done();
}
});
controller.set('content', {'installOptions': {'hostNames': 'ambari'}});
})
});
describe('#sshKeyError', function () {
var tests = Em.A([
{
manualInstall: false,
sshKey: '',
hasSubmitted: false,
e: null
},
{
manualInstall: true,
sshKey: '',
hasSubmitted: false,
e: null
},
{
manualInstall: true,
sshKey: 'nobody',
hasSubmitted: false,
e: null
},
{
manualInstall: false,
sshKey: 'nobody',
hasSubmitted: false,
e: null
},
{
manualInstall: false,
sshKey: '',
hasSubmitted: true,
e: null
},
{
manualInstall: true,
sshKey: '',
hasSubmitted: true,
e: null
},
{
manualInstall: true,
sshKey: 'nobody',
hasSubmitted: true,
e: null
},
{
manualInstall: false,
sshKey: 'nobody',
hasSubmitted: true,
e: null
}
]);
tests.forEach(function(test) {
it(test.sshKey + ' ' + test.manualInstall.toString() + ' ' + test.hasSubmitted.toString(), function() {
var controller = App.WizardStep2Controller.create({content: {installOptions: {manualInstall: test.manualInstall, sshKey: test.sshKey}}});
if(Em.isNone(test.e)) {
expect(controller.get('sshKeyError')).to.equal(null);
}
else {
expect(controller.get('sshKeyError').length).to.be.above(2);
}
});
});
});
describe('#sshUserError', function () {
userErrorTests.forEach(function(test) {
it(JSON.stringify(test), function() {
var controller = App.WizardStep2Controller.create({content: {installOptions: {manualInstall: test.manualInstall, sshUser: test.user}}});
if(Em.isNone(test.e)) {
expect(controller.get('sshUserError')).to.equal(null);
}
else {
expect(controller.get('sshUserError').length).to.be.above(2);
}
});
});
});
describe('#sshPortError', function () {
userErrorTests.forEach(function(test) {
it(JSON.stringify(test), function() {
var controller = App.WizardStep2Controller.create({content: {installOptions: {manualInstall: test.manualInstall, sshPort: test.sshPort}}});
if(Em.isNone(test.e)) {
expect(controller.get('sshPortError')).to.equal(null);
}
else {
expect(controller.get('sshPortError').length).to.be.above(2);
}
});
});
});
describe('#agentUserError', function () {
beforeEach(function () {
this.stub = sinon.stub(App, 'get');
});
afterEach(function () {
App.get.restore();
});
userErrorTests.forEach(function(test) {
it('Ambari Agent user account customize enabled', function() {
this.stub.withArgs('supports.customizeAgentUserAccount').returns(true);
var controller = App.WizardStep2Controller.create({content: {installOptions: {manualInstall: test.manualInstall, agentUser: test.user}}});
if(Em.isNone(test.e)) {
expect(controller.get('agentUserError')).to.be.null;
}
else {
expect(controller.get('agentUserError').length).to.be.above(2);
}
});
});
userErrorTests.forEach(function(test) {
it('Ambari Agent user account customize disabled', function() {
this.stub.withArgs('supports.customizeAgentUserAccount').returns(false);
var controller = App.WizardStep2Controller.create({content: {installOptions: {manualInstall: test.manualInstall, agentUser: test.user}}});
expect(controller.get('agentUserError')).to.be.null;
});
});
});
describe('#getHostInfo()', function () {
it('should return object with bootStatus, installType and name for every element in hostNameArr', function () {
var controller = App.WizardStep2Controller.create({
hostNameArr: ['apache', 'ambari'],
installType: 'manualDriven'
});
var test = controller.getHostInfo();
expect(test).to.eql({
'apache':{'name':'apache', 'installType': 'manualDriven', 'bootStatus': 'PENDING', isInstalled: false},
'ambari':{'name':'ambari', 'installType': 'manualDriven', 'bootStatus': 'PENDING', isInstalled: false}
});
})
});
describe('#setSshKey()', function () {
it('should set content.installOptions.sshKey', function () {
var controller = App.WizardStep2Controller.create({
content: {'installOptions': {'sshKey': '111'}}
});
controller.setSshKey('222');
expect(controller.get('content.installOptions.sshKey')).to.equal('222');
})
});
describe('#evaluateStep()', function () {
it('should return false if isSubmitDisabled is true', function () {
var controller = App.WizardStep2Controller.create({
hostNames: 'apache.ambari',
parseHostNamesAsPatternExpression: Em.K
});
controller.reopen({isSubmitDisabled: true});
expect(controller.evaluateStep()).to.equal(false);
});
it('should return false if hostsError is not empty', function () {
var controller = App.WizardStep2Controller.create({
hostNames: 'apache.ambari',
parseHostNamesAsPatternExpression: Em.K
});
controller.set('hostsError', 'error');
expect(controller.evaluateStep()).to.equal(false);
});
it('should return false if sshKeyError is not empty', function () {
var controller = App.WizardStep2Controller.create({
hostNames: 'apache.ambari',
parseHostNamesAsPatternExpression: Em.K
});
controller.reopen({sshKeyError: 'error'});
expect(controller.evaluateStep()).to.equal(false);
});
it('should return false if sshUserError is not empty', function () {
var controller = App.WizardStep2Controller.create({
hostNames: 'apache.ambari',
parseHostNamesAsPatternExpression: Em.K
});
controller.reopen({sshUserError: 'error'});
expect(controller.evaluateStep()).to.equal(false);
});
it('should return false if sshPortError is not empty', function () {
var controller = App.WizardStep2Controller.create({
hostNames: 'apache.ambari',
parseHostNamesAsPatternExpression: Em.K
});
controller.reopen({sshPortError: 'error'});
expect(controller.evaluateStep()).to.equal(false);
});
it('should return false if agentUserError is not empty', function () {
var controller = App.WizardStep2Controller.create({
hostNames: 'apache.ambari',
parseHostNamesAsPatternExpression: Em.K
});
controller.reopen({agentUserError: 'error'});
expect(controller.evaluateStep()).to.equal(false);
});
it('should return false if hostNameArr is empty', function () {
var controller = App.WizardStep2Controller.create({
hostNames: '',
parseHostNamesAsPatternExpression: Em.K
});
expect(controller.evaluateStep()).to.equal(false);
});
it('should return false if isPattern is true', function () {
var controller = App.WizardStep2Controller.create({
hostNames: 'apache.ambari',
isPattern: true,
parseHostNamesAsPatternExpression: Em.K
});
expect(controller.evaluateStep()).to.equal(false);
})
});
describe('#parseHostNamesAsPatternExpression()', function () {
it('should parse hosts from pattern expression to hostNameArr', function () {
var controller = App.WizardStep2Controller.create({
hostNameArr: ['host[001-011]']
});
controller.parseHostNamesAsPatternExpression();
var result = true;
var hosts = controller.get('hostNameArr');
for (var i = 1; i<12; i++) {
var extra = i.toString().length === 1 ? 0 : '';
if (hosts[i-1] !== 'host0' + extra + i) {
result = false;
}
}
expect(result).to.equal(true);
});
it('should parse hosts from multiple pattern expression to hostNameArr', function () {
var controller = App.WizardStep2Controller.create({
hostNameArr: ['test[1-2]host[01-05]']
});
controller.parseHostNamesAsPatternExpression();
var hosts = controller.get('hostNameArr');
expect(hosts).eql([
'test1host01',
'test1host02',
'test1host03',
'test1host04',
'test1host05',
'test2host01',
'test2host02',
'test2host03',
'test2host04',
'test2host05'
]);
});
it('should skip duplicates', function () {
var controller = App.WizardStep2Controller.create({
hostNameArr: ['host[1-3]', 'host2']
});
controller.parseHostNamesAsPatternExpression();
expect(controller.get('hostNameArr')).to.eql(['host1', 'host2', 'host3']);
});
});
describe('#proceedNext()', function () {
beforeEach(function () {
sinon.stub(c, 'warningPopup', Em.K);
sinon.stub(c, 'manualInstallPopup', Em.K);
sinon.stub(App.router, 'send', Em.K);
});
afterEach(function () {
c.warningPopup.restore();
c.manualInstallPopup.restore();
App.router.send.restore();
});
it('should call warningPopup if not isAllHostNamesValid and no warningConfirmed', function() {
c.reopen({
isAllHostNamesValid: function() {
return false;
}
});
var r = c.proceedNext(false);
expect(r).to.equal(false);
expect(c.warningPopup.calledOnce).to.equal(true);
});
it('should call manualInstallPopup if manualInstall is true', function () {
c.reopen({
hostNames: '',
manualInstall: true
});
var r = c.proceedNext(true);
expect(r).to.equal(false);
expect(c.manualInstallPopup.calledOnce).to.equal(true);
});
it ('should save hosts and proceed next if manualInstall is false', function() {
c.reopen({
hostNameArr: ['h1'],
manualInstall: false,
isAllHostNamesValid: function() {return true;},
content: {
installOptions: {},
hosts: null
}
});
var r = c.proceedNext();
expect(r).to.equal(true);
expect(Em.keys(c.get('content.hosts'))).to.eql(['h1']);
expect(App.router.send.calledWith('next')).to.equal(true);
});
});
describe('#installedHostsPopup', function() {
beforeEach(function() {
sinon.spy(App.ModalPopup, 'show');
sinon.stub(c, 'proceedNext', Em.K);
});
afterEach(function() {
App.ModalPopup.show.restore();
c.proceedNext.restore();
});
it('should call App.ModalPopup.show', function() {
c.installedHostsPopup();
expect(App.ModalPopup.show.calledOnce).to.equal(true);
});
it('should proceed next on primary', function() {
c.installedHostsPopup().onPrimary();
expect(c.proceedNext.calledOnce).to.equal(true);
});
});
describe('#warningPopup', function() {
beforeEach(function() {
sinon.spy(App.ModalPopup, 'show');
sinon.stub(c, 'proceedNext', Em.K);
});
afterEach(function() {
App.ModalPopup.show.restore();
c.proceedNext.restore();
});
it('should call App.ModalPopup.show', function() {
c.warningPopup();
expect(App.ModalPopup.show.calledOnce).to.equal(true);
});
it('should proceed next on primary', function() {
c.warningPopup().onPrimary();
expect(c.proceedNext.calledWith(true)).to.equal(true);
});
});
describe('#hostNamePatternPopup', function() {
beforeEach(function() {
sinon.spy(App.ModalPopup, 'show');
sinon.stub(c, 'proceedNext', Em.K);
});
afterEach(function() {
App.ModalPopup.show.restore();
c.proceedNext.restore();
});
it('should call App.ModalPopup.show', function() {
c.hostNamePatternPopup();
expect(App.ModalPopup.show.calledOnce).to.equal(true);
});
it('should proceed next on primary', function() {
c.hostNamePatternPopup().onPrimary();
expect(c.proceedNext.calledOnce).to.equal(true);
});
});
describe('#manualInstallPopup', function() {
beforeEach(function() {
sinon.spy(App.ModalPopup, 'show');
sinon.stub(App.router, 'send', Em.K);
sinon.stub(c, 'saveHosts', Em.K);
});
afterEach(function() {
App.ModalPopup.show.restore();
App.router.send.restore();
c.saveHosts.restore();
});
it('should call App.ModalPopup.show', function() {
c.manualInstallPopup();
expect(App.ModalPopup.show.calledOnce).to.equal(true);
});
it('should save hosts and go next on primary', function() {
c.manualInstallPopup().onPrimary();
expect(c.saveHosts.calledOnce).to.equal(true);
expect(App.router.send.calledWith('next')).to.equal(true);
});
});
describe('#manualInstallWarningPopup', function() {
beforeEach(function() {
sinon.spy(App.ModalPopup, 'show');
});
afterEach(function() {
App.ModalPopup.show.restore();
});
it('should call App.ModalPopup.show if content.installOptions.useSsh is false', function() {
var controller = App.WizardStep2Controller.create({content: {installOptions: {useSsh: false}}});
controller.manualInstallWarningPopup();
expect(App.ModalPopup.show.calledOnce).to.equal(true);
});
it('shouldn\'t call App.ModalPopup.show if content.installOptions.useSsh is true', function() {
var controller = App.WizardStep2Controller.create({content: {installOptions: {useSsh: true}}});
controller.manualInstallWarningPopup();
expect(App.ModalPopup.show.called).to.equal(false);
});
});
describe('#setAmbariJavaHome', function() {
it('should do ajax-request', function() {
var controller = App.WizardStep2Controller.create({onGetAmbariJavaHomeSuccess: Em.K, onGetAmbariJavaHomeError: Em.K});
controller.setAmbariJavaHome();
var args = testHelpers.findAjaxRequest('name', 'ambari.service');
expect(args).exists;
});
});
describe('#onGetAmbariJavaHomeSuccess', function() {
it('should set java.home value receiced from server', function() {
var controller = App.WizardStep2Controller.create({content: {installOptions: {}}});
var test = {RootServiceComponents: {properties: {'java.home': '/root'}}};
controller.onGetAmbariJavaHomeSuccess(test);
expect(controller.content.installOptions.javaHome).to.equal('/root');
});
});
describe('#onGetAmbariJavaHomeError', function() {
it('should set default java.home value', function() {
var controller = App.WizardStep2Controller.create({content: {installOptions: {}}});
controller.onGetAmbariJavaHomeError();
expect(controller.content.installOptions.javaHome).to.equal(App.get('defaultJavaHome'));
});
});
describe('#saveHosts', function() {
beforeEach(function() {
sinon.stub(c, 'setAmbariJavaHome', Em.K);
c.reopen({
hostNameArr: ['h1'],
content: {
hosts: null
}
});
});
afterEach(function() {
c.setAmbariJavaHome.restore();
});
it('should call setAmbariJavaHome', function() {
c.saveHosts();
expect(c.setAmbariJavaHome.calledOnce).to.equal(true);
});
it('should set content.hosts', function() {
c.saveHosts();
expect(Em.keys(c.get('content.hosts'))).to.eql(['h1']);
});
});
});