blob: 57c33b23afda953b0fab701dc569091a7264eba8 [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/step5_controller');
var modelSetup = require('test/init_model_test');
require('utils/ajax/ajax');
var c;
describe('App.WizardStep5Controller', function () {
beforeEach(function () {
c = App.WizardStep5Controller.create();
sinon.stub(App.router, 'send', Em.K);
App.set('router.nextBtnClickInProgress', false);
});
afterEach(function () {
App.router.send.restore();
App.set('router.nextBtnClickInProgress', false);
});
var controller = App.WizardStep5Controller.create();
controller.set('content', {});
controller.set('content', {});
describe('#sortHosts', function () {
var tests = Em.A([
{
hosts: [
Em.Object.create({memory: 4, cpu: 1, host_name: 'host1', id: 1}),
Em.Object.create({memory: 3, cpu: 1, host_name: 'host2', id: 2}),
Em.Object.create({memory: 2, cpu: 1, host_name: 'host3', id: 3}),
Em.Object.create({memory: 1, cpu: 1, host_name: 'host4', id: 4})
],
m: 'memory',
e: [1, 2, 3, 4]
},
{
hosts: [
Em.Object.create({memory: 1, cpu: 4, host_name: 'host1', id: 1}),
Em.Object.create({memory: 1, cpu: 3, host_name: 'host2', id: 2}),
Em.Object.create({memory: 1, cpu: 2, host_name: 'host3', id: 3}),
Em.Object.create({memory: 1, cpu: 1, host_name: 'host4', id: 4})
],
m: 'cpu',
e: [1, 2, 3, 4]
},
{
hosts: [
Em.Object.create({memory: 1, cpu: 1, host_name: 'host4', id: 1}),
Em.Object.create({memory: 1, cpu: 1, host_name: 'host2', id: 2}),
Em.Object.create({memory: 1, cpu: 1, host_name: 'host3', id: 3}),
Em.Object.create({memory: 1, cpu: 1, host_name: 'host1', id: 4})
],
m: 'host_name',
e: [4, 2, 3, 1]
},
{
hosts: [
Em.Object.create({memory: 2, cpu: 1, host_name: 'host1', id: 1}),
Em.Object.create({memory: 1, cpu: 2, host_name: 'host3', id: 2}),
Em.Object.create({memory: 1, cpu: 1, host_name: 'host4', id: 3}),
Em.Object.create({memory: 1, cpu: 1, host_name: 'host2', id: 4})
],
m: 'mix',
e: [1, 2, 4, 3]
}
]);
tests.forEach(function (test) {
it(test.m, function () {
var hosts = Em.copy(test.hosts);
controller.sortHosts(hosts);
expect(Em.A(hosts).mapProperty('id')).to.eql(test.e);
});
});
});
describe('#loadWizardHostsSuccessCallback', function () {
var tests = Em.A([
{
dbHosts: {
host1: {bootStatus: 'INIT'},
host2: {bootStatus: 'INIT'},
host3: {bootStatus: 'INIT'},
host4: {bootStatus: 'INIT'}
},
hosts: [
{Hosts: {total_mem: 4, cpu_count: 1, host_name: 'host1', bootStatus: 'INIT'}},
{Hosts: {total_mem: 3, cpu_count: 1, host_name: 'host2', bootStatus: 'INIT'}},
{Hosts: {total_mem: 2, cpu_count: 1, host_name: 'host3', bootStatus: 'INIT'}},
{Hosts: {total_mem: 1, cpu_count: 1, host_name: 'host4', bootStatus: 'INIT'}}
],
m: 'no one host is REGISTERED',
e: []
},
{
dbHosts: {
host1: {bootStatus: 'REGISTERED'},
host2: {bootStatus: 'REGISTERED'},
host3: {bootStatus: 'REGISTERED'},
host4: {bootStatus: 'REGISTERED'}
},
hosts: [
{Hosts: {total_mem: 4, cpu_count: 1, host_name: 'host1', bootStatus: 'REGISTERED'}},
{Hosts: {total_mem: 3, cpu_count: 1, host_name: 'host2', bootStatus: 'REGISTERED'}},
{Hosts: {total_mem: 2, cpu_count: 1, host_name: 'host3', bootStatus: 'REGISTERED'}},
{Hosts: {total_mem: 1, cpu_count: 1, host_name: 'host4', bootStatus: 'REGISTERED'}}
],
m: 'all hosts are REGISTERED, memory',
e: ['host1', 'host2', 'host3', 'host4']
},
{
dbHosts: {
host1: {bootStatus: 'REGISTERED'},
host2: {bootStatus: 'REGISTERED'},
host3: {bootStatus: 'REGISTERED'},
host4: {bootStatus: 'REGISTERED'}
},
hosts: [
{Hosts: {total_mem: 1, cpu_count: 4, host_name: 'host1', bootStatus: 'REGISTERED'}},
{Hosts: {total_mem: 1, cpu_count: 3, host_name: 'host2', bootStatus: 'REGISTERED'}},
{Hosts: {total_mem: 1, cpu_count: 2, host_name: 'host3', bootStatus: 'REGISTERED'}},
{Hosts: {total_mem: 1, cpu_count: 1, host_name: 'host4', bootStatus: 'REGISTERED'}}
],
m: 'all hosts are REGISTERED, cpu',
e: ['host1', 'host2', 'host3', 'host4']
},
{
dbHosts: {
host1: {bootStatus: 'REGISTERED'},
host2: {bootStatus: 'REGISTERED'},
host3: {bootStatus: 'REGISTERED'},
host4: {bootStatus: 'REGISTERED'}
},
hosts: [
{Hosts: {total_mem: 1, cpu_count: 1, host_name: 'host4', bootStatus: 'REGISTERED'}},
{Hosts: {total_mem: 1, cpu_count: 1, host_name: 'host2', bootStatus: 'REGISTERED'}},
{Hosts: {total_mem: 1, cpu_count: 1, host_name: 'host3', bootStatus: 'REGISTERED'}},
{Hosts: {total_mem: 1, cpu_count: 1, host_name: 'host1', bootStatus: 'REGISTERED'}}
],
m: 'all hosts are REGISTERED, host_name',
e: ['host1', 'host2', 'host3', 'host4']
},
{
dbHosts: {
host1: {bootStatus: 'REGISTERED'},
host2: {bootStatus: 'INIT'},
host3: {bootStatus: 'INIT'},
host4: {bootStatus: 'REGISTERED'}
},
hosts: [
{Hosts: {total_mem: 2, cpu_count: 1, host_name: 'host1', bootStatus: 'REGISTERED'}},
{Hosts: {total_mem: 1, cpu_count: 2, host_name: 'host3', bootStatus: 'INIT'}},
{Hosts: {total_mem: 1, cpu_count: 1, host_name: 'host4', bootStatus: 'REGISTERED'}},
{Hosts: {total_mem: 1, cpu_count: 1, host_name: 'host2', bootStatus: 'INIT'}}
],
m: 'mix',
e: ['host1', 'host4']
}
]);
tests.forEach(function (test) {
it(test.m, function () {
controller.set('content', {hosts: test.dbHosts});
controller.loadWizardHostsSuccessCallback({items: test.hosts});
var r = controller.get('hosts');
expect(Em.A(r).mapProperty('host_name')).to.eql(test.e);
});
});
});
describe('#last', function () {
var tests = Em.A([
{
selectedServicesMasters: Em.A([
{component_name: 'c1', indx: 1},
{component_name: 'c2', indx: 2},
{component_name: 'c1', indx: 2}
]),
m: 'Components exists',
c: 'c1',
e: 2
},
{
selectedServicesMasters: Em.A([
{component_name: 'c1', indx: 1},
{component_name: 'c2', indx: 2},
{component_name: 'c1', indx: 2}
]),
m: 'Components don\'t exists',
c: 'c3',
e: null
}
]);
tests.forEach(function (test) {
it(test.m, function () {
controller.set('selectedServicesMasters', test.selectedServicesMasters);
if (!Em.isNone(test.e)) {
expect(controller.last(test.c).indx).to.equal(test.e);
}
else {
expect(Em.isNone(controller.last(test.c))).to.equal(true);
}
})
});
});
describe('#remainingHosts', function () {
it('should show count of hosts without masters', function () {
c.reopen({masterHostMapping: [
{}
]});
c.set('hosts', [
{},
{},
{}
]);
expect(c.get('remainingHosts')).to.equal(2);
});
});
describe('#clearStep', function () {
var tests = Em.A([
{p: 'hosts'},
{p: 'selectedServicesMasters'},
{p: 'servicesMasters'}
]);
tests.forEach(function (test) {
it('should cleanup ' + test.p, function () {
c.set(test.p, [Em.Object.create({}), Em.Object.create({})]);
c.clearStep();
expect(c.get(test.p).length).to.equal(0);
});
});
});
describe('#updateComponent', function () {
var tests = Em.A([
{
componentName: 'HBASE_SERVER',
serviceComponents: [
Em.Object.create({
componentName: 'HBASE_SERVER',
stackService: Em.Object.create({isInstalled: true, serviceName: 'HBASE'})
})
],
selectedServicesMasters: Em.A([
Em.Object.create({showAddControl: false, showRemoveControl: true, component_name: 'HBASE_SERVER'}),
Em.Object.create({showAddControl: true, showRemoveControl: false, component_name: 'HBASE_SERVER'})
]),
hosts: Em.A([
Em.Object.create({})
]),
controllerName: 'addServiceController',
m: 'service is installed',
e: {
showAddControl: true,
showRemoveControl: false
}
},
{
componentName: 'HBASE_SERVER',
serviceComponents: [
Em.Object.create({
componentName: 'HBASE_SERVER',
stackService: Em.Object.create({isInstalled: false, serviceName: 'HBASE'})
})
],
selectedServicesMasters: Em.A([
Em.Object.create({showAddControl: true, showRemoveControl: false, component_name: 'HBASE_SERVER'})
]),
hosts: Em.A([
Em.Object.create({})
]),
controllerName: 'addServiceController',
m: 'service not installed, but all host already have provided component',
e: {
showAddControl: true,
showRemoveControl: false
}
},
{
componentName: 'HBASE_SERVER',
serviceComponents: [
Em.Object.create({
componentName: 'HBASE_SERVER',
stackService: Em.Object.create({isInstalled: false, serviceName: 'HBASE'})
})
],
selectedServicesMasters: Em.A([
Em.Object.create({showAddControl: false, showRemoveControl: true, component_name: 'HBASE_SERVER'})
]),
hosts: Em.A([
Em.Object.create({}),
Em.Object.create({})
]),
controllerName: 'reassignMasterController',
m: 'service not installed, not all host already have provided component, but is reassignMasterController',
e: {
showAddControl: false,
showRemoveControl: false
}
}
]);
tests.forEach(function (test) {
describe(test.m, function () {
beforeEach(function () {
sinon.stub(App.StackServiceComponent, 'find', function () {
return test.serviceComponents;
});
c.reopen({
content: Em.Object.create({
controllerName: test.controllerName
}),
selectedServicesMasters: test.selectedServicesMasters,
hosts: test.hosts
});
c.updateComponent(test.componentName);
});
afterEach(function () {
App.StackServiceComponent.find.restore();
});
Em.keys(test.e).forEach(function (k) {
it(k, function () {
expect(c.last(test.componentName).get(k)).to.equal(test.e[k]);
});
});
});
});
});
describe('#renderComponents', function () {
var tests = Em.A([
{
masterComponents: Em.A([
{component_name: 'ZOOKEEPER_SERVER'}
]),
services: Em.A([
Em.Object.create({serviceName: 'ZOOKEEPER', isInstalled: false, isSelected: true})
]),
controllerName: 'reassignMasterController',
m: 'One component',
isHaEnabled: false,
component_name: 'ZOOKEEPER_SERVER',
e: {
selectedServicesMasters: ['ZOOKEEPER_SERVER'],
servicesMasters: ['ZOOKEEPER_SERVER'],
showRemoveControl: [false],
isInstalled: [false],
serviceComponentId: [1]
}
},
{
masterComponents: Em.A([
{component_name: 'ZOOKEEPER_SERVER'}
]),
services: Em.A([
Em.Object.create({serviceName: 'ZOOKEEPER', isInstalled: false, isSelected: true})
]),
controllerName: 'addServiceController',
m: 'One component, service is not installed',
component_name: 'ZOOKEEPER_SERVER',
e: {
selectedServicesMasters: ['ZOOKEEPER_SERVER'],
servicesMasters: ['ZOOKEEPER_SERVER'],
showRemoveControl: [false],
serviceComponentId: [1]
}
},
{
masterComponents: Em.A([
{component_name: 'ZOOKEEPER_SERVER'},
{component_name: 'ZOOKEEPER_SERVER'}
]),
services: Em.A([
Em.Object.create({serviceName: 'ZOOKEEPER', isInstalled: true})
]),
controllerName: 'addServiceController',
m: 'Two components, but service is installed',
component_name: 'ZOOKEEPER_SERVER',
e: {
selectedServicesMasters: ['ZOOKEEPER_SERVER', 'ZOOKEEPER_SERVER'],
servicesMasters: ['ZOOKEEPER_SERVER', 'ZOOKEEPER_SERVER'],
showRemoveControl: [false, false],
serviceComponentId: [1, 2]
}
}
]);
tests.forEach(function (test) {
describe(test.m, function () {
beforeEach(function () {
sinon.stub(App, 'get').withArgs('isHaEnabled').returns(test.isHaEnabled);
sinon.stub(App.StackService, 'find', function () {
return test.services;
});
modelSetup.setupStackServiceComponent();
c.reopen({
content: Em.Object.create({
services: test.services,
controllerName: test.controllerName,
reassign: {component_name: test.component_name}
})
});
c.renderComponents(test.masterComponents);
});
afterEach(function () {
App.get.restore();
App.StackService.find.restore();
modelSetup.cleanStackServiceComponent();
});
it('all selectedServicesMasters.component_name are valid', function () {
expect(c.get('selectedServicesMasters').mapProperty('component_name')).to.eql(test.e.selectedServicesMasters);
});
it('all servicesMasters.component_name are valid', function () {
expect(c.get('servicesMasters').mapProperty('component_name')).to.eql(test.e.servicesMasters);
});
it('all showRemoveControl are valid', function () {
expect(c.get('selectedServicesMasters').mapProperty('showRemoveControl')).to.eql(test.e.showRemoveControl);
});
it('all serviceComponentId are valid', function () {
expect(c.get('selectedServicesMasters').mapProperty('serviceComponentId')).to.eql(test.e.serviceComponentId);
});
it('servicesMasters.@each.isInstalled is valid', function () {
if (c.get('isReasignController')) {
expect(c.get('servicesMasters').mapProperty('isInstalled')).to.eql(test.e.isInstalled);
}
});
});
});
});
describe('#assignHostToMaster', function () {
var tests = Em.A([
{
componentName: 'c1',
selectedHost: 'h2',
serviceComponentId: '1',
e: {
indx: 0
}
},
{
componentName: 'c2',
selectedHost: 'h3',
serviceComponentId: '2',
e: {
indx: 3
}
},
{
componentName: 'c3',
selectedHost: 'h1',
e: {
indx: 2
}
},
{
componentName: 'c2',
selectedHost: 'h4',
e: {
indx: 1
}
}
]),
selectedServicesMasters = Em.A([
Em.Object.create({component_name: 'c1', serviceComponentId: '1', selectedHost: 'h1'}),
Em.Object.create({component_name: 'c2', serviceComponentId: '1', selectedHost: 'h1'}),
Em.Object.create({component_name: 'c3', serviceComponentId: '1', selectedHost: 'h3'}),
Em.Object.create({component_name: 'c2', serviceComponentId: '2', selectedHost: 'h2'})
]);
tests.forEach(function (test) {
it(test.componentName + ' ' + test.selectedHost + ' ' + test.serviceComponentId, function () {
c.set('selectedServicesMasters', selectedServicesMasters);
c.assignHostToMaster(test.componentName, test.selectedHost, test.serviceComponentId);
expect(c.get('selectedServicesMasters').objectAt(test.e.indx).get('selectedHost')).to.equal(test.selectedHost);
})
});
});
describe('#removeComponent', function () {
beforeEach(function () {
sinon.stub(c, 'getMaxNumberOfMasters', function () {
return Infinity;
});
});
afterEach(function(){
c.getMaxNumberOfMasters.restore();
});
var tests = Em.A([
{
componentName: 'c1',
serviceComponentId: 1,
selectedServicesMasters: Em.A([]),
hosts: [],
m: 'empty selectedServicesMasters',
e: false
},
{
componentName: 'ZOOKEPEER_SERVER',
serviceComponentId: 1,
selectedServicesMasters: Em.A([
Em.Object.create({serviceComponentId: 1, component_name: 'HBASE_SERVER'})
]),
hosts: [],
m: 'no such components',
e: false
},
{
componentName: 'ZOOKEPEER_SERVER',
serviceComponentId: 1,
selectedServicesMasters: Em.A([
Em.Object.create({serviceComponentId: 1, component_name: 'ZOOKEPEER_SERVER'})
]),
hosts: [],
m: 'component is only 1',
e: false
},
{
componentName: 'ZOOKEPEER_SERVER',
serviceComponentId: 2,
selectedServicesMasters: Em.A([
Em.Object.create({serviceComponentId: 1, component_name: 'ZOOKEPEER_SERVER', showAddControl: false, showRemoveControl: false}),
Em.Object.create({serviceComponentId: 2, component_name: 'ZOOKEPEER_SERVER', showAddControl: false, showRemoveControl: false})
]),
hosts: [
{},
{}
],
m: 'two components, add allowed, remove not allowed',
e: true,
showAddControl: true,
showRemoveControl: false
},
{
componentName: 'ZOOKEPEER_SERVER',
serviceComponentId: 2,
selectedServicesMasters: Em.A([
Em.Object.create({serviceComponentId: 1, component_name: 'ZOOKEPEER_SERVER', showAddControl: false, showRemoveControl: false}),
Em.Object.create({serviceComponentId: 2, component_name: 'ZOOKEPEER_SERVER', showAddControl: false, showRemoveControl: false}),
Em.Object.create({serviceComponentId: 3, component_name: 'ZOOKEPEER_SERVER', showAddControl: false, showRemoveControl: true})
]),
hosts: [
{},
{},
{}
],
m: 'three components, add allowed, remove allowed',
e: true,
showAddControl: true,
showRemoveControl: true
}
]);
tests.forEach(function (test) {
describe(test.m, function () {
beforeEach(function () {
c.set('selectedServicesMasters', JSON.parse(JSON.stringify(test.selectedServicesMasters)));
c.set('hosts', test.hosts);
this.result = c.removeComponent(test.componentName, test.serviceComponentId);
});
it('removeComponent returns ' + test.e, function () {
expect(this.result).to.equal(test.e);
});
if (test.e) {
it('showRemoveControl is correct', function () {
expect(c.get('selectedServicesMasters.lastObject.showRemoveControl')).to.equal(test.showRemoveControl);
});
it('showAddControl is correct', function () {
expect(c.get('selectedServicesMasters.lastObject.showAddControl')).to.equal(test.showAddControl);
});
it('componentToRebalance is correct', function () {
expect(c.get('componentToRebalance')).to.equal(test.componentName);
});
it('lastChangedComponent is correct', function () {
expect(c.get('lastChangedComponent')).to.equal(test.componentName);
});
}
})
});
});
describe('#addComponent', function () {
beforeEach(function () {
sinon.stub(c, 'getMaxNumberOfMasters', function () {
return Infinity;
});
});
afterEach(function(){
c.getMaxNumberOfMasters.restore();
});
var tests = Em.A([
{
componentName: 'c1',
selectedServicesMasters: Em.A([]),
hosts: [],
m: 'empty selectedServicesMasters',
e: false
},
{
componentName: 'ZOOKEPEER_SERVER',
selectedServicesMasters: Em.A([
Em.Object.create({serviceComponentId: 1, component_name: 'HBASE_SERVER'})
]),
hosts: [],
m: 'no such components',
e: false
},
{
componentName: 'ZOOKEPEER_SERVER',
selectedServicesMasters: Em.A([
Em.Object.create({serviceComponentId: 1, component_name: 'ZOOKEPEER_SERVER', showAddControl: false, showRemoveControl: false}),
Em.Object.create({serviceComponentId: 2, component_name: 'ZOOKEPEER_SERVER', showAddControl: false, showRemoveControl: false})
]),
hosts: [Em.Object.create({}), Em.Object.create({}), Em.Object.create({})],
m: 'two components, 3 hosts',
e: true
}
]);
tests.forEach(function (test) {
it(test.m, function () {
c.set('selectedServicesMasters', test.selectedServicesMasters);
c.set('hosts', test.hosts);
expect(c.addComponent(test.componentName)).to.equal(test.e);
if (test.e) {
expect(c.get('componentToRebalance')).to.equal(test.componentName);
expect(c.get('lastChangedComponent')).to.equal(test.componentName);
}
});
});
});
describe('#masterHostMapping', function () {
Em.A([
{
selectedServicesMasters: [
Em.Object.create({selectedHost: 'h1'}),
Em.Object.create({selectedHost: 'h2'}),
Em.Object.create({selectedHost: 'h1'})
],
hosts: [
Em.Object.create({host_name: 'h1', host_info: {}}),
Em.Object.create({host_name: 'h2', host_info: {}})
],
m: 'Two hosts',
e: [
{host_name: 'h1', hostInfo: {}, masterServices: [
{},
{}
]},
{host_name: 'h2', hostInfo: {}, masterServices: [
{}
]}
]
},
{
selectedServicesMasters: [],
hosts: [],
m: 'No hosts',
e: []
},
{
selectedServicesMasters: [
Em.Object.create({selectedHost: 'h1'}),
Em.Object.create({selectedHost: 'h1'})
],
hosts: [
Em.Object.create({host_name: 'h1', host_info: {}})
],
m: 'One host',
e: [
{host_name: 'h1', hostInfo: {}, masterServices: [
{},
{}
]}
]
}
]).forEach(function (test) {
describe(test.m, function () {
var result;
beforeEach(function () {
c.reopen({
selectedServicesMasters: test.selectedServicesMasters,
hosts: test.hosts
});
result = c.get('masterHostMapping');
});
it('all needed hosts are mapped', function () {
expect(result.length).to.equal(test.e.length);
});
it('all needed hosts have valid data', function () {
expect(result.mapProperty('host_name')).to.be.eql(test.e.mapProperty('host_name'));
expect(result.mapProperty('masterServices.length')).to.be.eql(test.e.mapProperty('masterServices.length'));
});
});
});
});
describe('#anyError', function () {
Em.A([
{
servicesMasters: [
Em.Object.create({errorMessage: 'some message'}),
Em.Object.create({errorMessage: ''})
],
generalErrorMessages: [],
e: true
},
{
servicesMasters: [
Em.Object.create({errorMessage: ''}),
Em.Object.create({errorMessage: ''})
],
generalErrorMessages: [],
e: false
},
{
servicesMasters: [
Em.Object.create({errorMessage: 'some message'}),
Em.Object.create({errorMessage: 'some message 2'})
],
generalErrorMessages: ['some message'],
e: true
},
{
servicesMasters: [
Em.Object.create({errorMessage: ''}),
Em.Object.create({errorMessage: ''})
],
generalErrorMessages: ['some message'],
e: true
}
]).forEach(function (test, i) {
it('test #' + i.toString(), function () {
c.setProperties({
servicesMasters: test.servicesMasters,
generalErrorMessages: test.generalErrorMessages
});
expect(c.get('anyError')).to.equal(test.e);
});
});
});
describe('#anyWarning', function () {
Em.A([
{
servicesMasters: [
Em.Object.create({warnMessage: 'some message'}),
Em.Object.create({warnMessage: ''})
],
generalWarningMessages: [],
e: true
},
{
servicesMasters: [
Em.Object.create({warnMessage: ''}),
Em.Object.create({warnMessage: ''})
],
generalWarningMessages: [],
e: false
},
{
servicesMasters: [
Em.Object.create({warnMessage: 'some message'}),
Em.Object.create({warnMessage: 'some message 2'})
],
generalWarningMessages: ['some message'],
e: true
},
{
servicesMasters: [
Em.Object.create({warnMessage: ''}),
Em.Object.create({warnMessage: ''})
],
generalWarningMessages: ['some message'],
e: true
}
]).forEach(function (test, i) {
it('test #' + i.toString(), function () {
c.setProperties({
servicesMasters: test.servicesMasters,
generalWarningMessages: test.generalWarningMessages
});
expect(c.get('anyWarning')).to.equal(test.e);
});
});
});
describe('#clearRecommendations', function () {
it('should clear content.recommendations', function () {
c.set('content', {recommendations: {'s': {}}});
c.clearRecommendations();
expect(c.get('content.recommendations')).to.be.null;
});
});
describe('#updateIsSubmitDisabled', function () {
var clearCases = [
{
isHostNameValid: true,
isInitialLayout: true,
isInitialLayoutResulting: false,
clearRecommendationsCallCount: 0,
recommendAndValidateCallCount: 1,
title: 'initial masters-hosts layout'
},
{
isHostNameValid: true,
isInitialLayout: false,
isInitialLayoutResulting: false,
clearRecommendationsCallCount: 1,
recommendAndValidateCallCount: 1,
title: 'master-hosts layout changed'
},
{
isHostNameValid: false,
isInitialLayout: false,
isInitialLayoutResulting: false,
clearRecommendationsCallCount: 0,
recommendAndValidateCallCount: 0,
title: 'invalid host name specified'
}
];
beforeEach(function () {
c.set('selectedServicesMasters', [
{isInstalled: false}
]);
sinon.stub(c, 'clearRecommendations', Em.K);
sinon.stub(c, 'recommendAndValidate', Em.K);
});
afterEach(function () {
c.clearRecommendations.restore();
c.recommendAndValidate.restore();
});
it('shouldn\'t change submitDisabled if thereIsNoMasters returns false', function () {
c.set('selectedServicesMasters', [
{isInstalled: true}
]);
c.set('submitDisabled', false);
c.updateIsSubmitDisabled();
expect(c.get('submitDisabled')).to.equal(false);
});
it('should check servicesMasters.@each.isHostNameValid if useServerValidation is false', function () {
c.set('useServerValidation', false);
c.set('servicesMasters', [
{isHostNameValid: false},
{isHostNameValid: true}
]);
c.updateIsSubmitDisabled();
expect(c.get('submitDisabled')).to.equal(true);
c.set('servicesMasters', [
{isHostNameValid: true},
{isHostNameValid: true}
]);
c.updateIsSubmitDisabled();
expect(c.get('submitDisabled')).to.equal(false);
});
clearCases.forEach(function (item) {
it(item.title, function () {
c.setProperties({
isInitialLayout: item.isInitialLayout,
servicesMasters: [{
isHostNameValid: item.isHostNameValid
}]
});
expect(c.get('isInitialLayout')).to.equal(item.isInitialLayoutResulting);
expect(c.clearRecommendations.callCount).to.equal(item.clearRecommendationsCallCount);
expect(c.recommendAndValidate.callCount).to.equal(item.recommendAndValidateCallCount);
});
});
});
describe('#isHostNameValid', function () {
beforeEach(function () {
c.setProperties({
hosts: [
{host_name: 'h1', isInstalled: false},
{host_name: 'h2', isInstalled: true, maintenance_state: 'ON'},
{host_name: 'h3', isInstalled: true, maintenance_state: 'OFF'}
],
selectedServicesMasters: [
{component_name: 'c1', selectedHost: 'h1'},
{component_name: 'c2', selectedHost: 'h2'},
{component_name: 'c3', selectedHost: 'h3'},
{component_name: 'c3', selectedHost: 'h1'}
]
});
});
Em.A([
{
componentName: 'c1',
selectedHost: ' ',
m: 'empty hostName is invalid',
e: false
},
{
componentName: 'c1',
selectedHost: 'h4',
m: 'hostName not exists',
e: false
},
{
componentName: 'c1',
selectedHost: 'h1',
m: 'not installed host',
e: true
},
{
componentName: 'c1',
selectedHost: 'h2',
m: 'installed host with maintenance ON',
e: false
},
{
componentName: 'c1',
selectedHost: 'h3',
m: 'installed host with maintenance OFF',
e: true
},
{
componentName: 'c4',
selectedHost: 'h3',
m: 'component not exists on host',
e: true
}
]).forEach(function (test) {
it(test.m, function () {
expect(c.isHostNameValid(test.componentName, test.selectedHost)).to.equal(test.e);
});
});
});
describe('#createComponentInstallationObject', function () {
afterEach(function () {
App.StackServiceComponent.find.restore();
});
Em.A([
{
fullComponent: Em.Object.create({
componentName: 'c1',
serviceName: 's1'
}),
hostName: 'h1',
mastersToMove: ['c1'],
savedComponent: {
hostName: 'h2',
isInstalled: true
},
stackServiceComponents: [Em.Object.create({componentName: 'c1', isCoHostedComponent: true})],
e: {
component_name: 'c1',
display_name: 'C1',
serviceId: 's1',
selectedHost: 'h2',
isInstalled: true,
isServiceCoHost: false
}
},
{
fullComponent: Em.Object.create({
componentName: 'c1',
serviceName: 's1'
}),
hostName: 'h1',
mastersToMove: [],
stackServiceComponents: [Em.Object.create({componentName: 'c1', isCoHostedComponent: false})],
e: {
component_name: 'c1',
display_name: 'C1',
serviceId: 's1',
selectedHost: 'h1',
isInstalled: false,
isServiceCoHost: false
}
},
{
fullComponent: Em.Object.create({
componentName: 'c1',
serviceName: 's1'
}),
hostName: 'h1',
mastersToMove: [],
stackServiceComponents: [Em.Object.create({componentName: 'c1', isCoHostedComponent: true})],
e: {
component_name: 'c1',
display_name: 'C1',
serviceId: 's1',
selectedHost: 'h1',
isInstalled: false,
isServiceCoHost: true
}
}
]).forEach(function (test, i) {
describe('test #' + i, function () {
beforeEach(function () {
sinon.stub(App.StackServiceComponent, 'find', function () {
return test.stackServiceComponents;
});
c.set('mastersToMove', test.mastersToMove);
c.set('content', {controllerName: test.controllerName});
});
it('component-object is valid', function () {
expect(c.createComponentInstallationObject(test.fullComponent, test.hostName, test.savedComponent)).to.eql(test.e);
});
});
});
});
describe('#createComponentInstallationObjects', function () {
beforeEach(function() {
sinon.stub(App.StackServiceComponent, 'find', function() {
return [
Em.Object.create({isShownOnAddServiceAssignMasterPage: true, componentName: 'c1', serviceName: 's1'}),
Em.Object.create({isShownOnAddServiceAssignMasterPage: true, componentName: 'c2', serviceName: 's2'}),
Em.Object.create({isShownOnAddServiceAssignMasterPage: true, componentName: 'c4', serviceName: 's2'}),
Em.Object.create({isShownOnInstallerAssignMasterPage: true, componentName: 'c1', serviceName: 's1'}),
Em.Object.create({isShownOnInstallerAssignMasterPage: true, componentName: 'c2', serviceName: 's2'}),
Em.Object.create({isShownOnInstallerAssignMasterPage: true, componentName: 'c4', serviceName: 's2'})
];
});
var recommendations = {
"blueprint": {
"host_groups": [
{
"name": "host-group-1",
"components": [ {"name": "c1"}, {"name": "c2"} ]
},
{
"name": "host-group-2",
"components": [ {"name": "c1"}, {"name": "c2"} ]
},
{
"name": "host-group-3",
"components": [ {"name": "c1"} ]
}
]
},
"blueprint_cluster_binding": {
"host_groups": [
{
"name": "host-group-1",
"hosts": [ {"fqdn": "h1"} ]
},
{
"name": "host-group-2",
"hosts": [ {"fqdn": "h2"} ]
},
{
"name": "host-group-3",
"hosts": [ {"fqdn": "h3"} ]
}
]
}
};
c.set('recommendations', recommendations);
c.set('content', {
masterComponentHosts: [],
services: [
{serviceName: 's1', isSelected: true, isInstalled: false},
{serviceName: 's2', isSelected: true, isInstalled: false}
],
recommendations: recommendations
});
});
afterEach(function() {
App.StackServiceComponent.find.restore();
});
it('simple map without nothing stored/saved etc', function() {
var r = c.createComponentInstallationObjects();
expect(r.mapProperty('component_name')).to.eql(['c1', 'c2', 'c1', 'c2', 'c1']);
expect(r.mapProperty('serviceId')).to.eql(['s1', 's2', 's1', 's2', 's1']);
expect(r.mapProperty('selectedHost')).to.eql(['h1', 'h1', 'h2', 'h2', 'h3']);
});
describe('some saved components exist', function() {
beforeEach(function () {
c.set('content.controllerName', 'addServiceController');
c.get('multipleComponents').push('c4');
c.set('content.masterComponentHosts', [
{hostName: 'h3', component: 'c4'}
]);
c.get('content.recommendations.blueprint.host_groups')[2].components.push({name: 'c4'});
});
it('data contains save components', function () {
var r = c.createComponentInstallationObjects();
expect(r.mapProperty('component_name')).to.eql(['c1', 'c2', 'c1', 'c2', 'c1', 'c4']);
expect(r.mapProperty('serviceId')).to.eql(['s1', 's2', 's1', 's2', 's1', 's2']);
expect(r.mapProperty('selectedHost')).to.eql(['h1', 'h1', 'h2', 'h2', 'h3', 'h3']);
});
});
});
describe('#updateValidationsSuccessCallback', function() {
beforeEach(function() {
sinon.stub(App.HostComponent, 'find', function() {
return [];
});
});
afterEach(function() {
App.HostComponent.find.restore();
});
describe('should map messages to generalErrorMessages, generalWarningMessages', function() {
var data = [
{
type: 'host-component',
'component-name': 'c1',
host: 'h1',
level: 'ERROR',
message: 'm1'
},
{
type: 'host-component',
'component-name': 'c2',
host: 'h2',
level: 'WARN',
message: 'm2'
},
{
type: 'host-component',
'component-name': 'c3',
host: 'h3',
level: 'ERROR',
message: 'm3'
},
{
type: 'host-component',
'component-name': 'c4',
host: 'h4',
level: 'WARN',
message: 'm4'
}
],
servicesMasters = [
Em.Object.create({selectedHost: 'h1', component_name: 'c1'}),
Em.Object.create({selectedHost: 'h2', component_name: 'c2'})
];
beforeEach(function () {
c.set('servicesMasters', servicesMasters);
c.updateValidationsSuccessCallback({resources: [{items: data}]});
});
it('submitDisabled is false', function () {
expect(c.get('submitDisabled')).to.equal(false);
});
it('errorMessage for c1 is `m1`', function () {
expect(c.get('servicesMasters').findProperty('component_name', 'c1').get('errorMessage')).to.equal('m1');
});
it('errorMessage for c2 is `m2`', function () {
expect(c.get('servicesMasters').findProperty('component_name', 'c2').get('warnMessage')).to.equal('m2');
});
it('no general errors', function () {
expect(c.get('generalErrorMessages')).to.be.empty;
});
it('no general warnings', function () {
expect(c.get('generalWarningMessages')).to.be.empty;
});
});
});
});