Skip to content

Commit 917f95b

Browse files
author
spacedragon
committed
[Code] setup multi-code mode by config
1 parent a17a9e9 commit 917f95b

File tree

10 files changed

+47
-183
lines changed

10 files changed

+47
-183
lines changed

x-pack/package.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,6 @@
9191
"@types/tar-fs": "^1.16.1",
9292
"@types/tinycolor2": "^1.4.1",
9393
"@types/uuid": "^3.4.4",
94-
"@types/wreck": "^14.0.0",
9594
"abab": "^1.0.4",
9695
"ansi-colors": "^3.0.5",
9796
"ansicolors": "0.3.2",

x-pack/plugins/code/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ export const code = (kibana: any) =>
6868
maxWorkspace: Joi.number().default(5), // max workspace folder for each language server
6969
disableIndexScheduler: Joi.boolean().default(true), // Temp option to disable index scheduler.
7070
enableGlobalReference: Joi.boolean().default(false), // Global reference as optional feature for now
71-
codeNode: Joi.boolean().default(false),
71+
codeNodeUrl: Joi.string(),
7272
}).default();
7373
},
7474
init,

x-pack/plugins/code/public/components/main/content.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -182,10 +182,11 @@ class CodeContent extends React.PureComponent<Props> {
182182
}
183183
const currentTree = this.props.currentTree;
184184
if (
185+
this.props.file &&
185186
currentTree &&
186187
(currentTree.type === FileTreeItemType.File || currentTree.type === FileTreeItemType.Link)
187188
) {
188-
const { isUnsupported, isOversize, isImage, lang } = this.props.file!;
189+
const { isUnsupported, isOversize, isImage, lang } = this.props.file;
189190
const isMarkdown = lang === LANG_MD;
190191
const isText = !isUnsupported && !isOversize && !isImage;
191192

x-pack/plugins/code/server/__tests__/multi_node.ts

Lines changed: 18 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -7,19 +7,26 @@
77
import getPort from 'get-port';
88
import { resolve } from 'path';
99
import { Root } from 'src/core/server/root';
10-
import { createRootWithCorePlugins, request, startTestServers } from 'src/test_utils/kbn_server';
10+
import {
11+
createRootWithCorePlugins,
12+
request,
13+
startTestServers,
14+
} from '../../../../../src/test_utils/kbn_server';
1115

1216
describe('code in multiple nodes', () => {
1317
const codeNodeUuid = 'c4add484-0cba-4e05-86fe-4baa112d9e53';
14-
let port: number;
18+
const nonodeNodeUuid = '22b75e04-0e50-4647-9643-6b1b1d88beaf';
19+
let codePort: number;
20+
let nonCodePort: number;
1521
let codeNode: Root;
1622
let nonCodeNode: Root;
1723

1824
let servers: any;
19-
const pluginPaths = resolve(__dirname, '../../../../../node_modules/x-pack');
25+
const pluginPaths = resolve(__dirname, '../../../../../x-pack');
2026

2127
async function startServers() {
22-
port = await getPort();
28+
codePort = await getPort();
29+
nonCodePort = await getPort();
2330
servers = await startTestServers({
2431
adjustTimeout: t => {
2532
// @ts-ignore
@@ -29,16 +36,13 @@ describe('code in multiple nodes', () => {
2936
kbn: {
3037
server: {
3138
uuid: codeNodeUuid,
32-
port,
39+
port: codePort,
3340
},
3441
plugins: { paths: [pluginPaths] },
3542
xpack: {
3643
upgrade_assistant: {
3744
enabled: false,
3845
},
39-
code: {
40-
codeNode: true,
41-
},
4246
security: {
4347
enabled: false,
4448
},
@@ -52,12 +56,16 @@ describe('code in multiple nodes', () => {
5256

5357
async function startNonCodeNodeKibana() {
5458
const setting = {
59+
server: {
60+
port: nonCodePort,
61+
uuid: nonodeNodeUuid,
62+
},
5563
plugins: { paths: [pluginPaths] },
5664
xpack: {
5765
upgrade_assistant: {
5866
enabled: false,
5967
},
60-
code: { codeNode: false },
68+
code: { codeNodeUrl: `http://localhost:${codePort}` },
6169
security: {
6270
enabled: false,
6371
},
@@ -93,22 +101,11 @@ describe('code in multiple nodes', () => {
93101

94102
it('Non-code node setup should fail if code node is shutdown', async () => {
95103
await codeNode.shutdown();
104+
await delay(2000);
96105
await request.get(nonCodeNode, '/api/code/setup').expect(502);
97106
await codeNode.setup();
98107
await delay(2000);
99108
await request.get(nonCodeNode, '/api/code/setup').expect(200);
100109
// @ts-ignore
101110
}).timeout(20000);
102-
103-
it('cluster uuid should equals Code node uuid', async () => {
104-
const url = `http://localhost:${port}`;
105-
await request.get(codeNode, '/api/code/cluster').expect(200, {
106-
uuid: codeNodeUuid,
107-
url,
108-
});
109-
await request.get(nonCodeNode, '/api/code/cluster').expect(200, {
110-
uuid: codeNodeUuid,
111-
url,
112-
});
113-
});
114111
});

x-pack/plugins/code/server/code_node_client.ts

Lines changed: 0 additions & 79 deletions
This file was deleted.

x-pack/plugins/code/server/init.ts

Lines changed: 24 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55
*/
66

77
import { Server } from 'hapi';
8+
import fetch from 'node-fetch';
89
import { checkRepos } from './check_repos';
9-
import { clientWithInternalUser, CodeNodeInfo } from './code_node_client';
1010
import { LspIndexerFactory, RepositoryIndexInitializerFactory, tryMigrateIndices } from './indexer';
1111
import { EsClient, Esqueue } from './lib/esqueue';
1212
import { Logger } from './log';
@@ -64,71 +64,51 @@ function getServerUuid(server: Server): Promise<string> {
6464
return Promise.resolve(uid);
6565
}
6666

67+
async function getCodeNodeUuid(url: string, log: Logger) {
68+
const res = await fetch(`${url}/api/stats`, {});
69+
if (res.ok) {
70+
return (await res.json()).kibana.uuid;
71+
}
72+
73+
log.info(`Access code node ${url} failed, try again later.`);
74+
return null;
75+
}
76+
6777
export function init(server: Server, options: any) {
6878
const log = new Logger(server);
6979
const serverOptions = new ServerOptions(options, server.config());
7080
// @ts-ignore
7181
const kbnServer = this.kbnServer;
7282
kbnServer.ready().then(async () => {
7383
const serverUuid = await retryUntilAvailable(() => getServerUuid(server), 50);
74-
const codeNodeClient = await clientWithInternalUser(server);
7584
// enable security check in routes
7685
enableSecurity(server);
77-
if (serverOptions.codeNode) {
78-
let info = await codeNodeClient.getCodeNodeInfo();
79-
if (!info) {
80-
let url: string = server.info.uri;
81-
const serverHost = server.config().get('server.host');
82-
if (serverHost !== undefined && serverHost !== 'localhost') {
83-
const serverPort = server.config().get('server.port');
84-
const schema = server.config().get('server.ssl.enabled') ? 'https' : 'http';
85-
let basePath: string = server.config().get('server.basePath') || '';
86-
if (!basePath.startsWith('/')) {
87-
basePath = '/' + basePath;
88-
}
89-
url = `${schema}://${serverHost}:${serverPort}}${basePath}`;
90-
}
91-
info = await codeNodeClient.createNodeInfo({
92-
uuid: serverUuid,
93-
url,
94-
});
95-
}
96-
if (info.uuid === serverUuid) {
86+
const codeNodeUrl = serverOptions.codeNodeUrl;
87+
if (codeNodeUrl) {
88+
const codeNodeUuid = (await retryUntilAvailable(
89+
async () => await getCodeNodeUuid(codeNodeUrl, log),
90+
5000
91+
)) as string;
92+
if (codeNodeUuid === serverUuid) {
9793
await initCodeNode(server, serverOptions, log);
9894
} else {
99-
const adminCluster = server.plugins.elasticsearch.getCluster('admin');
100-
// @ts-ignore
101-
const esUrl = adminCluster.clusterClient.config.hosts[0];
102-
log.error(
103-
`A code node with different uuid:${info.uuid} is already registered as code nodes.
104-
1. If this kibana node should be a non-code node, then please set "xpack.code.codeNode" to false in kibana.yml.
105-
2. If you want to replace the code-node to this kibana node, then please delete the old info by execute:
106-
curl --request DELETE --url ${esUrl}/.code_node/_doc/code-node-info
107-
`
108-
);
109-
await initNonCodeNode(info, server, serverOptions, log);
95+
await initNonCodeNode(codeNodeUrl, server, serverOptions, log);
11096
}
11197
} else {
112-
const info = await retryUntilAvailable(
113-
async () => await codeNodeClient.getCodeNodeInfo(),
114-
50
115-
);
116-
await initNonCodeNode(info!, server, serverOptions, log);
98+
// codeNodeUrl not set, single node mode
99+
await initCodeNode(server, serverOptions, log);
117100
}
118101
});
119102
}
120103

121104
async function initNonCodeNode(
122-
info: CodeNodeInfo,
105+
url: string,
123106
server: Server,
124107
serverOptions: ServerOptions,
125108
log: Logger
126109
) {
127-
log.info(
128-
`Initializing Code plugin as non-code node, redirecting all code requests to ${info.url}`
129-
);
130-
131-
redirectRoute(server, info.url, log);
110+
log.info(`Initializing Code plugin as non-code node, redirecting all code requests to ${url}`);
111+
redirectRoute(server, url, log);
132112
}
133113

134114
async function initCodeNode(server: Server, serverOptions: ServerOptions, log: Logger) {

x-pack/plugins/code/server/routes/redirect.ts

Lines changed: 1 addition & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -5,38 +5,14 @@
55
*/
66

77
import hapi from 'hapi';
8-
import url from 'url';
9-
import wreck from 'wreck';
108
import { Logger } from '../log';
119

12-
export const BASE_PLACEHOLDER = '/{baseUrl}';
13-
14-
export async function mainNodeBaseUrl(redirectUrl: string) {
15-
const u = url.parse(redirectUrl);
16-
const res = await wreck.request('HEAD', '/', {
17-
baseUrl: `${u.protocol}//${u.host}`,
18-
});
19-
if (res.statusCode === 302 && res.headers.location) {
20-
return res.headers.location;
21-
} else {
22-
// no base url?
23-
return '';
24-
}
25-
}
26-
27-
export function redirectRoute(server: hapi.Server, redirect: string, log: Logger) {
28-
let redirectUrl = redirect;
29-
const hasBaseUrl = redirectUrl.includes(BASE_PLACEHOLDER);
10+
export function redirectRoute(server: hapi.Server, redirectUrl: string, log: Logger) {
3011
const proxyHandler = {
3112
proxy: {
3213
passThrough: true,
3314
async mapUri(request: hapi.Request) {
3415
let uri;
35-
if (hasBaseUrl) {
36-
// send a head request to find main node's base url;
37-
const baseUrl = await mainNodeBaseUrl(redirectUrl);
38-
redirectUrl = redirect.replace(BASE_PLACEHOLDER, baseUrl);
39-
}
4016
uri = `${redirectUrl}${request.path}`;
4117
if (request.url.search) {
4218
uri += request.url.search;

x-pack/plugins/code/server/server_options.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ export class ServerOptions {
6262

6363
public readonly enabled: boolean = this.options.enabled;
6464

65-
public readonly codeNode: boolean = this.options.codeNode;
65+
public readonly codeNodeUrl: string = this.options.codeNodeUrl;
6666

6767
constructor(private options: any, private config: any) {}
6868
}

x-pack/test/functional/config.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,6 @@ export default async function ({ readConfigFile }) {
191191
'--xpack.xpack_main.telemetry.enabled=false',
192192
'--xpack.maps.showMapsInspectorAdapter=true',
193193
'--xpack.security.encryptionKey="wuGNaIhoMpk5sO4UBxgr3NyW1sFcLgIf"', // server restarts should not invalidate active sessions
194-
'--xpack.code.codeNode="true"',
195194
],
196195
},
197196
uiSettings: {

yarn.lock

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3634,15 +3634,6 @@
36343634
resolved "https://registry.yarnpkg.com/@types/wrap-ansi/-/wrap-ansi-2.0.14.tgz#5afbdd8374de9ff8ad752cb03ab9f225f7c2ee24"
36353635
integrity sha1-Wvvdg3Ten/itdSywOrnyJffC7iQ=
36363636

3637-
"@types/wreck@^14.0.0":
3638-
version "14.0.0"
3639-
resolved "https://registry.yarnpkg.com/@types/wreck/-/wreck-14.0.0.tgz#8bf39fd789d32af63176bee5eb5705108cd8be5e"
3640-
integrity sha512-cxA8o5fGbXg2e/UUoA7z8lMaEw4CwxvJW1Fv+E8xP/n2MOzRdeQUX+e7aUxgr1ganECiIQXUka0OwwKR2ixo1w==
3641-
dependencies:
3642-
"@types/boom" "*"
3643-
"@types/events" "*"
3644-
"@types/node" "*"
3645-
36463637
"@types/write-pkg@^3.1.0":
36473638
version "3.1.0"
36483639
resolved "https://registry.yarnpkg.com/@types/write-pkg/-/write-pkg-3.1.0.tgz#f58767f4fb9a6a3ad8e95d3e9cd1f2d026ceab26"

0 commit comments

Comments
 (0)