Co-authored-by: Josh Mock <joshua.mock@elastic.co>
This commit is contained in:
committed by
GitHub
parent
846c50b8bf
commit
a31920b785
@ -171,7 +171,18 @@ a|`function` - Takes a `Connection` and returns `true` if it can be sent a reque
|
|||||||
_Default:_
|
_Default:_
|
||||||
[source,js]
|
[source,js]
|
||||||
----
|
----
|
||||||
() => true
|
function defaultNodeFilter (conn) {
|
||||||
|
if (conn.roles != null) {
|
||||||
|
if (
|
||||||
|
// avoid master-only nodes
|
||||||
|
conn.roles.master &&
|
||||||
|
!conn.roles.data &&
|
||||||
|
!conn.roles.ingest &&
|
||||||
|
!conn.roles.ml
|
||||||
|
) return false
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
----
|
----
|
||||||
|
|
||||||
|`nodeSelector`
|
|`nodeSelector`
|
||||||
|
|||||||
@ -78,6 +78,13 @@ export interface NodeOptions {
|
|||||||
ssl?: TlsConnectionOptions
|
ssl?: TlsConnectionOptions
|
||||||
/** @property headers Custom HTTP headers that should be sent with each request */
|
/** @property headers Custom HTTP headers that should be sent with each request */
|
||||||
headers?: Record<string, any>
|
headers?: Record<string, any>
|
||||||
|
/** @property roles Common Elasticsearch roles that can be assigned to this node. Can be helpful when writing custom nodeFilter or nodeSelector functions. */
|
||||||
|
roles?: {
|
||||||
|
master: boolean
|
||||||
|
data: boolean
|
||||||
|
ingest: boolean
|
||||||
|
ml: boolean
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface ClientOptions {
|
export interface ClientOptions {
|
||||||
@ -135,7 +142,7 @@ export interface ClientOptions {
|
|||||||
* @defaultValue null */
|
* @defaultValue null */
|
||||||
agent?: HttpAgentOptions | UndiciAgentOptions | agentFn | false
|
agent?: HttpAgentOptions | UndiciAgentOptions | agentFn | false
|
||||||
/** @property nodeFilter A custom function used by the connection pool to determine which nodes are qualified to receive a request
|
/** @property nodeFilter A custom function used by the connection pool to determine which nodes are qualified to receive a request
|
||||||
* @defaultValue () => true */
|
* @defaultValue A function that uses the Connection `roles` property to avoid master-only nodes */
|
||||||
nodeFilter?: nodeFilterFn
|
nodeFilter?: nodeFilterFn
|
||||||
/** @property nodeSelector A custom function used by the connection pool to determine which node should receive the next request
|
/** @property nodeSelector A custom function used by the connection pool to determine which node should receive the next request
|
||||||
* @defaultValue A "round robin" function that loops sequentially through each node in the pool. */
|
* @defaultValue A "round robin" function that loops sequentially through each node in the pool. */
|
||||||
|
|||||||
@ -77,6 +77,31 @@ test('Missing node(s)', t => {
|
|||||||
t.end()
|
t.end()
|
||||||
})
|
})
|
||||||
|
|
||||||
|
test('multi nodes with roles, using default node filter', async t => {
|
||||||
|
const client = new Client({
|
||||||
|
nodes: [
|
||||||
|
{
|
||||||
|
url: new URL('http://node1:9200'),
|
||||||
|
roles: { master: true, data: false, ingest: false, ml: false }
|
||||||
|
},
|
||||||
|
{
|
||||||
|
url: new URL('http://node2:9200'),
|
||||||
|
roles: { master: true, data: true, ingest: false, ml: false }
|
||||||
|
},
|
||||||
|
]
|
||||||
|
})
|
||||||
|
const conn = client.connectionPool.getConnection({
|
||||||
|
now: Date.now() + 1000 * 60 * 3,
|
||||||
|
requestId: 1,
|
||||||
|
name: 'elasticsearch-js',
|
||||||
|
context: null
|
||||||
|
})
|
||||||
|
|
||||||
|
t.equal(conn?.url.hostname, 'node2')
|
||||||
|
|
||||||
|
t.end()
|
||||||
|
})
|
||||||
|
|
||||||
test('Custom headers', t => {
|
test('Custom headers', t => {
|
||||||
const client = new Client({
|
const client = new Client({
|
||||||
node: 'http://localhost:9200',
|
node: 'http://localhost:9200',
|
||||||
|
|||||||
Reference in New Issue
Block a user