Skip to content

Commit c5cd6d5

Browse files
Merge branch '7.x' into backport/7.x/pr-48268
2 parents a87c150 + 3f5b064 commit c5cd6d5

File tree

24 files changed

+376
-83
lines changed

24 files changed

+376
-83
lines changed

packages/kbn-es/src/custom_snapshots.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,8 @@ function isVersionFlag(a) {
2626
function getCustomSnapshotUrl() {
2727
// force use of manually created snapshots until live ones are available
2828
if (!process.env.KBN_ES_SNAPSHOT_URL && !process.argv.some(isVersionFlag)) {
29-
// return 'https://storage.googleapis.com/kibana-ci-tmp-artifacts/{name}-{version}-{os}-x86_64.{ext}';
30-
return undefined;
29+
return 'https://storage.googleapis.com/kibana-ci-tmp-artifacts/{name}-{version}-{os}-x86_64.{ext}';
30+
// return undefined;
3131
}
3232

3333
if (process.env.KBN_ES_SNAPSHOT_URL && process.env.KBN_ES_SNAPSHOT_URL !== 'false') {

src/dev/ci_setup/checkout_sibling_es.sh

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -88,10 +88,7 @@ function checkout_sibling {
8888
}
8989

9090
checkout_sibling "elasticsearch" "${PARENT_DIR}/elasticsearch" "USE_EXISTING_ES"
91-
92-
# export TEST_ES_FROM=${TEST_ES_FROM:-snapshot}
93-
# temporarily build from source until 7.6.0 snapshot is available.
94-
export TEST_ES_FROM=source
91+
export TEST_ES_FROM=${TEST_ES_FROM:-snapshot}
9592

9693
# Set the JAVA_HOME based on the Java property file in the ES repo
9794
# This assumes the naming convention used on CI (ex: ~/.java/java10)

x-pack/legacy/plugins/code/common/constants.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,4 @@
66

77
export const APP_TITLE = 'Code (Beta)';
88
export const APP_USAGE_TYPE = 'code';
9+
export const SAVED_OBJ_REPO = 'code-repo';

x-pack/legacy/plugins/code/index.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,10 @@ import { Legacy } from 'kibana';
1010
import { resolve } from 'path';
1111
import { CoreSetup } from 'src/core/server';
1212

13-
import { APP_TITLE } from './common/constants';
13+
import { APP_TITLE, SAVED_OBJ_REPO } from './common/constants';
1414
import { codePlugin } from './server';
1515
import { PluginSetupContract } from '../../../plugins/code/server';
16+
import { mappings } from './mappings';
1617

1718
export type RequestFacade = Legacy.Request;
1819
export type RequestQueryFacade = RequestQuery;
@@ -43,6 +44,12 @@ export const code = (kibana: any) =>
4344
};
4445
},
4546
hacks: ['plugins/code/hacks/toggle_app_link_in_nav'],
47+
savedObjectSchemas: {
48+
[SAVED_OBJ_REPO]: {
49+
isNamespaceAgnostic: false,
50+
},
51+
},
52+
mappings,
4653
},
4754
config(Joi: typeof JoiNamespace) {
4855
return Joi.object({
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
/*
2+
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
3+
* or more contributor license agreements. Licensed under the Elastic License;
4+
* you may not use this file except in compliance with the Elastic License.
5+
*/
6+
7+
import { SAVED_OBJ_REPO } from './common/constants';
8+
9+
export const mappings = {
10+
[SAVED_OBJ_REPO]: {
11+
properties: {
12+
uri: {
13+
type: 'keyword',
14+
},
15+
},
16+
},
17+
};

x-pack/legacy/plugins/code/model/search.ts

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -231,3 +231,64 @@ export interface SearchOptions {
231231
defaultRepoScopeOn: boolean;
232232
defaultRepoScope?: Repository;
233233
}
234+
235+
export function emptySearchResult(): SearchResult {
236+
return {
237+
total: 0,
238+
took: 0,
239+
};
240+
}
241+
242+
export function emptyRepositorySearchResult(): RepositorySearchResult {
243+
return {
244+
...emptySearchResult(),
245+
repositories: [],
246+
from: 0,
247+
page: 0,
248+
totalPage: 0,
249+
};
250+
}
251+
252+
export function emptySymbolSearchResult(): SymbolSearchResult {
253+
return {
254+
...emptySearchResult(),
255+
symbols: [],
256+
};
257+
}
258+
259+
export function emptyDocumentSearchResult(query: string): DocumentSearchResult {
260+
return {
261+
...emptySearchResult(),
262+
query,
263+
from: 0,
264+
page: 0,
265+
totalPage: 0,
266+
stats: {
267+
total: 0,
268+
from: 0,
269+
to: 0,
270+
page: 0,
271+
totalPage: 0,
272+
repoStats: [],
273+
languageStats: [],
274+
},
275+
results: [],
276+
repoAggregations: [],
277+
langAggregations: [],
278+
};
279+
}
280+
281+
export function emptyCommitSearchResult(query: string): CommitSearchResult {
282+
return {
283+
...emptyDocumentSearchResult(query),
284+
commits: [],
285+
};
286+
}
287+
288+
export function emptyIntegrationsSearchResult(): IntegrationsSearchResult {
289+
return {
290+
...emptySearchResult(),
291+
results: [],
292+
fallback: false,
293+
};
294+
}

x-pack/legacy/plugins/code/server/routes/file.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import { EsClientWithRequest } from '../utils/esclient_with_request';
1414
import { decodeRevisionString } from '../../common/uri_util';
1515
import { CodeServices } from '../distributed/code_services';
1616
import { GitServiceDefinition } from '../distributed/apis';
17+
import { getReferenceHelper } from '../utils/repository_reference_helper';
1718

1819
export function fileRoute(router: CodeServerRouter, codeServices: CodeServices) {
1920
const gitService = codeServices.serviceFor(GitServiceDefinition);
@@ -26,6 +27,7 @@ export function fileRoute(router: CodeServerRouter, codeServices: CodeServices)
2627

2728
try {
2829
const repo = await repoObjectClient.getRepository(repoUri);
30+
await getReferenceHelper(req.getSavedObjectsClient()).ensureReference(repo.uri);
2931
return repo.uri;
3032
} catch (e) {
3133
return undefined;

x-pack/legacy/plugins/code/server/routes/lsp.ts

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ import { RequestFacade, ResponseToolkitFacade } from '../..';
2626
import { CodeServices } from '../distributed/code_services';
2727
import { GitServiceDefinition, LspServiceDefinition } from '../distributed/apis';
2828
import { findTitleFromHover, groupFiles } from '../utils/lsp_utils';
29+
import { getReferenceHelper } from '../utils/repository_reference_helper';
30+
import { SymbolSearchResult } from '../../model';
2931

3032
const LANG_SERVER_ERROR = 'language server error';
3133

@@ -48,6 +50,7 @@ export function lspRoute(
4850
const params = (req.payload as unknown) as any;
4951
const uri = params.textDocument.uri;
5052
const { repoUri } = parseLspUrl(uri)!;
53+
await getReferenceHelper(req.getSavedObjectsClient()).ensureReference(repoUri);
5154
const endpoint = await codeServices.locate(req, repoUri);
5255
const requestPromise = lspService.sendRequest(endpoint, {
5356
method: `textDocument/${method}`,
@@ -95,7 +98,9 @@ export function lspRoute(
9598
// @ts-ignore
9699
const { textDocument, position } = req.payload;
97100
const { uri } = textDocument;
98-
const endpoint = await codeServices.locate(req, parseLspUrl(uri).repoUri);
101+
const { repoUri } = parseLspUrl(uri);
102+
await getReferenceHelper(req.getSavedObjectsClient()).ensureReference(repoUri);
103+
const endpoint = await codeServices.locate(req, repoUri);
99104
const response: ResponseMessage = await promiseTimeout(
100105
serverOptions.lsp.requestTimeoutMs,
101106
lspService.sendRequest(endpoint, {
@@ -115,11 +120,12 @@ export function lspRoute(
115120

116121
const locators = response.result as SymbolLocator[];
117122
const locations = [];
123+
const repoScope = await getReferenceHelper(req.getSavedObjectsClient()).findReferences();
118124
for (const locator of locators) {
119125
if (locator.location) {
120126
locations.push(locator.location);
121-
} else if (locator.qname) {
122-
const searchResults = await symbolSearchClient.findByQname(req.params.qname);
127+
} else if (locator.qname && repoScope.length > 0) {
128+
const searchResults = await symbolSearchClient.findByQname(req.params.qname, repoScope);
123129
for (const symbol of searchResults.symbols) {
124130
locations.push(symbol.symbolInformation.location);
125131
}
@@ -141,7 +147,9 @@ export function lspRoute(
141147
// @ts-ignore
142148
const { textDocument, position } = req.payload;
143149
const { uri } = textDocument;
144-
const endpoint = await codeServices.locate(req, parseLspUrl(uri).repoUri);
150+
const { repoUri } = parseLspUrl(uri);
151+
await getReferenceHelper(req.getSavedObjectsClient()).ensureReference(repoUri);
152+
const endpoint = await codeServices.locate(req, repoUri);
145153
const response: ResponseMessage = await promiseTimeout(
146154
serverOptions.lsp.requestTimeoutMs,
147155
lspService.sendRequest(endpoint, {
@@ -189,7 +197,15 @@ export function symbolByQnameRoute(router: CodeServerRouter, log: Logger) {
189197
async handler(req: RequestFacade) {
190198
try {
191199
const symbolSearchClient = new SymbolSearchClient(new EsClientWithRequest(req), log);
192-
return await symbolSearchClient.findByQname(req.params.qname);
200+
const repoScope = await getReferenceHelper(req.getSavedObjectsClient()).findReferences();
201+
if (repoScope.length === 0) {
202+
return {
203+
symbols: [],
204+
total: 0,
205+
took: 0,
206+
} as SymbolSearchResult;
207+
}
208+
return await symbolSearchClient.findByQname(req.params.qname, repoScope);
193209
} catch (error) {
194210
return Boom.internal(`Search Exception`);
195211
}

x-pack/legacy/plugins/code/server/routes/repository.ts

Lines changed: 55 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
import Boom from 'boom';
88

9+
import { i18n } from '@kbn/i18n';
910
import { RequestFacade, ResponseToolkitFacade } from '../..';
1011
import { validateGitUrl } from '../../common/git_url_utils';
1112
import { RepositoryUtils } from '../../common/repository_utils';
@@ -19,6 +20,7 @@ import { EsClientWithRequest } from '../utils/esclient_with_request';
1920
import { CodeServerRouter } from '../security';
2021
import { CodeServices } from '../distributed/code_services';
2122
import { RepositoryServiceDefinition } from '../distributed/apis';
23+
import { getReferenceHelper } from '../utils/repository_reference_helper';
2224

2325
export function repositoryRoute(
2426
router: CodeServerRouter,
@@ -56,12 +58,32 @@ export function repositoryRoute(
5658
try {
5759
// Check if the repository already exists
5860
await repoObjectClient.getRepository(repo.uri);
61+
// distinguish between that the repository exists in the current space and that the repository exists in
62+
// another space, and return the default message if error happens during reference checking.
63+
try {
64+
const hasRef = await getReferenceHelper(req.getSavedObjectsClient()).hasReference(
65+
repo.uri
66+
);
67+
if (!hasRef) {
68+
return Boom.conflict(
69+
i18n.translate('xpack.code.repositoryManagement.repoOtherSpaceImportedMessage', {
70+
defaultMessage: 'The repository has already been imported in another space!',
71+
})
72+
);
73+
}
74+
} catch (e) {
75+
log.error(`Failed to check reference for ${repo.uri} in current space`);
76+
}
5977
const msg = `Repository ${repoUrl} already exists. Skip clone.`;
6078
log.info(msg);
6179
return h.response(msg).code(304); // Not Modified
6280
} catch (error) {
6381
log.info(`Repository ${repoUrl} does not exist. Go ahead with clone.`);
6482
try {
83+
// create the reference first, and make the creation idempotent, to avoid potential dangling repositories
84+
// which have no references from any space, in case the writes to ES may fail independently
85+
await getReferenceHelper(req.getSavedObjectsClient()).createReference(repo.uri);
86+
6587
// Create the index for the repository
6688
const initializer = (await repoIndexInitializerFactory.create(
6789
repo.uri,
@@ -106,6 +128,9 @@ export function repositoryRoute(
106128
const repoUri: string = req.params.uri as string;
107129
const repoObjectClient = new RepositoryObjectClient(new EsClientWithRequest(req));
108130
try {
131+
// make sure the repo belongs to the current space
132+
getReferenceHelper(req.getSavedObjectsClient()).ensureReference(repoUri);
133+
109134
// Check if the repository already exists. If not, an error will be thrown.
110135
await repoObjectClient.getRepository(repoUri);
111136

@@ -129,6 +154,9 @@ export function repositoryRoute(
129154
};
130155
const endpoint = await codeServices.locate(req, repoUri);
131156
await repositoryService.delete(endpoint, payload);
157+
158+
// delete the reference last to avoid dangling repositories
159+
await getReferenceHelper(req.getSavedObjectsClient()).deleteReference(repoUri);
132160
return {};
133161
} catch (error) {
134162
const msg = `Issue repository delete request for ${repoUri} error`;
@@ -146,6 +174,7 @@ export function repositoryRoute(
146174
async handler(req: RequestFacade) {
147175
const repoUri = req.params.uri as string;
148176
try {
177+
await getReferenceHelper(req.getSavedObjectsClient()).ensureReference(repoUri);
149178
const repoObjectClient = new RepositoryObjectClient(new EsClientWithRequest(req));
150179
return await repoObjectClient.getRepository(repoUri);
151180
} catch (error) {
@@ -164,25 +193,30 @@ export function repositoryRoute(
164193
const repoUri = req.params.uri as string;
165194
try {
166195
const repoObjectClient = new RepositoryObjectClient(new EsClientWithRequest(req));
167-
let gitStatus = null;
168-
try {
169-
gitStatus = await repoObjectClient.getRepositoryGitStatus(repoUri);
170-
} catch (error) {
171-
log.debug(`Get repository git status ${repoUri} error: ${error}`);
172-
}
173196

197+
let gitStatus = null;
174198
let indexStatus = null;
175-
try {
176-
indexStatus = await repoObjectClient.getRepositoryIndexStatus(repoUri);
177-
} catch (error) {
178-
log.debug(`Get repository index status ${repoUri} error: ${error}`);
179-
}
180-
181199
let deleteStatus = null;
182-
try {
183-
deleteStatus = await repoObjectClient.getRepositoryDeleteStatus(repoUri);
184-
} catch (error) {
185-
log.debug(`Get repository delete status ${repoUri} error: ${error}`);
200+
const hasRef = await getReferenceHelper(req.getSavedObjectsClient()).hasReference(repoUri);
201+
202+
if (hasRef) {
203+
try {
204+
gitStatus = await repoObjectClient.getRepositoryGitStatus(repoUri);
205+
} catch (error) {
206+
log.debug(`Get repository git status ${repoUri} error: ${error}`);
207+
}
208+
209+
try {
210+
indexStatus = await repoObjectClient.getRepositoryIndexStatus(repoUri);
211+
} catch (error) {
212+
log.debug(`Get repository index status ${repoUri} error: ${error}`);
213+
}
214+
215+
try {
216+
deleteStatus = await repoObjectClient.getRepositoryDeleteStatus(repoUri);
217+
} catch (error) {
218+
log.debug(`Get repository delete status ${repoUri} error: ${error}`);
219+
}
186220
}
187221
return {
188222
gitStatus,
@@ -204,8 +238,9 @@ export function repositoryRoute(
204238
method: 'GET',
205239
async handler(req: RequestFacade) {
206240
try {
241+
const uris = await getReferenceHelper(req.getSavedObjectsClient()).findReferences();
207242
const repoObjectClient = new RepositoryObjectClient(new EsClientWithRequest(req));
208-
return await repoObjectClient.getAllRepositories();
243+
return await repoObjectClient.getRepositories(uris);
209244
} catch (error) {
210245
const msg = `Get all repositories error`;
211246
log.error(msg);
@@ -226,6 +261,7 @@ export function repositoryRoute(
226261
const repoUri = req.params.uri as string;
227262
const reindex: boolean = (req.payload as any).reindex;
228263
try {
264+
await getReferenceHelper(req.getSavedObjectsClient()).ensureReference(repoUri);
229265
const repoObjectClient = new RepositoryObjectClient(new EsClientWithRequest(req));
230266
const cloneStatus = await repoObjectClient.getRepositoryGitStatus(repoUri);
231267

@@ -258,6 +294,7 @@ export function repositoryRoute(
258294

259295
try {
260296
// Check if the repository exists
297+
await getReferenceHelper(req.getSavedObjectsClient()).ensureReference(repoUri);
261298
await repoObjectClient.getRepository(repoUri);
262299
} catch (error) {
263300
return Boom.badRequest(`Repository not existed for ${repoUri}`);
@@ -284,6 +321,7 @@ export function repositoryRoute(
284321
async handler(req: RequestFacade) {
285322
const repoUri = req.params.uri as string;
286323
try {
324+
await getReferenceHelper(req.getSavedObjectsClient()).ensureReference(repoUri);
287325
const repoObjectClient = new RepositoryObjectClient(new EsClientWithRequest(req));
288326
return await repoObjectClient.getRepositoryConfig(repoUri);
289327
} catch (error) {

0 commit comments

Comments
 (0)