blob: 6ec5d83f64c10faaa1586221a2745e76b4533402 [file] [log] [blame]
import assert from 'assert';
import Lab from 'lab';
export const lab = Lab.script();
import * as cluster from '../src/cluster.js';
import nmo from '../src/nmo.js';
import * as common from './common.js';
import fs from 'fs';
const data = `[clusterone]
node0=127.0.0.1
node1=192.168.0.1
[onenodecluster]
node1=iamalonelylnode
[clustervalidurlsbothdown]
node0=http:\/\/neverexists.neverexists
node1=http:\/\/neverexists2.neverexists
[clustervalidurlsonedown]
node1=http:\/\/neverexists2.neverexists
node2=${common.NODE}
[clustervalidurls]
node1=${common.NODE}
node2=${common.NODE_TWO}
[clustervalidurlswithpw]
node1=${common.NODE_WITH_PW}
node2=${common.NODE_TWO_WITH_PW}
[clustervalidurlsclosingsocket]
node1=${common.NODE}
node2=${common.NODE_TWO + '/socketclose'}
[clustervalidurlsclosingsocketaftercheck]
node1=${common.NODE}
node2=${common.NODE_TWO + '/socket_close_on_second_request'}
`;
const nmoconf = {nmoconf: __dirname + '/fixtures/randomini'};
const oldConsole = console.log;
lab.experiment('cluster - get', () => {
fs.writeFileSync(__dirname + '/fixtures/randomini', data, 'utf-8');
lab.test('errors on nmoconf', (done) => {
nmo.load(nmoconf).then(() => {
cluster
.get('nmoconfig')
.catch((err) => {
assert.ok(/valid/.test(err.message));
done();
});
});
});
lab.test('returns the clustername', (done) => {
nmo.load(nmoconf).then(() => {
cluster
.get('clusterone', 'node0')
.then((res) => {
assert.equal(res, '127.0.0.1');
done();
});
});
});
});
lab.experiment('cluster - add', () => {
fs.writeFileSync(__dirname + '/fixtures/randomini', data, 'utf-8');
lab.test('errors on empty args', (done) => {
nmo.load(nmoconf).then(() => {
cluster
.add()
.catch((err) => {
assert.ok(/provide/.test(err.message));
done();
});
});
});
lab.test('errors on nmoconf', (done) => {
nmo.load(nmoconf).then(() => {
cluster
.add('foo', 'bar', 'nmoconfig')
.catch((err) => {
assert.ok(/valid/.test(err.message));
done();
});
});
});
lab.test('adds cluster', (done) => {
nmo.load(nmoconf).then(() => {
cluster
.add('rockbert', 'artischockbert', 'foocluster')
.then((res) => {
cluster
.get('foocluster')
.then((res) => {
assert.deepEqual(res, {rockbert: 'artischockbert'});
done();
});
});
});
});
});
lab.experiment('cluster - join', () => {
let servers;
lab.beforeEach((done) => {
fs.writeFileSync(__dirname + '/fixtures/randomini', data, 'utf-8');
common.createTestServers().done((s) => {
servers = s;
done();
});
});
lab.afterEach((done) => {
common.stopTestServers(servers).then((res) => {
done();
});
});
lab.test('errors on empty args', (done) => {
nmo.load(nmoconf).then(() => {
cluster
.join()
.catch((err) => {
assert.ok(/Usage/.test(err.message));
done();
});
});
});
lab.test('errors on nmoconf', (done) => {
nmo.load(nmoconf).then(() => {
cluster
.join('nmoconfig')
.catch((err) => {
assert.ok(/valid/.test(err.message));
done();
});
});
});
lab.test('errors on a cluster with no nodes', (done) => {
nmo.load(nmoconf).then(() => {
cluster
.join('doesnotexist')
.catch((err) => {
assert.ok(/any nodes/.test(err.message));
done();
});
});
});
lab.test('errors on cluster with 1 node', (done) => {
nmo.load(nmoconf).then(() => {
cluster
.join('onenodecluster')
.catch((err) => {
assert.ok(/enough nodes/.test(err.message));
done();
});
});
});
lab.test('warns on offline node', (done) => {
nmo.load(nmoconf).then(() => {
cluster
.join('clustervalidurlsbothdown')
.catch((err) => {
assert.ok(/nodes are/.test(err.message));
done();
});
});
});
lab.test('warns on offline nodes', (done) => {
nmo.load(nmoconf).then(() => {
cluster
.join('clustervalidurlsonedown')
.catch((err) => {
assert.ok(/node is/.test(err.message));
done();
});
});
});
lab.test('succeeds at online nodes with pw', (done) => {
nmo.load(nmoconf).then(() => {
cluster
.join('clustervalidurlswithpw')
.then((res) => {
assert.deepEqual(res, { ok: true });
done();
});
});
});
lab.test('succeeds at online nodes', (done) => {
nmo.load(nmoconf).then(() => {
cluster
.join('clustervalidurls')
.then((res) => {
assert.deepEqual(res, { ok: true });
done();
});
});
});
lab.test('succeeds with offline nodes, but --force given', (done) => {
nmo.load({nmoconf: __dirname + '/fixtures/randomini', force: true}).then(() => {
cluster
.join('clustervalidurlsonedown')
.then((res) => {
assert.deepEqual(res, { ok: true });
done();
});
});
});
lab.test('rejects on connection errors', (done) => {
nmo.load(nmoconf).then(() => {
cluster
.join('clustervalidurlsclosingsocket')
.catch((err) => {
assert.ok(err instanceof Error);
done();
});
});
});
lab.test('rejects on connection errors during join', (done) => {
nmo.load(nmoconf).then(() => {
cluster
.join('clustervalidurlsclosingsocketaftercheck')
.catch((err) => {
assert.ok(err instanceof Error);
done();
});
});
});
});
lab.experiment('cluster - cli', () => {
let servers;
lab.beforeEach((done) => {
fs.writeFileSync(__dirname + '/fixtures/randomini', data, 'utf-8');
common.createTestServers().done((s) => {
servers = s;
done();
});
});
lab.afterEach((done) => {
console.log = oldConsole;
common.stopTestServers(servers).then((res) => {
done();
});
});
lab.test('adds cluster', (done) => {
nmo.load(nmoconf).then(() => {
cluster
.cli('add', 'rockbert', 'artischockbert', 'foocluster2')
.then((res) => {
cluster
.get('foocluster2')
.then((res) => {
assert.deepEqual(res, {rockbert: 'artischockbert'});
done();
});
});
});
});
lab.test('gets cluster', (done) => {
console.log = (...args) => {
assert.equal('rockbert=artischockbert\n', args[0]);
done();
};
nmo.load(nmoconf).then(() => {
cluster
.cli('add', 'rockbert', 'artischockbert', 'foocluster3')
.then((res) => {
cluster
.cli('get', 'foocluster3');
});
});
});
lab.test('joins cluster', (done) => {
console.log = (...args) => {
assert.equal('cluster joined', args[0]);
done()
};
nmo.load(nmoconf).then(() => {
cluster
.cli('join', 'clustervalidurls');
});
});
lab.test('returns error on wrong usage', (done) => {
nmo.load(nmoconf).then(() => {
cluster
.cli('lalala')
})
.catch((err) => {
assert.ok(err instanceof Error);
done();
});
});
});