monasca-kibana-plugin/server/__tests__/healthcheck.spec.js
Tomasz Trębski 9463c20a9c Adjusting to uwsgi deployed keystone
Commit moves away from using url and port separetely
for keystone configuration. Instead a singular auth_uri
can be specified. It still supports setting up
port explicitly, however if none is provided, a default
port 80 is assumed.

Story: 2000995
Task: 4174

Needed-By: Ia95b3bef2734d639c6fec57484b60bc5377d659f
Change-Id: I22686d05670fc6c947611f8044dea498239a4212
2017-04-28 07:58:57 +00:00

264 lines
8.0 KiB
JavaScript

/*
* Copyright 2016-2017 FUJITSU LIMITED
*
* Licensed 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.
*/
const sinon = require('sinon');
const chai = require('chai');
const proxyRequire = require('proxyquire');
describe('plugins/monasca-kibana-plugin', ()=> {
describe('healthcheck', ()=> {
const keystoneUrl = 'http://localhost'; // mocking http
const keystonePort = 9000;
const keystoneUri = `${keystoneUrl}:${keystonePort}`;
let healthcheck; // placeholder for the require healthcheck
let plugin;
let configGet;
let configHas;
let server;
let clock;
before(function () {
clock = sinon.useFakeTimers();
});
after(function () {
clock.restore();
});
beforeEach(function () {
plugin = {
name : 'monasca-kibana-plugin',
status: {
red : sinon.stub(),
green : sinon.stub(),
yellow: sinon.stub()
}
};
configGet = sinon.stub();
configGet.withArgs('monasca-kibana-plugin.url').returns(keystoneUrl);
configGet.withArgs('monasca-kibana-plugin.port').returns(keystonePort);
configGet.withArgs('monasca-kibana-plugin.auth_uri').returns(keystoneUri);
configHas = sinon.stub();
server = {
log : sinon.stub(),
on : sinon.stub(),
config: function () {
return {
get: configGet,
has: configHas
};
}
};
});
for (let mode = 0; mode < 2; mode++) {
let modeLabel;
switch (mode) {
case 0:
modeLabel = 'url:port';
break;
default:
modeLabel = 'auth_uri';
}
it(`should set status to green if keystone available [${modeLabel}]`, (done)=> { // eslint-disable-line no-loop-func
configHas.withArgs('monasca-kibana-plugin.url').returns(mode === 0);
configHas.withArgs('monasca-kibana-plugin.port').returns(mode === 0);
configHas.withArgs('monasca-kibana-plugin.auth_uri').returns(mode === 1);
let expectedCode = 200;
let expectedStatus = true;
let healthcheck = proxyRequire('../healthcheck', {
'http': {
request: (_, callback)=> {
return {
end: () => {
let res = {
statusCode: expectedCode
};
callback(res);
},
on : sinon.stub()
};
}
}
});
let check = healthcheck(plugin, server);
check
.run()
.then((status) => {
chai.expect(expectedStatus).to.be.equal(status);
chai.expect(plugin.status.green.calledWith('Ready')).to.be.ok;
})
.finally(done);
});
it(`should set status to red if keystone not available [${modeLabel}]`, (done) => { // eslint-disable-line no-loop-func
configHas.withArgs('monasca-kibana-plugin.url').returns(mode === 0);
configHas.withArgs('monasca-kibana-plugin.port').returns(mode === 0);
configHas.withArgs('monasca-kibana-plugin.auth_uri').returns(mode === 1);
let expectedCode = 500;
let expectedStatus = false;
let healthcheck = proxyRequire('../healthcheck', {
'http': {
request: (_, callback)=> {
return {
end: () => {
let res = {
statusCode: expectedCode
};
callback(res);
},
on : sinon.stub()
};
}
}
});
let check = healthcheck(plugin, server);
check
.run()
.catch((status) => {
chai.expect(expectedStatus).to.be.equal(status);
chai.expect(plugin.status.red.calledWith('Unavailable')).to.be.ok;
})
.finally(done);
});
it(`should set status to red if available but cannot communicate [${modeLabel}]`, (done)=> { // eslint-disable-line no-loop-func
configHas.withArgs('monasca-kibana-plugin.url').returns(mode === 0);
configHas.withArgs('monasca-kibana-plugin.port').returns(mode === 0);
configHas.withArgs('monasca-kibana-plugin.auth_uri').returns(mode === 1);
let errorListener;
let healthcheck = proxyRequire('../healthcheck', {
'http': {
request: ()=> {
return {
on : (_, listener)=> {
errorListener = sinon.spy(listener);
},
end: ()=> {
errorListener(new Error('test'));
}
};
}
}
});
let check = healthcheck(plugin, server);
check
.run()
.catch((error)=> {
let msg = 'Unavailable: Failed to communicate with Keystone';
chai.expect(errorListener).to.be.ok;
chai.expect(errorListener.calledOnce).to.be.ok;
chai.expect(plugin.status.red.calledWith(msg)).to.be.ok;
chai.expect(error.message).to.be.equal('test');
})
.done(done);
});
it(`should run check in period '10000' [${modeLabel}]`, ()=> { // eslint-disable-line no-loop-func
configHas.withArgs('monasca-kibana-plugin.url').returns(mode === 0);
configHas.withArgs('monasca-kibana-plugin.port').returns(mode === 0);
configHas.withArgs('monasca-kibana-plugin.auth_uri').returns(mode === 1);
let healthcheck = proxyRequire('../healthcheck', {
'http': {
request: sinon.stub().returns({
end: sinon.stub(),
on : sinon.stub()
})
}
});
let runChecks = 3;
let timeout = 10000;
let check = healthcheck(plugin, server);
sinon.spy(check, 'run');
// first call
chai.expect(check.isRunning()).to.be.eq(false);
check.start();
validateFirstCall();
// next calls
for (let it = 0; it < runChecks; it++) {
validateNextCallWithTick(it);
}
function validateFirstCall() {
clock.tick(1); // first call is immediate
chai.expect(check.run.calledOnce).to.be.ok;
chai.expect(check.isRunning()).to.be.eq(true);
}
function validateNextCallWithTick(it) {
// should be called once for the sake of first call
chai.assert.equal(check.run.callCount, it + 1);
// run check again
check.start();
// assert that tick did not kick in
chai.assert.equal(check.run.callCount, it + 1);
// kick it in
clock.tick(timeout);
// and we have another call
chai.expect(check.run.callCount).to.be.eq(it + 2);
}
});
it(`should return false from stop if not run before [${modeLabel}]`, ()=> { // eslint-disable-line no-loop-func
configHas.withArgs('monasca-kibana-plugin.url').returns(mode === 0);
configHas.withArgs('monasca-kibana-plugin.port').returns(mode === 0);
configHas.withArgs('monasca-kibana-plugin.auth_uri').returns(mode === 1);
let healthcheck = proxyRequire('../healthcheck', {
'http': {
request: sinon.stub().returns({
end: sinon.stub(),
on : sinon.stub()
})
}
});
let check = healthcheck(plugin, server);
sinon.spy(check, 'run');
chai.expect(check.stop()).to.be.eq(false);
chai.expect(check.run.called).to.be.eq(false);
});
}
});
});