blob: 823db86cd072fabca2fd4d305db6731a34a2c171 [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');
var testHelpers = require('test/helpers');
describe('App.serviceMetricsMapper', function () {
describe('#computeAdditionalRelations', function () {
var tests = [
{
message: 'if both namenodes are standby then `display_name_advanced` for both should be `Standby NameNode`',
haStateForNn1: 'standby',
haStateForNn2: 'standby',
expectedNameForNn1: 'Standby NameNode',
expectedNameForNn2: 'Standby NameNode'
},
{
message: 'if one namenode is active and another is standby then they should be shown as `Active NameNode` and `Standby NameNode` respectively',
haStateForNn1: 'active',
haStateForNn2: 'standby',
expectedNameForNn1: 'Active NameNode',
expectedNameForNn2: 'Standby NameNode'
},
{
message: 'if one namenode is active and another is unknown then they should be shown as `Active NameNode` and `Standby NameNode` respectively',
haStateForNn1: 'active',
haStateForNn2: undefined,
expectedNameForNn1: 'Active NameNode',
expectedNameForNn2: 'Standby NameNode'
},
{
message: 'if both namenodes state are unknown then `display_name_advanced` for both should be null (NN will be shown with display name as `NameNode`)',
haStateForNn1: undefined,
haStateForNn2: undefined,
expectedNameForNn1: null,
expectedNameForNn2: null
}
];
var services = [
{
ServiceInfo: {
service_name: "HDFS"
},
components: [
{
ServiceComponentInfo: {
component_name: "NAMENODE",
service_name: "HDFS"
},
host_components: [
{
HostRoles: {
component_name: "NAMENODE",
host_name: "h1"
},
metrics: {
dfs: {
FSNamesystem: {
HAState: ""
}
}
}
},
{
HostRoles: {
component_name: "NAMENODE",
host_name: "h2"
},
metrics: {
dfs: {
FSNamesystem: {
HAState: ""
}
}
}
}
]
}
]
}
];
var hostComponents = [
{
component_name: "NAMENODE",
host_id: "h1",
service_id: "HDFS"
},
{
component_name: "NAMENODE",
host_id: "h2",
service_id: "HDFS"
}
];
tests.forEach(function (test) {
it(test.message, function () {
services[0].components[0].host_components[0].metrics.dfs.FSNamesystem.HAState = test.haStateForNn1;
services[0].components[0].host_components[1].metrics.dfs.FSNamesystem.HAState = test.haStateForNn2;
App.serviceMetricsMapper.computeAdditionalRelations(hostComponents, services);
expect(hostComponents[0].display_name_advanced).to.equal(test.expectedNameForNn1);
expect(hostComponents[1].display_name_advanced).to.equal(test.expectedNameForNn2);
});
});
});
describe('#yarnMapper', function () {
it('should set ACTIVE RM first in any cases (if RM HA enabled)', function() {
var item = {
components: [
{
ServiceComponentInfo: {
component_name: 'RESOURCEMANAGER'
},
host_components: [
{
HostRoles: {
ha_state: null,
host_name : 'h1'
}
},
{
HostRoles: {
ha_state: 'ACTIVE',
host_name : 'h2'
},
metrics: {
yarn: {
Queue: {
root: {
default: {}
}
}
}
}
}
]
}
]
},
result = App.serviceMetricsMapper.yarnMapper(item);
expect(result.queue).to.equal("{\"root\":{\"default\":{}}}");
});
});
describe("#isHostComponentPresent()", function () {
var testCases = [
{
title: 'component is empty',
data: {
component: {},
name: 'C1'
},
result: false
},
{
title: 'component name does not match',
data: {
component: {
ServiceComponentInfo: {
component_name: ''
}
},
name: 'C1'
},
result: false
},
{
title: 'host_components is undefined',
data: {
component: {
ServiceComponentInfo: {
component_name: 'C1'
}
},
name: 'C1'
},
result: false
},
{
title: 'host_components is empty',
data: {
component: {
ServiceComponentInfo: {
component_name: 'C1'
},
host_components: []
},
name: 'C1'
},
result: false
},
{
title: 'host_components has component',
data: {
component: {
ServiceComponentInfo: {
component_name: 'C1'
},
host_components: [{}]
},
name: 'C1'
},
result: true
}
];
testCases.forEach(function (test) {
it(test.title, function () {
expect(App.serviceMetricsMapper.isHostComponentPresent(test.data.component, test.data.name)).to.equal(test.result);
});
});
});
var hostNames = ['hostName1', 'hostName2'];
var interactiveComponents = hostNames.map(function (hostName) {
return {host_name: hostName}
});
describe('#getHostNameIpMap', function () {
it ('should send ajax request with hostNames param and generate hostNameApiMap on success', function () {
App.ajax.send.restore();
sinon.stub(App.ajax, 'send', function () {
return {success: function (callback) {
callback({items: [{
Hosts: {
host_name: 'hostName1',
ip: '192.168.1.1'
}
}, {
Hosts: {
host_name: 'hostName2',
ip: '192.168.1.2'
}
}]});
}
};
});
App.serviceMetricsMapper.getHostNameIpMap(hostNames);
var args = testHelpers.findAjaxRequest('name', 'hosts.ips');
expect(args[0]).exists;
expect(args[0].data).to.be.eql({
hostNames: hostNames
});
expect(App.serviceMetricsMapper.get('hostNameIpMap')).to.be.eql({
'hostName1': '192.168.1.1',
'hostName2': '192.168.1.2'
});
});
});
describe('#loadInteractiveServerStatuses', function () {
var configurationController = App.router.get('configurationController');
beforeEach(function () {
sinon.stub(configurationController, 'getCurrentConfigsBySites', function () {
return {done: function (callback) {
return callback([
{type: 'hive-interactive-site', properties: {'hive.server2.webui.port': '1', 'hive.server2.leadertest.use.ip': true}},
]);
}};
});
sinon.stub(App.serviceMetricsMapper, 'getHostNameIpMap', function () {
return {
done: function () {
}
}
});
});
afterEach(function () {
configurationController.getCurrentConfigsBySites.restore();
App.serviceMetricsMapper.getHostNameIpMap.restore();
});
it('should not call load ips method', function () {
App.serviceMetricsMapper.loadInteractiveServerStatuses(interactiveComponents);
expect(App.serviceMetricsMapper.getHostNameIpMap.calledOnce).to.be.false;
expect(App.serviceMetricsMapper.getHostNameIpMap.calledWith(hostNames)).to.be.false;
});
it('should call load ips method', function () {
App.serviceMetricsMapper.set('hostNameIpMap', {});
App.serviceMetricsMapper.loadInteractiveServerStatuses(interactiveComponents);
expect(App.serviceMetricsMapper.getHostNameIpMap.calledOnce).to.be.true;
expect(App.serviceMetricsMapper.getHostNameIpMap.calledWith(interactiveComponents, '1')).to.be.false;
});
});
describe('#getHiveServersInteractiveStatus', function () {
beforeEach(function () {
App.ajax.send.restore();
sinon.stub(App.ajax, 'send', function () {
return {success: function (callback) {
callback(true);
}
};
});
sinon.stub(App.HostComponent, 'find', function () {
return hostNames.map(function (hostName) {
return Em.Object.create({hostName: hostName, componentName: 'HIVE_SERVER_INTERACTIVE'});
});
});
});
afterEach(function () {
App.HostComponent.find.restore();
});
it('should do several ajax requests depends on count of components count', function () {
App.serviceMetricsMapper.getHiveServersInteractiveStatus(interactiveComponents, '1');
expect(App.ajax.send.calledTwice).to.be.true;
});
});
});