blob: a23b831325966795d013e096db1375c0b89d689a [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');
var testHelpers = require('test/helpers');
describe('App.QuickViewLinks', function () {
var quickViewLinks = App.QuickLinksView.create({
content: Em.Object.create()
});
describe("#ambariProperties", function () {
beforeEach(function () {
sinon.stub(App.router, 'get').returns({p: 1});
});
afterEach(function () {
App.router.get.restore();
});
it("ambariProperties are updated", function () {
expect(quickViewLinks.get('ambariProperties')).to.eql({p: 1});
});
});
describe("#didInsertElement()", function () {
beforeEach(function () {
sinon.stub(App.router, 'get').returns({p: 1});
sinon.stub(quickViewLinks, 'loadQuickLinksConfigurations');
});
afterEach(function () {
App.router.get.restore();
quickViewLinks.loadQuickLinksConfigurations.restore();
});
it("loadQuickLinksConfigurations is called once", function () {
quickViewLinks.didInsertElement();
expect(quickViewLinks.loadQuickLinksConfigurations.calledOnce).to.be.true;
});
});
describe("#willDestroyElement()", function () {
beforeEach(function () {
quickViewLinks.setProperties({
configProperties: [{}],
quickLinks: [{}]
});
quickViewLinks.willDestroyElement();
});
it("configProperties empty", function () {
expect(quickViewLinks.get('configProperties')).to.be.empty;
});
it("quickLinks empty", function () {
expect(quickViewLinks.get('quickLinks')).to.be.empty;
});
});
describe("#setQuickLinks()", function () {
beforeEach(function () {
var mock = {
done: Em.clb
};
sinon.stub(quickViewLinks, 'setConfigProperties').returns(mock);
sinon.stub(quickViewLinks, 'getQuickLinksHosts');
sinon.stub(App, 'get').returns(true);
});
afterEach(function () {
quickViewLinks.setConfigProperties.restore();
quickViewLinks.getQuickLinksHosts.restore();
App.get.restore();
});
it("getQuickLinksHosts should be called", function () {
quickViewLinks.setQuickLinks();
expect(quickViewLinks.getQuickLinksHosts.calledOnce).to.be.true;
});
});
describe("#loadQuickLinksConfigSuccessCallback()", function () {
var mock;
beforeEach(function () {
sinon.stub(App.store, 'commit', Em.K);
mock = sinon.stub(quickViewLinks, 'getQuickLinksConfiguration');
});
afterEach(function () {
App.store.commit.restore();
mock.restore();
});
it("requiredSites consistent", function () {
var quickLinksConfigHBASE = {
protocol: {
type: "http"
},
links: [
{
port: {
site: "hbase-site"
}
}
]
};
var quickLinksConfigYARN = {
protocol: {
checks: [
{
site: "yarn-site"
}
],
type: "https"
},
links: [
{
port: {
site: "yarn-site"
},
host: {
site: "yarn-env"
}
}
]
};
quickViewLinks.set('content.serviceName', 'HBASE');
mock.returns(quickLinksConfigHBASE);
quickViewLinks.loadQuickLinksConfigSuccessCallback({items: []});
quickViewLinks.set('content.serviceName', 'YARN');
mock.returns(quickLinksConfigYARN);
quickViewLinks.loadQuickLinksConfigSuccessCallback({items: []});
expect(quickViewLinks.get('requiredSiteNames')).to.be.eql(["core-site", "hdfs-site", "admin-properties", "hbase-site", "yarn-site", "yarn-env"]);
});
});
describe("#getQuickLinksHosts()", function () {
beforeEach(function () {
sinon.stub(App.HostComponent, 'find').returns([
Em.Object.create({
componentName: 'HBASE_MASTER',
hostName: 'host1'
})
]);
sinon.stub(App.QuickLinksConfig, 'find').returns([
{
links: [
{
component_name: 'HBASE_MASTER'
}
]
}
]);
});
afterEach(function () {
App.HostComponent.find.restore();
App.QuickLinksConfig.find.restore();
});
it("call $.ajax", function () {
quickViewLinks.getQuickLinksHosts();
var args = testHelpers.findAjaxRequest('name', 'hosts.for_quick_links');
expect(args[0]).exists;
expect(args[0].sender).to.be.eql(quickViewLinks);
expect(args[0].data).to.be.eql({
clusterName: App.get('clusterName'),
hosts: 'host1',
urlParams: ''
});
});
it("call $.ajax, HBASE service", function () {
quickViewLinks.set('content.serviceName', 'HBASE');
quickViewLinks.getQuickLinksHosts();
var args = testHelpers.findAjaxRequest('name', 'hosts.for_quick_links');
expect(args[0]).exists;
expect(args[0].sender).to.be.eql(quickViewLinks);
expect(args[0].data).to.be.eql({
clusterName: App.get('clusterName'),
hosts: 'host1',
urlParams: ',host_components/metrics/hbase/master/IsActiveMaster'
});
});
});
describe("#setQuickLinksSuccessCallback()", function () {
var getQuickLinks;
beforeEach(function () {
this.mock = sinon.stub(quickViewLinks, 'getHosts');
getQuickLinks = sinon.stub(quickViewLinks, 'getQuickLinksConfiguration');
getQuickLinks.returns({});
sinon.stub(quickViewLinks, 'setEmptyLinks');
sinon.stub(quickViewLinks, 'setSingleHostLinks');
sinon.stub(quickViewLinks, 'setMultipleHostLinks');
sinon.stub(quickViewLinks, 'setMultipleGroupLinks');
quickViewLinks.set('content.quickLinks', []);
});
afterEach(function () {
this.mock.restore();
getQuickLinks.restore();
quickViewLinks.setEmptyLinks.restore();
quickViewLinks.setSingleHostLinks.restore();
quickViewLinks.setMultipleHostLinks.restore();
quickViewLinks.setMultipleGroupLinks.restore();
quickViewLinks.get('masterGroups').clear();
});
it("no hosts", function () {
this.mock.returns([]);
quickViewLinks.setQuickLinksSuccessCallback();
expect(quickViewLinks.setEmptyLinks.calledOnce).to.be.true;
});
it("has overridden hosts", function () {
this.mock.returns([]);
getQuickLinks.returns({ links: [{ host: {site: "yarn-env"} }] });
quickViewLinks.setQuickLinksSuccessCallback();
expect(quickViewLinks.setEmptyLinks.calledOnce).to.be.false;
});
it("quickLinks is not configured", function () {
this.mock.returns([{}]);
quickViewLinks.setQuickLinksSuccessCallback();
expect(quickViewLinks.setEmptyLinks.calledOnce).to.be.false;
});
it("single host", function () {
this.mock.returns([{hostName: 'host1'}]);
quickViewLinks.setQuickLinksSuccessCallback();
expect(quickViewLinks.setSingleHostLinks.calledWith([{hostName: 'host1'}])).to.be.true;
});
it("multiple hosts", function () {
this.mock.returns([{hostName: 'host1'}, {hostName: 'host2'}]);
quickViewLinks.setQuickLinksSuccessCallback();
expect(quickViewLinks.setMultipleHostLinks.calledWith(
[{hostName: 'host1'}, {hostName: 'host2'}]
)).to.be.true;
});
it("multiple grouped hosts", function () {
this.mock.returns([{hostName: 'host1'}, {hostName: 'host2'}]);
quickViewLinks.set('masterGroups', [{}, {}]);
quickViewLinks.setQuickLinksSuccessCallback();
expect(quickViewLinks.setMultipleGroupLinks.calledWith(
[{hostName: 'host1'}, {hostName: 'host2'}]
)).to.be.true;
});
});
describe("#getPublicHostName()", function () {
it("host present", function () {
var hosts = [{
Hosts: {
host_name: 'host1',
public_host_name: 'public_name'
}
}];
expect(quickViewLinks.getPublicHostName(hosts, 'host1')).to.equal('public_name');
});
it("host absent", function () {
expect(quickViewLinks.getPublicHostName([], 'host1')).to.be.null;
});
});
describe("#setConfigProperties()", function () {
beforeEach(function () {
sinon.stub(App.router.get('configurationController'), 'getCurrentConfigsBySites');
});
afterEach(function () {
App.router.get('configurationController').getCurrentConfigsBySites.restore();
});
it("getCurrentConfigsBySites called with correct data", function () {
quickViewLinks.set('requiredSiteNames', ['hdfs-site']);
quickViewLinks.setConfigProperties();
expect(App.router.get('configurationController').getCurrentConfigsBySites.calledWith(['hdfs-site'])).to.be.true;
});
});
describe("#setEmptyLinks()", function () {
it("empty links are set", function () {
quickViewLinks.setEmptyLinks();
expect(quickViewLinks.get('quickLinks')).to.eql([{
label: quickViewLinks.get('quickLinksErrorMessage'),
}]);
expect(quickViewLinks.get('isLoaded')).to.be.true;
});
});
describe("#processOozieHosts()", function () {
it("host status is valid", function () {
quickViewLinks.set('content.hostComponents', [Em.Object.create({
componentName: 'OOZIE_SERVER',
workStatus: 'STARTED',
hostName: 'host1'
})]);
var host = {hostName: 'host1'};
quickViewLinks.processOozieHosts([host]);
expect(host.status).to.equal(Em.I18n.t('quick.links.label.active'));
});
it("host status is invalid", function () {
quickViewLinks.set('content.hostComponents', [Em.Object.create({
componentName: 'OOZIE_SERVER',
workStatus: 'INSTALLED',
hostName: 'host1'
})]);
var host = {hostName: 'host1'};
quickViewLinks.processOozieHosts([host]);
expect(quickViewLinks.get('quickLinksErrorMessage')).to.equal(Em.I18n.t('quick.links.error.oozie.label'));
});
});
describe("#processHdfsHosts()", function () {
beforeEach(function () {
quickViewLinks.set('content.activeNameNodes', []);
quickViewLinks.set('content.standbyNameNodes', []);
});
it("active namenode host", function () {
quickViewLinks.get('content.activeNameNodes').pushObject(Em.Object.create({hostName: 'host1'}));
var host = {hostName: 'host1'};
quickViewLinks.processHdfsHosts([host]);
expect(host.status).to.equal(Em.I18n.t('quick.links.label.active'));
});
it("standby namenode host", function () {
quickViewLinks.get('content.standbyNameNodes').pushObject(Em.Object.create({hostName: 'host1'}));
var host = {hostName: 'host1'};
quickViewLinks.processHdfsHosts([host]);
expect(host.status).to.equal(Em.I18n.t('quick.links.label.standby'));
});
});
describe("#processHbaseHosts()", function () {
it("isActiveMaster is true", function () {
var response = {
items: [
{
Hosts: {
host_name: 'host1'
},
host_components: [
{
HostRoles: {
component_name: 'HBASE_MASTER'
},
metrics: {
hbase: {
master: {
IsActiveMaster: 'true'
}
}
}
}
]
}
]
};
var host = {hostName: 'host1'};
quickViewLinks.processHbaseHosts([host], response);
expect(host.status).to.equal(Em.I18n.t('quick.links.label.active'));
});
it("isActiveMaster is false", function () {
var response = {
items: [
{
Hosts: {
host_name: 'host1'
},
host_components: [
{
HostRoles: {
component_name: 'HBASE_MASTER'
},
metrics: {
hbase: {
master: {
IsActiveMaster: 'false'
}
}
}
}
]
}
]
};
var host = {hostName: 'host1'};
quickViewLinks.processHbaseHosts([host], response);
expect(host.status).to.equal(Em.I18n.t('quick.links.label.standby'));
});
it("isActiveMaster is undefined", function () {
var response = {
items: [
{
Hosts: {
host_name: 'host1'
},
host_components: [
{
HostRoles: {
component_name: 'HBASE_MASTER'
}
}
]
}
]
};
var host = {hostName: 'host1'};
quickViewLinks.processHbaseHosts([host], response);
expect(host.status).to.be.undefined;
});
});
describe("#processYarnHosts()", function () {
it("haStatus is ACTIVE", function () {
quickViewLinks.set('content.hostComponents', [Em.Object.create({
componentName: 'RESOURCEMANAGER',
hostName: 'host1',
haStatus: 'ACTIVE'
})]);
var host = {hostName: 'host1'};
quickViewLinks.processYarnHosts([host]);
expect(host.status).to.equal(Em.I18n.t('quick.links.label.active'));
});
it("haStatus is STANDBY", function () {
quickViewLinks.set('content.hostComponents', [Em.Object.create({
componentName: 'RESOURCEMANAGER',
hostName: 'host1',
haStatus: 'STANDBY'
})]);
var host = {hostName: 'host1'};
quickViewLinks.processYarnHosts([host]);
expect(host.status).to.equal(Em.I18n.t('quick.links.label.standby'));
});
it("haStatus is undefined", function () {
quickViewLinks.set('content.hostComponents', [Em.Object.create({
componentName: 'RESOURCEMANAGER',
hostName: 'host1'
})]);
var host = {hostName: 'host1'};
quickViewLinks.processYarnHosts([host]);
expect(host.status).to.be.undefined;
});
});
describe("#findHosts()", function () {
beforeEach(function () {
sinon.stub(quickViewLinks, 'getPublicHostName').returns('public_name');
sinon.stub(App.MasterComponent, 'find').returns([
Em.Object.create({
componentName: "C1",
hostNames: ["host1", "host2"]
})
]);
});
afterEach(function () {
quickViewLinks.getPublicHostName.restore();
App.MasterComponent.find.restore();
});
it("public_name from getPublicHostName", function () {
expect(quickViewLinks.findHosts('C1', {})).to.eql([
{
hostName: 'host1',
publicHostName: 'public_name',
componentName: 'C1'
},
{
hostName: 'host2',
publicHostName: 'public_name',
componentName: 'C1'
}
]);
});
});
describe('#setProtocol', function () {
var tests = [
//Yarn
{
serviceName: "YARN",
configProperties: [
{type: 'yarn-site', properties: {'yarn.http.policy': 'HTTPS_ONLY'}}
],
quickLinksConfig: {
protocol:{
type:"https",
checks:[
{property:"yarn.http.policy",
desired:"HTTPS_ONLY",
site:"yarn-site"}
]
}
},
m: "https for yarn (checks for https passed)",
result: "https"
},
{
serviceName: "YARN",
configProperties: [
{type: 'yarn-site', properties: {'yarn.http.policy': 'HTTP_ONLY'}}
],
quickLinksConfig: {
protocol:{
type:"http",
checks:[
{property:"yarn.http.policy",
desired:"HTTP_ONLY",
site:"yarn-site"}
]
}
},
m: "http for yarn (checks for http passed)",
result: "http"
},
{
serviceName: "YARN",
configProperties: [
{type: 'yarn-site', properties: {'yarn.http.policy': 'HTTP_ONLY'}}
],
quickLinksConfig: {
protocol:{
type:"https",
checks:[
{property:"yarn.http.policy",
desired:"HTTPS_ONLY",
site:"yarn-site"}
]
}
},
m: "http for yarn (checks for https did not pass)",
result: "http"
},
{
serviceName: "YARN",
configProperties: [
{type: 'yarn-site', properties: {'yarn.http.policy': 'HTTPS_ONLY'}}
],
quickLinksConfig: {
protocol:{
type:"http",
checks:[
{property:"yarn.http.policy",
desired:"HTTP_ONLY",
site:"yarn-site"}
]
}
},
m: "https for yarn (checks for http did not pass)",
result: "https"
},
{
serviceName: "YARN",
configProperties: [
{type: 'yarn-site', properties: {'yarn.http.policy': 'HTTP_ONLY'}}
],
quickLinksConfig: {
protocol:{
type:"HTTP_ONLY",
checks:[
{property:"yarn.http.policy",
desired:"HTTPS_ONLY",
site:"yarn-site"}
]
}
},
m: "http for yarn (override checks with specific protocol type)",
result: "http"
},
{
serviceName: "YARN",
configProperties: [
{type: 'yarn-site', properties: {'yarn.http.policy': 'HTTPS_ONLY'}}
],
quickLinksConfig: {
protocol:{
type:"HTTPS_ONLY",
checks:[
{property:"yarn.http.policy",
desired:"HTTPS_ONLY",
site:"yarn-site"}
]
}
},
m: "https for yarn (override checks with specific protocol type)",
result: "https"
},
//Any service - override hadoop.ssl.enabled
{
serviceName: "MyService",
configProperties: [
{type: 'myservice-site', properties: {'myservice.http.policy': 'HTTPS_ONLY'}},
{type: 'hdfs-site', properties: {'dfs.http.policy':'HTTP_ONLY'}}
],
quickLinksConfig: {
protocol:{
type:"https",
checks:[
{property:"myservice.http.policy",
desired:"HTTPS_ONLY",
site:"myservice-site"}
]
}
},
m: "https for MyService (checks for https passed, override hadoop.ssl.enabled)",
result: "https"
},
//Oozie
{
serviceName: "OOZIE",
configProperties: [
{type: 'oozie-site', properties: {'oozie.https.port': '12345', 'oozie.https.keystore.file':'/tmp/oozie.jks', 'oozie.https.keystore.pass':'mypass'}}
],
quickLinksConfig: {
protocol:{
type:"HTTPS",
checks:
[
{
"property":"oozie.https.port",
"desired":"EXIST",
"site":"oozie-site"
},
{
"property":"oozie.https.keystore.file",
"desired":"EXIST",
"site":"oozie-site"
},
{
"property":"oozie.https.keystore.pass",
"desired":"EXIST",
"site":"oozie-site"
}
]
}
},
m: "https for oozie (checks for https passed)",
result: "https"
},
{
serviceName: "OOZIE",
configProperties: [
{type: 'oozie-site', properties: {"oozie.base.url":"http://c6401.ambari.apache.org:11000/oozie"}}
],
quickLinksConfig: {
protocol:{
type:"https",
checks:
[
{
"property":"oozie.https.port",
"desired":"EXIST",
"site":"oozie-site"
},
{
"property":"oozie.https.keystore.file",
"desired":"EXIST",
"site":"oozie-site"
},
{
"property":"oozie.https.keystore.pass",
"desired":"EXIST",
"site":"oozie-site"
}
]
}
},
m: "http for oozie (checks for https did not pass)",
result: "http"
},
//Ranger: HDP 2.2
{
serviceName: "RANGER",
configProperties: [{type: 'ranger-site', properties: {'http.enabled': 'false'}}],
quickLinksConfig: {
protocol:{
type:"https",
checks:
[
{
"property":"http.enabled",
"desired":"false",
"site":"ranger-site"
}
]
}
},
m: "https for ranger (HDP2.2, checks passed)",
result: "https"
},
{
serviceName: "RANGER",
configProperties: [{type: 'ranger-site', properties: {'http.enabled': 'true'}}],
quickLinksConfig: {
protocol:{
type:"HTTPS",
checks:
[
{
"property":"http.enabled",
"desired":"false",
"site":"ranger-site"
}
]
}
},
m: "http for ranger (HDP2.2, checks for https did not pass)",
result: "http"
},
//Ranger: HDP 2.3
{
serviceName: "RANGER",
configProperties:
[
{
type: 'ranger-admin-site',
properties: {'ranger.service.http.enabled': 'false', 'ranger.service.https.attrib.ssl.enabled': 'true'}
}
],
quickLinksConfig: {
protocol:{
type:"https",
checks:
[
{
"property":"ranger.service.http.enabled",
"desired":"false",
"site":"ranger-admin-site"
},
{
"property":"ranger.service.https.attrib.ssl.enabled",
"desired":"true",
"site":"ranger-admin-site"
}
]
}
},
m: "https for ranger (HDP2.3, checks passed)",
result: "https"
},
{
serviceName: "RANGER",
configProperties:
[
{
type: 'ranger-admin-site',
properties: {'ranger.service.http.enabled': 'true', 'ranger.service.https.attrib.ssl.enabled': 'false'}
}
],
quickLinksConfig: {
protocol:{
type:"https",
checks:
[
{
"property":"ranger.service.http.enabled",
"desired":"false",
"site":"ranger-admin-site"
},
{
"property":"ranger.service.https.attrib.ssl.enabled",
"desired":"true",
"site":"ranger-admin-site"
}
]
}
},
m: "http for ranger (HDP2.3, checks for https did not pass)",
result: "http"
}
];
tests.forEach(function (t) {
it(t.m, function () {
quickViewLinks.set('servicesSupportsHttps', t.servicesSupportsHttps);
expect(quickViewLinks.setProtocol(t.configProperties, t.quickLinksConfig.protocol)).to.equal(t.result);
});
});
});
describe('#resolvePlaceholders', function() {
beforeEach(function() {
quickViewLinks.setProperties({
configProperties: [{
'type': 'config-type1',
'properties': {'property1': 'value1'}
}],
actualTags: [""],
quickLinks: [{}]
});
}),
it("replaces placeholders from config", function () {
expect(quickViewLinks.resolvePlaceholders('${config-type1/property1}')).to.equal('value1');
}),
it("leaves url as it is if config-type was not found", function () {
expect(quickViewLinks.resolvePlaceholders('${unknown-config-type/property1}')).to.equal('${unknown-config-type/property1}');
}),
it("leaves url as it is if property was not found", function () {
expect(quickViewLinks.resolvePlaceholders('${config-type1/unknown-property}')).to.equal('${config-type1/unknown-property}');
})
}),
describe('#setPort', function () {
var testData = [
Em.Object.create({
'protocol': 'http',
'port':{
'http_property':'yarn.timeline-service.webapp.address',
'http_default_port':'8188',
'https_property':'yarn.timeline-service.webapp.https.address',
'https_default_port':'8090',
'regex': '\\w*:(\\d+)',
'site':'yarn-site'
},
'configProperties':
[
{
'type': 'yarn-site',
'properties': {'yarn.timeline-service.webapp.address': 'c6401.ambari.apache.org:8188'}
}
],
'result': '8188'
}),
Em.Object.create({
'protocol': 'https',
'port':{
'http_property':'yarn.timeline-service.webapp.address',
'http_default_port':'8188',
'https_property':'yarn.timeline-service.webapp.https.address',
'https_default_port':'8090',
'regex': '\\w*:(\\d+)',
'site':'yarn-site'
},
'configProperties':
[
{
'type': 'yarn-site',
'properties': {'yarn.timeline-service.webapp.https.address': 'c6401.ambari.apache.org:8090'}
}
],
'result': '8090'
}),
Em.Object.create({
'protocol': 'https',
'port':{
'http_property':'oozie.base.url',
'http_default_port':'11000',
'https_property':'oozie.https.port',
'https_default_port':'11443',
'regex': '\\w*:(\\d+)',
'https_regex': '(\\d+)',
'site':'oozie-site'
},
'configProperties':
[
{
'type': 'oozie-site',
'properties':
{
'oozie.base.url': 'c6401.ambari.apache.org:11000/oozie',
'oozie.https.port' : '11444'
}
}
],
'result': '11444'
}),
Em.Object.create({
'protocol': 'http',
'port':{
'http_property':'oozie.base.url',
'http_default_port':'11000',
'https_property':'oozie.https.port',
'https_default_port':'11443',
'regex': '\\w*:(\\d+)',
'https_regex': '(\\d+)',
'site':'oozie-site'
},
'configProperties':
[
{
'type': 'oozie-site',
'properties':
{
'oozie.base.url': 'c6401.ambari.apache.org:11002/oozie',
'oozie.https.port' : '11444'
}
}
],
'result': '11002'
})
];
after(function () {
quickViewLinks.set('configProperties', []);
});
testData.forEach(function (item) {
it(item.service_id + ' ' + item.protocol, function () {
quickViewLinks.set('configProperties', item.configProperties || []);
expect(quickViewLinks.setPort(item.port, item.protocol, item.configProperties)).to.equal(item.result);
})
}, this);
});
describe("#getHosts()", function() {
beforeEach(function() {
sinon.stub(quickViewLinks, 'processOozieHosts').returns(['oozieHost']);
sinon.stub(quickViewLinks, 'processHdfsHosts').returns(['hdfsHost']);
sinon.stub(quickViewLinks, 'processHbaseHosts').returns(['hbaseHost']);
sinon.stub(quickViewLinks, 'processYarnHosts').returns(['yarnHost']);
sinon.stub(quickViewLinks, 'findHosts').returns(['host1']);
sinon.stub(App.QuickLinksConfig, 'find').returns([
Em.Object.create({
id: 'OOZIE',
links: [
{
component_name: 'OOZIE_SERVER'
}
]
}),
Em.Object.create({
id: 'HDFS',
links: [
{
component_name: 'NAMENODE'
}
]
}),
Em.Object.create({
id: 'HBASE',
links: [
{
component_name: 'HBASE_MASTER'
}
]
}),
Em.Object.create({
id: 'YARN',
links: [
{
component_name: 'RESOURCEMANAGER'
}
]
}),
Em.Object.create({
id: 'STORM',
links: [
{
component_name: 'STORM_UI_SERVER'
}
]
}),
Em.Object.create({
id: 'ACCUMULO',
links: [
{
component_name: 'ACCUMULO_MONITOR'
}
]
}),
Em.Object.create({
id: 'ATLAS',
links: [
{
component_name: 'ATLAS_SERVER'
}
]
}),
Em.Object.create({
id: 'MAPREDUCE2',
links: [
{
component_name: 'HISTORYSERVER'
}
]
}),
Em.Object.create({
id: 'AMBARI_METRICS',
links: [
{
component_name: 'METRICS_GRAFANA'
}
]
}),
Em.Object.create({
id: 'LOGSEARCH',
links: [
{
component_name: 'LOGSEARCH_SERVER'
}
]
}),
Em.Object.create({
id: 'HIVE',
links: [
{
component_name: 'METRICS_GRAFANA'
},
{
component_name: 'HIVE_SERVER_INTERACTIVE'
}
]
})
]);
});
afterEach(function() {
quickViewLinks.processOozieHosts.restore();
quickViewLinks.processHdfsHosts.restore();
quickViewLinks.processHbaseHosts.restore();
quickViewLinks.findHosts.restore();
quickViewLinks.processYarnHosts.restore();
App.QuickLinksConfig.find.restore();
});
var tests = [
{
serviceName: 'OOZIE',
callback: 'processOozieHosts',
result: ['oozieHost']
},
{
serviceName: 'HDFS',
callback: 'processHdfsHosts',
result: ['hdfsHost']
},
{
serviceName: 'HBASE',
callback: 'processHbaseHosts',
result: ['hbaseHost']
},
{
serviceName: 'YARN',
callback: 'processYarnHosts',
result: ['yarnHost']
},
{
serviceName: 'STORM'
},
{
serviceName: 'ACCUMULO'
},
{
serviceName: 'ATLAS'
},
{
serviceName: 'MAPREDUCE2'
},
{
serviceName: 'AMBARI_METRICS'
},
{
serviceName: 'LOGSEARCH'
},
{
serviceName: 'HIVE',
result: ['host1', 'host1']
}
];
tests.forEach(function (_test) {
var serviceName = _test.serviceName;
describe(serviceName, function () {
var componentNames;
beforeEach(function () {
componentNames = App.QuickLinksConfig.find().findProperty('id', serviceName).get('links').mapProperty('component_name');
this.result = quickViewLinks.getHosts({}, serviceName);
});
it('hosts', function () {
expect(this.result).to.be.eql(_test.result || ['host1']);
});
it('components', function () {
expect(quickViewLinks.findHosts.callCount).to.be.equal(componentNames.length);
});
if (_test.callback) {
it('callback is called once', function () {
expect(quickViewLinks[_test.callback].calledOnce).to.be.true;
});
}
});
});
it("custom service without master", function() {
expect(quickViewLinks.getHosts({}, 'S1')).to.be.empty;
});
});
describe('#reverseType', function () {
Em.A([
{
input: 'https',
output: 'http'
},
{
input: 'http',
output: 'https'
},
{
input: 'some',
output: ''
}
]).forEach(function (test) {
it(JSON.stringify(test.input) + ' -> ' + JSON.stringify(test.output), function () {
expect(quickViewLinks.reverseType(test.input)).to.be.equal(test.output)
});
});
});
describe('#meetDesired', function () {
var configProperties = [
{type: 't1', properties: {p1: 1234, p2: null, p3: 'CUSTOM'}}
];
it('no needed config property', function () {
expect(quickViewLinks.meetDesired([], '', '', '')).to.be.false;
});
it('desiredState is `NOT_EXIST` and currentPropertyValue is null', function () {
expect(quickViewLinks.meetDesired(configProperties, 't1', 'p2', 'NOT_EXIST')).to.be.true;
});
it('desiredState is `NOT_EXIST` and currentPropertyValue is not null', function () {
expect(quickViewLinks.meetDesired(configProperties, 't1', 'p1', 'NOT_EXIST')).to.be.false;
});
it('desiredState is `EXIST` and currentPropertyValue is null', function () {
expect(quickViewLinks.meetDesired(configProperties, 't1', 'p2', 'EXIST')).to.be.false;
});
it('desiredState is `EXIST` and currentPropertyValue is not null', function () {
expect(quickViewLinks.meetDesired(configProperties, 't1', 'p1', 'EXIST')).to.be.true;
});
it('desiredState is `CUSTOM` and currentPropertyValue is `CUSTOM`', function () {
expect(quickViewLinks.meetDesired(configProperties, 't1', 'p3', 'CUSTOM')).to.be.true;
});
it('desiredState is `CUSTOM` and currentPropertyValue is not `CUSTOM`', function () {
expect(quickViewLinks.meetDesired(configProperties, 't1', 'p2', 'CUSTOM')).to.be.false;
});
});
});