blob: 2812b7d0dd978b12d55a390bceb1a960ebd7b440 [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('views/common/quick_view_link_view');
require('models/host_component');
require('models/stack_service_component');
App.auth = ["AMBARI.ADD_DELETE_CLUSTERS", "AMBARI.ASSIGN_ROLES", "AMBARI.EDIT_STACK_REPOS", "AMBARI.MANAGE_GROUPS", "AMBARI.MANAGE_STACK_VERSIONS", "AMBARI.MANAGE_USERS", "AMBARI.MANAGE_VIEWS", "AMBARI.RENAME_CLUSTER", "SERVICE.SET_SERVICE_USERS_GROUPS", "CLUSTER.TOGGLE_ALERTS", "CLUSTER.TOGGLE_KERBEROS", "CLUSTER.UPGRADE_DOWNGRADE_STACK", "CLUSTER.VIEW_ALERTS", "CLUSTER.VIEW_CONFIGS", "CLUSTER.VIEW_METRICS", "CLUSTER.VIEW_STACK_DETAILS", "CLUSTER.VIEW_STATUS_INFO", "HOST.ADD_DELETE_COMPONENTS", "HOST.ADD_DELETE_HOSTS", "HOST.TOGGLE_MAINTENANCE", "HOST.VIEW_CONFIGS", "HOST.VIEW_METRICS", "HOST.VIEW_STATUS_INFO", "SERVICE.ADD_DELETE_SERVICES", "SERVICE.COMPARE_CONFIGS", "SERVICE.DECOMMISSION_RECOMMISSION", "SERVICE.ENABLE_HA", "SERVICE.MANAGE_CONFIG_GROUPS", "SERVICE.MODIFY_CONFIGS", "SERVICE.MOVE", "SERVICE.RUN_CUSTOM_COMMAND", "SERVICE.RUN_SERVICE_CHECK", "SERVICE.START_STOP", "SERVICE.TOGGLE_ALERTS", "SERVICE.TOGGLE_MAINTENANCE", "SERVICE.VIEW_ALERTS", "SERVICE.VIEW_CONFIGS", "SERVICE.VIEW_METRICS", "SERVICE.VIEW_STATUS_INFO", "VIEW.USE"];
describe('App', function () {
describe('#stackVersionURL', function () {
App.set('defaultStackVersion', "HDP-1.2.2");
App.set('currentStackVersion', "HDP-1.2.2");
var testCases = [
{
title: 'if currentStackVersion and defaultStackVersion are empty then stackVersionURL should contain prefix',
currentStackVersion: '',
defaultStackVersion: '',
result: '/stacks/HDP/versions/'
},
{
title: 'if currentStackVersion is "HDP-1.3.1" then stackVersionURL should be "/stacks/HDP/versions/1.3.1"',
currentStackVersion: 'HDP-1.3.1',
defaultStackVersion: '',
result: '/stacks/HDP/versions/1.3.1'
},
{
title: 'if defaultStackVersion is "HDP-1.3.1" then stackVersionURL should be "/stacks/HDP/versions/1.3.1"',
currentStackVersion: '',
defaultStackVersion: 'HDP-1.3.1',
result: '/stacks/HDP/versions/1.3.1'
},
{
title: 'if defaultStackVersion and currentStackVersion are different then stackVersionURL should have currentStackVersion value',
currentStackVersion: 'HDP-1.3.2',
defaultStackVersion: 'HDP-1.3.1',
result: '/stacks/HDP/versions/1.3.2'
}
];
testCases.forEach(function (test) {
it(test.title, function () {
App.set('defaultStackVersion', test.defaultStackVersion);
App.set('currentStackVersion', test.currentStackVersion);
expect(App.get('stackVersionURL')).to.equal(test.result);
App.set('defaultStackVersion', "HDP-1.2.2");
App.set('currentStackVersion', "HDP-1.2.2");
});
});
});
describe('#falconServerURL', function () {
var testCases = [
{
title: 'No services installed, url should be empty',
service: Em.A([]),
result: ''
},
{
title: 'FALCON is not installed, url should be empty',
service: Em.A([
{
serviceName: 'HDFS'
}
]),
result: ''
},
{
title: 'FALCON is installed, url should be "host1"',
service: Em.A([
Em.Object.create({
serviceName: 'FALCON',
hostComponents: [
Em.Object.create({
componentName: 'FALCON_SERVER',
hostName: 'host1'
})
]
})
]),
result: 'host1'
}
];
testCases.forEach(function (test) {
describe(test.title, function () {
beforeEach(function () {
sinon.stub(App.Service, 'find', function () {
return test.service;
});
});
afterEach(function () {
App.Service.find.restore();
});
it('App.falconServerURL is ' + test.result, function () {
expect(App.get('falconServerURL')).to.equal(test.result);
});
});
});
});
describe('#currentStackVersionNumber', function () {
var testCases = [
{
title: 'if currentStackVersion is empty then currentStackVersionNumber should be empty',
currentStackVersion: '',
result: ''
},
{
title: 'if currentStackVersion is "HDP-1.3.1" then currentStackVersionNumber should be "1.3.1',
currentStackVersion: 'HDP-1.3.1',
result: '1.3.1'
},
{
title: 'if currentStackVersion is "HDPLocal-1.3.1" then currentStackVersionNumber should be "1.3.1',
currentStackVersion: 'HDPLocal-1.3.1',
result: '1.3.1'
}
];
before(function () {
App.set('defaultStackVersion', '');
});
after(function () {
App.set('defaultStackVersion', 'HDP-2.0.5');
});
testCases.forEach(function (test) {
it(test.title, function () {
App.set('currentStackVersion', test.currentStackVersion);
expect(App.get('currentStackVersionNumber')).to.equal(test.result);
App.set('currentStackVersion', "HDP-1.2.2");
});
});
});
describe('#isHaEnabled when HDFS is installed:', function () {
beforeEach(function () {
sinon.stub(App.Service, 'find').returns(Em.Object.create({'isLoaded': true}));
this.mock = sinon.stub(App.HostComponent, 'find');
});
afterEach(function () {
App.Service.find.restore();
this.mock.restore();
});
it('if hadoop stack version higher than 2 then isHaEnabled should be true', function () {
this.mock.returns([]);
App.propertyDidChange('isHaEnabled');
expect(App.get('isHaEnabled')).to.equal(true);
});
it('if cluster has SECONDARY_NAMENODE then isHaEnabled should be false', function () {
this.mock.returns([Em.Object.create({componentName: 'SECONDARY_NAMENODE'})]);
App.propertyDidChange('isHaEnabled');
expect(App.get('isHaEnabled')).to.equal(false);
});
});
describe('#isHaEnabled when HDFS is not installed:', function () {
beforeEach(function () {
sinon.stub(App.Service, 'find').returns(Em.Object.create({'isLoaded': false}));
});
afterEach(function () {
App.Service.find.restore();
});
it('if hadoop stack version higher than 2 but HDFS not installed then isHaEnabled should be false', function () {
App.set('currentStackVersion', 'HDP-2.1');
expect(App.get('isHaEnabled')).to.equal(false);
App.set('currentStackVersion', "HDP-1.2.2");
});
});
describe('#services', function () {
var stackServices = [
Em.Object.create({
serviceName: 'S1',
isClientOnlyService: true
}),
Em.Object.create({
serviceName: 'S2',
hasClient: true
}),
Em.Object.create({
serviceName: 'S3',
hasMaster: true
}),
Em.Object.create({
serviceName: 'S4',
hasSlave: true
}),
Em.Object.create({
serviceName: 'S5',
isNoConfigTypes: true
}),
Em.Object.create({
serviceName: 'S6',
isMonitoringService: true
}),
Em.Object.create({
serviceName: 'S7'
})
];
beforeEach(function () {
sinon.stub(App.StackService, 'find', function () {
return stackServices;
});
});
afterEach(function () {
App.StackService.find.restore();
});
it('App.services.all', function () {
expect(App.get('services.all')).to.eql(['S1', 'S2', 'S3', 'S4', 'S5', 'S6', 'S7']);
});
it('App.services.clientOnly', function () {
expect(App.get('services.clientOnly')).to.eql(['S1']);
});
it('App.services.hasClient', function () {
expect(App.get('services.hasClient')).to.eql(['S2']);
});
it('App.services.hasMaster', function () {
expect(App.get('services.hasMaster')).to.eql(['S3']);
});
it('App.services.hasSlave', function () {
expect(App.get('services.hasSlave')).to.eql(['S4']);
});
it('App.services.noConfigTypes', function () {
expect(App.get('services.noConfigTypes')).to.eql(['S5']);
});
it('App.services.monitoring', function () {
expect(App.get('services.monitoring')).to.eql(['S6']);
});
});
describe('#components', function () {
var i = 0,
testCases = [
{
key: 'allComponents',
data: [
Em.Object.create({
componentName: 'C1'
})
],
result: ['C1']
},
{
key: 'reassignable',
data: [
Em.Object.create({
componentName: 'C2',
isReassignable: true
})
],
result: ['C2']
},
{
key: 'restartable',
data: [
Em.Object.create({
componentName: 'C3',
isRestartable: true
})
],
result: ['C3']
},
{
key: 'deletable',
data: [
Em.Object.create({
componentName: 'C4',
isDeletable: true
})
],
result: ['C4']
},
{
key: 'rollinRestartAllowed',
data: [
Em.Object.create({
componentName: 'C5',
isRollinRestartAllowed: true
})
],
result: ['C5']
},
{
key: 'decommissionAllowed',
data: [
Em.Object.create({
componentName: 'C6',
isDecommissionAllowed: true
})
],
result: ['C6']
},
{
key: 'refreshConfigsAllowed',
data: [
Em.Object.create({
componentName: 'C7',
isRefreshConfigsAllowed: true
})
],
result: ['C7']
},
{
key: 'addableToHost',
data: [
Em.Object.create({
componentName: 'C8',
isAddableToHost: true
})
],
result: ['C8']
},
{
key: 'addableMasterInstallerWizard',
data: [
Em.Object.create({
componentName: 'C9',
isMasterAddableInstallerWizard: true,
showAddBtnInInstall: true
})
],
result: ['C9']
},
{
key: 'multipleMasters',
data: [
Em.Object.create({
componentName: 'C10',
isMasterWithMultipleInstances: true
})
],
result: ['C10']
},
{
key: 'slaves',
data: [
Em.Object.create({
componentName: 'C11',
isSlave: true
})
],
result: ['C11']
},
{
key: 'clients',
data: [
Em.Object.create({
componentName: 'C12',
isClient: true
})
],
result: ['C12']
}
];
beforeEach(function () {
sinon.stub(App.StackServiceComponent, 'find', function () {
return testCases[i].data;
});
});
afterEach(function () {
i++;
App.StackServiceComponent.find.restore();
});
testCases.forEach(function (test) {
it(test.key + ' should contain ' + test.result, function () {
var key = 'components.' + test.key;
App.components.propertyDidChange(test.key);
expect(App.get(key)).to.eql(test.result);
});
});
});
describe('#upgradeIsRunning', function () {
Em.A([
{
upgradeState: 'IN_PROGRESS',
m: 'should be true (1)',
e: true
},
{
upgradeState: 'HOLDING',
m: 'should be true (2)',
e: true
},
{
upgradeState: 'FAKE',
m: 'should be false',
e: false
}
]).forEach(function (test) {
it(test.m, function () {
App.set('upgradeState', test.upgradeState);
expect(App.get('upgradeIsRunning')).to.equal(test.e);
});
});
});
describe('#upgradeSuspended', function () {
var cases = [
{
upgradeState: 'NOT_REQUIRED',
isSuspended: false,
upgradeSuspended: false
},
{
upgradeState: 'ABORTED',
isSuspended: false,
upgradeSuspended: false
},
{
upgradeState: 'ABORTED',
isSuspended: true,
upgradeSuspended: true
}
];
beforeEach(function() {
this.mock = sinon.stub(App.router, 'get');
});
afterEach(function() {
this.mock.restore();
});
cases.forEach(function (test) {
it(test.upgradeState + ", isSuspended=" + test.isSuspended, function () {
App.set('upgradeState', test.upgradeState);
this.mock.returns(test.isSuspended);
App.propertyDidChange('upgradeSuspended');
expect(App.get('upgradeSuspended')).to.equal(test.upgradeSuspended);
});
});
});
describe('#upgradeAborted', function () {
var cases = [
{
upgradeState: 'NOT_REQUIRED',
isSuspended: false,
upgradeAborted: false
},
{
upgradeState: 'ABORTED',
isSuspended: true,
upgradeAborted: false
},
{
upgradeState: 'ABORTED',
isSuspended: false,
upgradeAborted: true
}
];
beforeEach(function() {
this.mock = sinon.stub(App.router, 'get');
});
afterEach(function() {
this.mock.restore();
});
cases.forEach(function (test) {
it(test.upgradeState + ", isSuspended=" + test.isSuspended, function () {
App.set('upgradeState', test.upgradeState);
this.mock.returns(test.isSuspended);
App.propertyDidChange('upgradeAborted');
expect(App.get('upgradeAborted')).to.equal(test.upgradeAborted);
});
});
});
describe('#wizardIsNotFinished', function () {
var cases = [
{
upgradeState: 'NOT_REQUIRED',
wizardIsNotFinished: false
},
{
upgradeState: 'IN_PROGRESS',
wizardIsNotFinished: true
},
{
upgradeState: 'HOLDING',
wizardIsNotFinished: true
},
{
upgradeState: 'HOLDING_TIMEDOUT',
wizardIsNotFinished: true
},
{
upgradeState: 'ABORTED',
wizardIsNotFinished: true
}
];
cases.forEach(function (item) {
it(item.upgradeState, function () {
App.set('upgradeState', item.upgradeState);
App.propertyDidChange('wizardIsNotFinished');
expect(App.get('wizardIsNotFinished')).to.equal(item.wizardIsNotFinished);
});
});
});
describe("#upgradeHolding", function () {
var cases = [
{
upgradeState: 'NOT_REQUIRED',
upgradeAborted: false,
upgradeHolding: false
},
{
upgradeState: 'HOLDING',
upgradeAborted: false,
upgradeHolding: true
},
{
upgradeState: 'HOLDING_FAILED',
upgradeAborted: false,
upgradeHolding: true
},
{
upgradeState: 'NOT_REQUIRED',
upgradeAborted: true,
upgradeHolding: true
}
];
beforeEach(function() {
this.mock = sinon.stub(App.router, 'get');
});
afterEach(function() {
this.mock.restore();
});
cases.forEach(function (test) {
it(test.upgradeState + ", upgradeAborted=" + test.upgradeAborted, function () {
App.reopen({
upgradeAborted: test.upgradeAborted,
upgradeState: test.upgradeState
});
App.propertyDidChange('upgradeHolding');
expect(App.get('upgradeHolding')).to.equal(test.upgradeHolding);
});
});
});
});