Consistent roles handling

This commit is contained in:
delvedor
2019-01-21 16:49:08 +01:00
parent f12424272f
commit 88c9fa8546
3 changed files with 18 additions and 15 deletions

3
lib/Connection.d.ts vendored
View File

@ -34,8 +34,7 @@ export default class Connection {
MASTER: string;
DATA: string;
INGEST: string;
COORDINATING: string;
MACHINE_LEARNING: string;
ML: string;
};
url: URL;
ssl: SecureContextOptions | null;

View File

@ -19,7 +19,7 @@ class Connection {
this._openRequests = 0
this._status = opts.status || Connection.statuses.ALIVE
this.roles = opts.roles || defaultRoles
this.roles = Object.assign({}, defaultRoles, opts.roles) || Object.assign({}, defaultRoles)
if (!['http:', 'https:'].includes(this.url.protocol)) {
throw new ConfigurationError(`Invalid protocol: '${this.url.protocol}'`)
@ -199,16 +199,14 @@ Connection.roles = {
MASTER: 'master',
DATA: 'data',
INGEST: 'ingest',
COORDINATING: 'coordinating',
MACHINE_LEARNING: 'machine_learning'
ML: 'ml'
}
const defaultRoles = {
[Connection.roles.MASTER]: true,
[Connection.roles.DATA]: true,
[Connection.roles.INGEST]: true,
[Connection.roles.COORDINATING]: true,
[Connection.roles.MACHINE_LEARNING]: true
[Connection.roles.ML]: false
}
const validStatuses = Object.keys(Connection.statuses)

View File

@ -314,7 +314,6 @@ class ConnectionPool {
/**
* Transforms the nodes objects to a host object.
* TODO: handle ssl and agent options
*
* @param {object} nodes
* @returns {array} hosts
@ -331,13 +330,20 @@ class ConnectionPool {
address = address.slice(0, 4) === 'http'
? address
: 'http://' + address
const roles = node.roles.reduce((acc, role) => {
acc[role] = true
return acc
}, {})
hosts.push({
url: new URL(address),
id: ids[i],
roles: node.roles.reduce((acc, role) => {
acc[role] = true
return acc
}, {})
roles: Object.assign({
[Connection.roles.MASTER]: true,
[Connection.roles.DATA]: true,
[Connection.roles.INGEST]: true,
[Connection.roles.ML]: false
}, roles)
})
}
@ -371,9 +377,9 @@ ConnectionPool.resurrectStrategies = {
function defaultNodeFilter (node) {
// avoid master only nodes
if (!!node.roles.master === true &&
!!node.roles.data === false &&
!!node.roles.ingest === false) {
if (node.roles.master === true &&
node.roles.data === false &&
node.roles.ingest === false) {
return false
}
return true