313 lines
11 KiB
JavaScript
313 lines
11 KiB
JavaScript
require('../test_utils.js')()
|
|
var cluster = require('../lib/cluster.js')
|
|
var stripAnsi = require('strip-ansi')
|
|
|
|
describe('Cluster Command Internals', function() {
|
|
|
|
it('detect added and removed objects', function() {
|
|
var a = [
|
|
{
|
|
'id': 'server1',
|
|
'type': 'servers',
|
|
'attributes': {
|
|
'parameters': {
|
|
'address': '127.0.0.1',
|
|
'port': 3000
|
|
}
|
|
}
|
|
}
|
|
]
|
|
|
|
var b = [
|
|
{
|
|
'id': 'server1',
|
|
'type': 'servers',
|
|
'attributes': {
|
|
'parameters': {
|
|
'address': '127.0.0.1',
|
|
'port': 3000
|
|
}
|
|
}
|
|
},
|
|
{
|
|
'id': 'server2',
|
|
'type': 'servers',
|
|
'attributes': {
|
|
'parameters': {
|
|
'address': '127.0.0.1',
|
|
'port': 3001
|
|
}
|
|
}
|
|
}
|
|
]
|
|
|
|
var c = [
|
|
{
|
|
'id': 'server1',
|
|
'type': 'servers',
|
|
'attributes': {
|
|
'parameters': {
|
|
'address': '127.0.0.1',
|
|
'port': 3000
|
|
}
|
|
}
|
|
},
|
|
{
|
|
'id': 'server3',
|
|
'type': 'servers',
|
|
'attributes': {
|
|
'parameters': {
|
|
'address': '127.0.0.1',
|
|
'port': 3002
|
|
}
|
|
}
|
|
}
|
|
]
|
|
cluster.getDifference(b, a)[0].id.should.equal('server2')
|
|
cluster.getDifference(c, a)[0].id.should.equal('server3')
|
|
cluster.getDifference(a, b).should.be.empty
|
|
cluster.getDifference(a, c).should.be.empty
|
|
cluster.getDifference(b, c)[0].id.should.equal('server2')
|
|
cluster.getDifference(c, b)[0].id.should.equal('server3')
|
|
cluster.getDifference(a, a).should.be.empty
|
|
cluster.getDifference(b, b).should.be.empty
|
|
cluster.getDifference(c, c).should.be.empty
|
|
})
|
|
|
|
it('detect changes in objects', function() {
|
|
var a = [
|
|
{
|
|
'id': 'server1',
|
|
'type': 'servers',
|
|
'attributes': {
|
|
'parameters': {
|
|
'address': '127.0.0.1',
|
|
'port': 3000
|
|
}
|
|
}
|
|
}
|
|
]
|
|
|
|
var b = [
|
|
{
|
|
'id': 'server1',
|
|
'type': 'servers',
|
|
'attributes': {
|
|
'parameters': {
|
|
'address': '127.0.0.1',
|
|
'port': 3001
|
|
}
|
|
}
|
|
}
|
|
]
|
|
|
|
cluster.getDifference(a, b).should.be.empty
|
|
cluster.getDifference(b, a).should.be.empty
|
|
cluster.getDifference(a, a).should.be.empty
|
|
cluster.getDifference(b, b).should.be.empty
|
|
var obj = cluster.getChangedObjects(a, b)[0]
|
|
obj.id.should.equal('server1')
|
|
obj.attributes.parameters.port.should.equal(3000)
|
|
})
|
|
|
|
it('detect extra services', function() {
|
|
var a = {
|
|
'services': {
|
|
data: [
|
|
{
|
|
'id': 'CLI',
|
|
'type': 'services',
|
|
'attributes': {
|
|
'parameters': {}
|
|
},
|
|
'relationships': {},
|
|
}
|
|
]
|
|
}
|
|
}
|
|
|
|
var b = {
|
|
'services': {
|
|
data: [
|
|
a.services.data[0],
|
|
{
|
|
'id': 'CLI2',
|
|
'type': 'services',
|
|
'attributes': {
|
|
'parameters': {
|
|
|
|
},
|
|
},
|
|
'relationships': {},
|
|
}
|
|
]
|
|
}
|
|
}
|
|
|
|
cluster.haveExtraServices(a, b, 'test1', 'test2').should.be.rejected
|
|
cluster.haveExtraServices(b, a, 'test2', 'test1').should.be.rejected
|
|
expect(cluster.haveExtraServices(a, a, 'test1', 'test2')).to.equal(undefined)
|
|
expect(cluster.haveExtraServices(b, b, 'test1', 'test2')).to.equal(undefined)
|
|
})
|
|
|
|
});
|
|
|
|
|
|
describe('Cluster Sync', function() {
|
|
before(startDoubleMaxScale)
|
|
|
|
it('sync global options', function() {
|
|
return doCommand('alter maxscale auth_connect_timeout 1234 --hosts ' + secondary_host)
|
|
.then(() => verifyCommand('cluster sync ' + secondary_host + ' --hosts ' + primary_host,
|
|
'maxscale'))
|
|
.then(function(res) {
|
|
res.data.attributes.parameters.auth_connect_timeout.should.equal(1234)
|
|
})
|
|
})
|
|
|
|
it('sync after server creation', function() {
|
|
return doCommand('create server server5 127.0.0.1 3003 --hosts ' + secondary_host)
|
|
.then(() => verifyCommand('cluster sync ' + secondary_host + ' --hosts ' + primary_host,
|
|
'servers/server5'))
|
|
})
|
|
|
|
it('sync after server alteration', function() {
|
|
return doCommand('alter server server2 port 3000 --hosts ' + secondary_host)
|
|
.then(() => verifyCommand('cluster sync ' + secondary_host + ' --hosts ' + primary_host,
|
|
'servers/server2'))
|
|
.then(function(res) {
|
|
res.data.attributes.parameters.port.should.equal(3000)
|
|
})
|
|
})
|
|
|
|
it('sync after server deletion', function() {
|
|
return doCommand('destroy server server5 --hosts ' + secondary_host)
|
|
.then(() => verifyCommand('cluster sync ' + secondary_host + ' --hosts ' + primary_host,
|
|
'servers/server5'))
|
|
.should.be.rejected
|
|
})
|
|
|
|
it('sync after monitor creation', function() {
|
|
return doCommand('create monitor my-monitor-2 mysqlmon user=maxuser password=maxpwd --hosts ' + secondary_host)
|
|
.then(() => verifyCommand('cluster sync ' + secondary_host + ' --hosts ' + primary_host,
|
|
'monitors/my-monitor-2'))
|
|
})
|
|
|
|
it('sync after monitor alteration', function() {
|
|
return doCommand('alter monitor MariaDB-Monitor monitor_interval 12345 --hosts ' + secondary_host)
|
|
.then(() => verifyCommand('cluster sync ' + secondary_host + ' --hosts ' + primary_host,
|
|
'monitors/MariaDB-Monitor'))
|
|
.then(function(res) {
|
|
res.data.attributes.parameters.monitor_interval.should.equal(12345)
|
|
})
|
|
})
|
|
|
|
it('sync after monitor deletion', function() {
|
|
return doCommand('destroy monitor my-monitor-2 --hosts ' + secondary_host)
|
|
.then(() => doCommand('show monitor my-monitor-2 --hosts ' + primary_host))
|
|
.then(() => doCommand('show monitor my-monitor-2 --hosts ' + secondary_host).should.be.rejected)
|
|
.then(() => doCommand('cluster sync ' + secondary_host + ' --hosts ' + primary_host))
|
|
.then(() => doCommand('show monitor my-monitor-2 --hosts ' + primary_host).should.be.rejected)
|
|
.then(() => doCommand('show monitor my-monitor-2 --hosts ' + secondary_host).should.be.rejected)
|
|
})
|
|
|
|
it('sync after service alteration', function() {
|
|
return doCommand('alter service RW-Split-Router enable_root_user true --hosts ' + secondary_host)
|
|
.then(() => verifyCommand('cluster sync ' + secondary_host + ' --hosts ' + primary_host,
|
|
'services/RW-Split-Router'))
|
|
.then(function(res) {
|
|
res.data.attributes.parameters.enable_root_user.should.be.true
|
|
})
|
|
})
|
|
|
|
// As the listeners cannot be truly deleted, since there's no code for actually closing a socket at runtime,
|
|
// we do the listener tests last
|
|
it('sync listener creation/deletion', function() {
|
|
return doCommand('create listener RW-Split-Router my-listener-2 5999 --hosts ' + secondary_host)
|
|
.then(() => doCommand('cluster sync ' + secondary_host + ' --hosts ' + primary_host))
|
|
.then(() => doCommand('destroy listener RW-Split-Router my-listener-2'))
|
|
.then(() => doCommand('cluster sync ' + secondary_host + ' --hosts ' + primary_host))
|
|
})
|
|
|
|
after(stopDoubleMaxScale)
|
|
})
|
|
|
|
function isJSON(line) {
|
|
return line.match(/['',\[\]{}:]/)
|
|
}
|
|
|
|
function getOperation(line) {
|
|
var op = null
|
|
line = line.trim()
|
|
|
|
if (line.match(/Deleted:/)) {
|
|
op = 'removed'
|
|
} else if (line.match(/New:/)){
|
|
op = 'added'
|
|
} else if (line.match(/Changed:/)) {
|
|
op = 'changed'
|
|
}
|
|
|
|
return op
|
|
}
|
|
|
|
// Convert a string format diff into a JSON object
|
|
function parseDiff(str) {
|
|
var lines = stripAnsi(str).split(require('os').EOL)
|
|
var rval = {}
|
|
|
|
while (lines.length > 0) {
|
|
// Operation is first line, object type second
|
|
var op = getOperation(lines.shift())
|
|
var type = lines.shift()
|
|
var obj = ''
|
|
|
|
while (lines.length > 0 && isJSON(lines[0]) && getOperation(lines[0]) == null) {
|
|
obj += lines.shift().trim()
|
|
}
|
|
|
|
_.set(rval, op + '.' + type, JSON.parse(obj))
|
|
}
|
|
|
|
return rval
|
|
}
|
|
|
|
describe('Cluster Diff', function() {
|
|
before(startDoubleMaxScale)
|
|
|
|
it('diff after server creation', function() {
|
|
return doCommand('create server server5 127.0.0.1 3003 --hosts ' + secondary_host)
|
|
.then(() => doCommand('cluster diff ' + secondary_host + ' --hosts ' + primary_host))
|
|
.then(function(res) {
|
|
var d = parseDiff(res)
|
|
d.removed.servers.length.should.equal(1)
|
|
d.removed.servers[0].id.should.equal('server5')
|
|
})
|
|
.then(() => doCommand('cluster sync ' + secondary_host + ' --hosts ' + primary_host))
|
|
})
|
|
|
|
it('diff after server alteration', function() {
|
|
return doCommand('alter server server2 port 3000 --hosts ' + secondary_host)
|
|
.then(() => doCommand('cluster diff ' + secondary_host + ' --hosts ' + primary_host))
|
|
.then(function(res) {
|
|
var d = parseDiff(res)
|
|
d.changed.servers.length.should.equal(1)
|
|
d.changed.servers[0].id.should.equal('server2')
|
|
})
|
|
.then(() => doCommand('cluster sync ' + secondary_host + ' --hosts ' + primary_host))
|
|
})
|
|
|
|
it('diff after server deletion', function() {
|
|
return doCommand('destroy server server5 --hosts ' + secondary_host)
|
|
.then(() => doCommand('cluster diff ' + secondary_host + ' --hosts ' + primary_host))
|
|
.then(function(res) {
|
|
var d = parseDiff(res)
|
|
d.added.servers.length.should.equal(1)
|
|
d.added.servers[0].id.should.equal('server5')
|
|
})
|
|
.then(() => doCommand('cluster sync ' + secondary_host + ' --hosts ' + primary_host))
|
|
})
|
|
|
|
after(stopDoubleMaxScale)
|
|
})
|