mirror of
https://github.com/elastic/kibana.git
synced 2025-04-24 09:48:58 -04:00
[code]: be able to disable code intelligence according to config (#28054)
This commit is contained in:
parent
b5755f6ade
commit
3c6690a4db
10 changed files with 79 additions and 11 deletions
|
@ -10,3 +10,4 @@ export const ServerNotInitialized: number = ErrorCodes.ServerNotInitialized;
|
|||
export const UnknownErrorCode: number = ErrorCodes.UnknownErrorCode;
|
||||
export const UnknownFileLanguage: number = -42404;
|
||||
export const LanguageServerNotInstalled: number = -42403;
|
||||
export const LanguageDisabled: number = -42402;
|
||||
|
|
|
@ -24,6 +24,7 @@ import {
|
|||
IndexWorker,
|
||||
UpdateWorker,
|
||||
} from './server/queue';
|
||||
import { RepositoryConfigController } from './server/repository_config_controller';
|
||||
import { RepositoryServiceFactory } from './server/repository_service_factory';
|
||||
import { fileRoute } from './server/routes/file';
|
||||
import { installRoute } from './server/routes/install';
|
||||
|
@ -110,13 +111,15 @@ export const code = (kibana: any) =>
|
|||
// @ts-ignore
|
||||
const esClient: EsClient = adminCluster.getClient();
|
||||
|
||||
const repoConfigController = new RepositoryConfigController(esClient);
|
||||
const installManager = new InstallManager(serverOptions);
|
||||
const lspService = new LspService(
|
||||
'127.0.0.1',
|
||||
serverOptions,
|
||||
esClient,
|
||||
installManager,
|
||||
new ServerLoggerFactory(server)
|
||||
new ServerLoggerFactory(server),
|
||||
repoConfigController
|
||||
);
|
||||
// Initialize indexing factories.
|
||||
const lspIndexerFactory = new LspIndexerFactory(lspService, serverOptions, esClient, log);
|
||||
|
@ -180,7 +183,8 @@ export const code = (kibana: any) =>
|
|||
cloneWorker,
|
||||
deleteWorker,
|
||||
indexWorker,
|
||||
repoIndexInitializerFactory
|
||||
repoIndexInitializerFactory,
|
||||
repoConfigController
|
||||
);
|
||||
repositorySearchRoute(server, log);
|
||||
documentSearchRoute(server, log);
|
||||
|
|
|
@ -16,6 +16,7 @@ import { AnyObject, EsClient } from '../lib/esqueue';
|
|||
import { Log } from '../log';
|
||||
import { InstallManager } from '../lsp/install_manager';
|
||||
import { LspService } from '../lsp/lsp_service';
|
||||
import { RepositoryConfigController } from '../repository_config_controller';
|
||||
import { ServerOptions } from '../server_options';
|
||||
import { ConsoleLoggerFactory } from '../utils/console_logger_factory';
|
||||
|
||||
|
@ -187,7 +188,8 @@ describe('lsp_indexer', () => {
|
|||
serverOptions,
|
||||
esClient as EsClient,
|
||||
{} as InstallManager,
|
||||
new ConsoleLoggerFactory()
|
||||
new ConsoleLoggerFactory(),
|
||||
new RepositoryConfigController(esClient as EsClient)
|
||||
);
|
||||
|
||||
lspservice.sendRequest = setupLsServiceSendRequestSpy();
|
||||
|
@ -238,7 +240,8 @@ describe('lsp_indexer', () => {
|
|||
serverOptions,
|
||||
esClient as EsClient,
|
||||
{} as InstallManager,
|
||||
new ConsoleLoggerFactory()
|
||||
new ConsoleLoggerFactory(),
|
||||
new RepositoryConfigController(esClient as EsClient)
|
||||
);
|
||||
|
||||
lspservice.sendRequest = setupLsServiceSendRequestSpy();
|
||||
|
|
|
@ -19,6 +19,7 @@ import { RepositoryGitStatusReservedField, RepositoryTypeName } from '../indexer
|
|||
import { InstallManager } from "../lsp/install_manager";
|
||||
import * as os from "os";
|
||||
import assert from 'assert';
|
||||
import { RepositoryConfigController } from '../repository_config_controller';
|
||||
|
||||
|
||||
|
||||
|
@ -108,7 +109,7 @@ describe('lsp_service tests', () => {
|
|||
let esClient = mockEsClient();
|
||||
const revision = 'master';
|
||||
|
||||
const lspservice = new LspService('127.0.0.1', serverOptions, esClient, installManager, new ConsoleLoggerFactory());
|
||||
const lspservice = new LspService('127.0.0.1', serverOptions, esClient, installManager, new ConsoleLoggerFactory(), new RepositoryConfigController(esClient));
|
||||
try {
|
||||
const params = {
|
||||
textDocument: {
|
||||
|
@ -154,7 +155,7 @@ describe('lsp_service tests', () => {
|
|||
it("unload a workspace", async () => {
|
||||
let esClient = mockEsClient();
|
||||
const revision = 'master';
|
||||
const lspservice = new LspService('127.0.0.1', serverOptions, esClient, installManager, new ConsoleLoggerFactory());
|
||||
const lspservice = new LspService('127.0.0.1', serverOptions, esClient, installManager, new ConsoleLoggerFactory(), new RepositoryConfigController(esClient));
|
||||
try {
|
||||
const params = {
|
||||
textDocument: {
|
||||
|
|
|
@ -8,12 +8,14 @@ import { ResponseError } from 'vscode-jsonrpc';
|
|||
import { ResponseMessage } from 'vscode-jsonrpc/lib/messages';
|
||||
import { LanguageServerStatus } from '../../common/language_server';
|
||||
import {
|
||||
LanguageDisabled,
|
||||
LanguageServerNotInstalled,
|
||||
UnknownErrorCode,
|
||||
UnknownFileLanguage,
|
||||
} from '../../common/lsp_error_codes';
|
||||
import { LspRequest } from '../../model';
|
||||
import { Logger } from '../log';
|
||||
import { RepositoryConfigController } from '../repository_config_controller';
|
||||
import { ServerOptions } from '../server_options';
|
||||
import { detectLanguage } from '../utils/detect_language';
|
||||
import { LoggerFactory } from '../utils/log_factory';
|
||||
|
@ -51,7 +53,8 @@ export class LanguageServerController implements ILanguageServerHandler {
|
|||
readonly options: ServerOptions,
|
||||
readonly targetHost: string,
|
||||
readonly installManager: InstallManager,
|
||||
readonly loggerFactory: LoggerFactory
|
||||
readonly loggerFactory: LoggerFactory,
|
||||
readonly repoConfigController: RepositoryConfigController
|
||||
) {
|
||||
this.log = loggerFactory.getLogger([]);
|
||||
this.languageServers = LanguageServers.map(def => ({
|
||||
|
@ -76,6 +79,11 @@ export class LanguageServerController implements ILanguageServerHandler {
|
|||
if (file) {
|
||||
// #todo add test for this
|
||||
const lang = await detectLanguage(file.replace('file://', ''));
|
||||
if (await this.repoConfigController.isLanguageDisabled(request.documentUri!, lang)) {
|
||||
return Promise.reject(
|
||||
new ResponseError(LanguageDisabled, `language disabled for the file`)
|
||||
);
|
||||
}
|
||||
return this.dispatchRequest(lang, request);
|
||||
} else {
|
||||
return Promise.reject(
|
||||
|
|
|
@ -8,6 +8,7 @@ import { ResponseMessage } from 'vscode-jsonrpc/lib/messages';
|
|||
|
||||
import { LanguageServerStatus } from '../../common/language_server';
|
||||
import { EsClient } from '../lib/esqueue';
|
||||
import { RepositoryConfigController } from '../repository_config_controller';
|
||||
import { ServerOptions } from '../server_options';
|
||||
import { LoggerFactory } from '../utils/log_factory';
|
||||
import { LanguageServerController } from './controller';
|
||||
|
@ -22,7 +23,8 @@ export class LspService {
|
|||
serverOptions: ServerOptions,
|
||||
client: EsClient,
|
||||
installManager: InstallManager,
|
||||
loggerFactory: LoggerFactory
|
||||
loggerFactory: LoggerFactory,
|
||||
repoConfigController: RepositoryConfigController
|
||||
) {
|
||||
this.workspaceHandler = new WorkspaceHandler(
|
||||
serverOptions.repoPath,
|
||||
|
@ -34,7 +36,8 @@ export class LspService {
|
|||
serverOptions,
|
||||
targetHost,
|
||||
installManager,
|
||||
loggerFactory
|
||||
loggerFactory,
|
||||
repoConfigController
|
||||
);
|
||||
}
|
||||
|
||||
|
|
|
@ -120,6 +120,7 @@ export class WorkspaceHandler {
|
|||
params.textDocument.uri
|
||||
);
|
||||
if (filePath) {
|
||||
request.documentUri = payload.textDocument.uri;
|
||||
payload.textDocument.uri = request.resolvedFilePath = filePath;
|
||||
request.workspacePath = workspacePath;
|
||||
request.workspaceRevision = workspaceRevision;
|
||||
|
|
44
x-pack/plugins/code/server/repository_config_controller.ts
Normal file
44
x-pack/plugins/code/server/repository_config_controller.ts
Normal file
|
@ -0,0 +1,44 @@
|
|||
/*
|
||||
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
|
||||
* or more contributor license agreements. Licensed under the Elastic License;
|
||||
* you may not use this file except in compliance with the Elastic License.
|
||||
*/
|
||||
|
||||
import { parseLspUrl } from '../common/uri_util';
|
||||
import { RepositoryConfig } from '../model';
|
||||
import { EsClient } from '../server/lib/esqueue';
|
||||
import { RepositoryObjectClient } from './search';
|
||||
|
||||
export class RepositoryConfigController {
|
||||
private repositoryConfigCache: { [repoUri: string]: RepositoryConfig } = {};
|
||||
private repoObjectClient: RepositoryObjectClient;
|
||||
|
||||
constructor(readonly esClient: EsClient) {
|
||||
this.repoObjectClient = new RepositoryObjectClient(esClient);
|
||||
}
|
||||
|
||||
public async isLanguageDisabled(uri: string, lang: string): Promise<boolean> {
|
||||
const { repoUri } = parseLspUrl(uri)!;
|
||||
let repoConfig = this.repositoryConfigCache[repoUri];
|
||||
|
||||
if (!repoConfig) {
|
||||
try {
|
||||
repoConfig = await this.repoObjectClient.getRepositoryConfig(repoUri);
|
||||
} catch (err) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (lang === 'java' && repoConfig.disableJava === true) {
|
||||
return true;
|
||||
}
|
||||
if (lang === 'typescript' && repoConfig.disableTypescript === true) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public async resetConfigCache(repoUri: string) {
|
||||
delete this.repositoryConfigCache[repoUri];
|
||||
}
|
||||
}
|
|
@ -13,6 +13,7 @@ import { RepositoryConfig } from '../../model';
|
|||
import { RepositoryIndexInitializer, RepositoryIndexInitializerFactory } from '../indexer';
|
||||
import { Log } from '../log';
|
||||
import { CloneWorker, DeleteWorker, IndexWorker } from '../queue';
|
||||
import { RepositoryConfigController } from '../repository_config_controller';
|
||||
import { RepositoryObjectClient } from '../search';
|
||||
import { ServerOptions } from '../server_options';
|
||||
import { EsClientWithRequest } from '../utils/esclient_with_request';
|
||||
|
@ -23,7 +24,8 @@ export function repositoryRoute(
|
|||
cloneWorker: CloneWorker,
|
||||
deleteWorker: DeleteWorker,
|
||||
indexWorker: IndexWorker,
|
||||
repoIndexInitializerFactory: RepositoryIndexInitializerFactory
|
||||
repoIndexInitializerFactory: RepositoryIndexInitializerFactory,
|
||||
repoConfigController: RepositoryConfigController
|
||||
) {
|
||||
// Clone a git repository
|
||||
|
||||
|
@ -228,6 +230,7 @@ export function repositoryRoute(
|
|||
try {
|
||||
// Persist to elasticsearch
|
||||
await repoObjectClient.setRepositoryConfig(repo.uri, config);
|
||||
repoConfigController.resetConfigCache(repo.uri);
|
||||
return {};
|
||||
} catch (error) {
|
||||
const msg = `Issue repository clone request for ${repoUrl} error: ${error}`;
|
||||
|
|
|
@ -42,7 +42,7 @@ export class RepositoryObjectClient {
|
|||
return await this.getRepositoryObject(repoUri, RepositoryDeleteStatusReservedField);
|
||||
}
|
||||
|
||||
public async getRepositoryConfig(repoUri: RepositoryUri): Promise<Repository> {
|
||||
public async getRepositoryConfig(repoUri: RepositoryUri): Promise<RepositoryConfig> {
|
||||
return await this.getRepositoryObject(repoUri, RepositoryConfigReservedField);
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue