mirror of
https://github.com/elastic/kibana.git
synced 2025-04-23 17:28:26 -04:00
Remove bluebird dependency (#118097)
This commit is contained in:
parent
9dbb1d841e
commit
788db0dd9d
50 changed files with 631 additions and 626 deletions
|
@ -193,7 +193,6 @@
|
|||
"archiver": "^5.2.0",
|
||||
"axios": "^0.21.1",
|
||||
"base64-js": "^1.3.1",
|
||||
"bluebird": "3.5.5",
|
||||
"brace": "0.11.1",
|
||||
"broadcast-channel": "^4.2.0",
|
||||
"chalk": "^4.1.0",
|
||||
|
@ -494,7 +493,6 @@
|
|||
"@types/archiver": "^5.1.0",
|
||||
"@types/babel__core": "^7.1.16",
|
||||
"@types/base64-js": "^1.2.5",
|
||||
"@types/bluebird": "^3.1.1",
|
||||
"@types/chance": "^1.0.0",
|
||||
"@types/chroma-js": "^1.4.2",
|
||||
"@types/chromedriver": "^81.0.0",
|
||||
|
|
|
@ -34,7 +34,6 @@ RUNTIME_DEPS = [
|
|||
"//packages/kbn-utils",
|
||||
"@npm//@elastic/elasticsearch",
|
||||
"@npm//aggregate-error",
|
||||
"@npm//bluebird",
|
||||
"@npm//chance",
|
||||
"@npm//globby",
|
||||
"@npm//json-stable-stringify",
|
||||
|
@ -51,7 +50,6 @@ TYPES_DEPS = [
|
|||
"@npm//aggregate-error",
|
||||
"@npm//globby",
|
||||
"@npm//zlib",
|
||||
"@npm//@types/bluebird",
|
||||
"@npm//@types/chance",
|
||||
"@npm//@types/jest",
|
||||
"@npm//@types/json-stable-stringify",
|
||||
|
|
|
@ -7,9 +7,9 @@
|
|||
*/
|
||||
|
||||
import { resolve, relative } from 'path';
|
||||
import { stat, Stats, rename, createReadStream, createWriteStream } from 'fs';
|
||||
import { Stats, createReadStream, createWriteStream } from 'fs';
|
||||
import { stat, rename } from 'fs/promises';
|
||||
import { Readable, Writable } from 'stream';
|
||||
import { fromNode } from 'bluebird';
|
||||
import { ToolingLog, REPO_ROOT } from '@kbn/dev-utils';
|
||||
import { createPromiseFromStreams } from '@kbn/utils';
|
||||
import {
|
||||
|
@ -21,7 +21,7 @@ import {
|
|||
} from '../lib';
|
||||
|
||||
async function isDirectory(path: string): Promise<boolean> {
|
||||
const stats: Stats = await fromNode((cb) => stat(path, cb));
|
||||
const stats: Stats = await stat(path);
|
||||
return stats.isDirectory();
|
||||
}
|
||||
|
||||
|
@ -50,7 +50,7 @@ export async function rebuildAllAction({ dataDir, log }: { dataDir: string; log:
|
|||
createWriteStream(tempFile),
|
||||
] as [Readable, ...Writable[]]);
|
||||
|
||||
await fromNode((cb) => rename(tempFile, childPath, cb));
|
||||
await rename(tempFile, childPath);
|
||||
log.info('[%s] Rebuilt %j', archiveName, childName);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -6,10 +6,9 @@
|
|||
* Side Public License, v 1.
|
||||
*/
|
||||
|
||||
import { readdir } from 'fs';
|
||||
import { fromNode } from 'bluebird';
|
||||
import { readdir } from 'fs/promises';
|
||||
|
||||
export async function readDirectory(path: string) {
|
||||
const allNames = await fromNode<string[]>((cb) => readdir(path, cb));
|
||||
const allNames = await readdir(path);
|
||||
return allNames.filter((name) => !name.startsWith('.'));
|
||||
}
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
* Side Public License, v 1.
|
||||
*/
|
||||
|
||||
import { delay } from 'bluebird';
|
||||
import { setTimeout as setTimeoutAsync } from 'timers/promises';
|
||||
|
||||
export default function () {
|
||||
return {
|
||||
|
@ -22,13 +22,13 @@ export default function () {
|
|||
|
||||
lifecycle.testFailure.add(async (err, test) => {
|
||||
log.info('testFailure %s %s', err.message, test.fullTitle());
|
||||
await delay(10);
|
||||
await setTimeoutAsync(10);
|
||||
log.info('testFailureAfterDelay %s %s', err.message, test.fullTitle());
|
||||
});
|
||||
|
||||
lifecycle.testHookFailure.add(async (err, test) => {
|
||||
log.info('testHookFailure %s %s', err.message, test.fullTitle());
|
||||
await delay(10);
|
||||
await setTimeoutAsync(10);
|
||||
log.info('testHookFailureAfterDelay %s %s', err.message, test.fullTitle());
|
||||
});
|
||||
},
|
||||
|
|
|
@ -6,13 +6,6 @@
|
|||
* Side Public License, v 1.
|
||||
*/
|
||||
|
||||
// bluebird < v3.3.5 does not work with MutationObserver polyfill
|
||||
// when MutationObserver exists, bluebird avoids using node's builtin async schedulers
|
||||
const bluebird = require('bluebird');
|
||||
bluebird.Promise.setScheduler(function (fn) {
|
||||
global.setImmediate.call(global, fn);
|
||||
});
|
||||
|
||||
const MutationObserver = require('mutation-observer');
|
||||
Object.defineProperty(window, 'MutationObserver', { value: MutationObserver });
|
||||
|
||||
|
|
|
@ -7,9 +7,9 @@
|
|||
*/
|
||||
|
||||
import { resolve } from 'path';
|
||||
import { readFileSync } from 'fs';
|
||||
import { readFile } from 'fs/promises';
|
||||
import { promisify } from 'util';
|
||||
|
||||
import { fromNode as fcb } from 'bluebird';
|
||||
import { parseString } from 'xml2js';
|
||||
import del from 'del';
|
||||
import Mocha from 'mocha';
|
||||
|
@ -22,6 +22,8 @@ const DURATION_REGEX = /^\d+\.\d{3}$/;
|
|||
const ISO_DATE_SEC_REGEX = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}$/;
|
||||
const XML_PATH = getUniqueJunitReportPath(PROJECT_DIR, 'test');
|
||||
|
||||
const parseStringAsync = promisify(parseString);
|
||||
|
||||
describe('dev/mocha/junit report generation', () => {
|
||||
afterEach(() => {
|
||||
del.sync(resolve(PROJECT_DIR, 'target'));
|
||||
|
@ -39,7 +41,7 @@ describe('dev/mocha/junit report generation', () => {
|
|||
|
||||
mocha.addFile(resolve(PROJECT_DIR, 'test.js'));
|
||||
await new Promise((resolve) => mocha.run(resolve));
|
||||
const report = await fcb((cb) => parseString(readFileSync(XML_PATH), cb));
|
||||
const report = await parseStringAsync(await readFile(XML_PATH));
|
||||
|
||||
// test case results are wrapped in <testsuites></testsuites>
|
||||
expect(report).toEqual({
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
* Side Public License, v 1.
|
||||
*/
|
||||
|
||||
import { delay } from 'bluebird';
|
||||
import { setTimeout as setTimeoutAsync } from 'timers/promises';
|
||||
|
||||
import { createPromiseFromStreams } from './promise_from_streams';
|
||||
import { createListStream } from './list_stream';
|
||||
|
@ -39,7 +39,7 @@ describe('createMapStream()', () => {
|
|||
const result = await createPromiseFromStreams([
|
||||
createListStream([1, 2, 3]),
|
||||
createMapStream(async (n: number, i: number) => {
|
||||
await delay(n);
|
||||
await setTimeoutAsync(n);
|
||||
return n * i;
|
||||
}),
|
||||
createConcatStream([]),
|
||||
|
|
|
@ -7,18 +7,20 @@
|
|||
*/
|
||||
|
||||
import { resolve } from 'path';
|
||||
import { readFile } from 'fs';
|
||||
import { readFile } from 'fs/promises';
|
||||
import { promisify } from 'util';
|
||||
|
||||
import { fromNode as fcb } from 'bluebird';
|
||||
import glob from 'glob';
|
||||
|
||||
const globAsync = promisify(glob);
|
||||
|
||||
export async function getBundledNotices(packageDirectory) {
|
||||
const pattern = resolve(packageDirectory, '*{LICENSE,NOTICE}*');
|
||||
const paths = await fcb((cb) => glob(pattern, cb));
|
||||
const paths = await globAsync(pattern);
|
||||
return Promise.all(
|
||||
paths.map(async (path) => ({
|
||||
path,
|
||||
text: await fcb((cb) => readFile(path, 'utf8', cb)),
|
||||
text: await readFile(path, 'utf8'),
|
||||
}))
|
||||
);
|
||||
}
|
||||
|
|
|
@ -6,8 +6,7 @@
|
|||
* Side Public License, v 1.
|
||||
*/
|
||||
|
||||
import SimpleGit from 'simple-git';
|
||||
import { fromNode as fcb } from 'bluebird';
|
||||
import SimpleGit from 'simple-git/promise';
|
||||
|
||||
import { REPO_ROOT } from '@kbn/utils';
|
||||
import { File } from '../file';
|
||||
|
@ -22,7 +21,7 @@ import { File } from '../file';
|
|||
export async function getFilesForCommit(gitRef) {
|
||||
const simpleGit = new SimpleGit(REPO_ROOT);
|
||||
const gitRefForDiff = gitRef ? gitRef : '--cached';
|
||||
const output = await fcb((cb) => simpleGit.diff(['--name-status', gitRefForDiff], cb));
|
||||
const output = await simpleGit.diff(['--name-status', gitRefForDiff]);
|
||||
|
||||
return (
|
||||
output
|
||||
|
|
|
@ -6,7 +6,6 @@
|
|||
* Side Public License, v 1.
|
||||
*/
|
||||
|
||||
import Bluebird from 'bluebird';
|
||||
import { createSavedObjectClass } from './saved_object';
|
||||
import {
|
||||
SavedObject,
|
||||
|
@ -55,16 +54,16 @@ describe('Saved Object', () => {
|
|||
*/
|
||||
function stubESResponse(mockDocResponse: SimpleSavedObject<SavedObjectAttributes>) {
|
||||
// Stub out search for duplicate title:
|
||||
savedObjectsClientStub.get = jest.fn().mockReturnValue(Bluebird.resolve(mockDocResponse));
|
||||
savedObjectsClientStub.update = jest.fn().mockReturnValue(Bluebird.resolve(mockDocResponse));
|
||||
savedObjectsClientStub.get = jest.fn().mockReturnValue(Promise.resolve(mockDocResponse));
|
||||
savedObjectsClientStub.update = jest.fn().mockReturnValue(Promise.resolve(mockDocResponse));
|
||||
|
||||
savedObjectsClientStub.find = jest
|
||||
.fn()
|
||||
.mockReturnValue(Bluebird.resolve({ savedObjects: [], total: 0 }));
|
||||
.mockReturnValue(Promise.resolve({ savedObjects: [], total: 0 }));
|
||||
|
||||
savedObjectsClientStub.bulkGet = jest
|
||||
.fn()
|
||||
.mockReturnValue(Bluebird.resolve({ savedObjects: [mockDocResponse] }));
|
||||
.mockReturnValue(Promise.resolve({ savedObjects: [mockDocResponse] }));
|
||||
}
|
||||
|
||||
function stubSavedObjectsClientCreate(
|
||||
|
@ -73,7 +72,7 @@ describe('Saved Object', () => {
|
|||
) {
|
||||
savedObjectsClientStub.create = jest
|
||||
.fn()
|
||||
.mockReturnValue(resolve ? Bluebird.resolve(resp) : Bluebird.reject(resp));
|
||||
.mockReturnValue(resolve ? Promise.resolve(resp) : Promise.reject(resp));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -262,7 +261,7 @@ describe('Saved Object', () => {
|
|||
return createInitializedSavedObject({ type: 'dashboard', id: myId }).then((savedObject) => {
|
||||
savedObjectsClientStub.create = jest.fn().mockImplementation(() => {
|
||||
expect(savedObject.id).toBe(myId);
|
||||
return Bluebird.resolve({ id: myId });
|
||||
return Promise.resolve({ id: myId });
|
||||
});
|
||||
savedObject.copyOnSave = false;
|
||||
|
||||
|
@ -296,7 +295,7 @@ describe('Saved Object', () => {
|
|||
return createInitializedSavedObject({ type: 'dashboard', id }).then((savedObject) => {
|
||||
savedObjectsClientStub.create = jest.fn().mockImplementation(() => {
|
||||
expect(savedObject.isSaving).toBe(true);
|
||||
return Bluebird.resolve({
|
||||
return Promise.resolve({
|
||||
type: 'dashboard',
|
||||
id,
|
||||
_version: 'foo',
|
||||
|
@ -315,7 +314,7 @@ describe('Saved Object', () => {
|
|||
return createInitializedSavedObject({ type: 'dashboard' }).then((savedObject) => {
|
||||
savedObjectsClientStub.create = jest.fn().mockImplementation(() => {
|
||||
expect(savedObject.isSaving).toBe(true);
|
||||
return Bluebird.reject('');
|
||||
return Promise.reject('');
|
||||
});
|
||||
|
||||
expect(savedObject.isSaving).toBe(false);
|
||||
|
@ -745,7 +744,7 @@ describe('Saved Object', () => {
|
|||
},
|
||||
});
|
||||
savedObject.searchSource!.setField('index', indexPattern);
|
||||
return Bluebird.resolve(indexPattern);
|
||||
return Promise.resolve(indexPattern);
|
||||
});
|
||||
expect(!!savedObject.searchSource!.getField('index')).toBe(false);
|
||||
|
||||
|
|
|
@ -7,7 +7,6 @@
|
|||
*/
|
||||
|
||||
import _ from 'lodash';
|
||||
import Bluebird from 'bluebird';
|
||||
import { i18n } from '@kbn/i18n';
|
||||
import moment from 'moment';
|
||||
|
||||
|
@ -42,7 +41,7 @@ export default function chainRunner(tlConfig) {
|
|||
|
||||
function resolveArgument(item) {
|
||||
if (Array.isArray(item)) {
|
||||
return Bluebird.all(_.map(item, resolveArgument));
|
||||
return Promise.all(_.map(item, resolveArgument));
|
||||
}
|
||||
|
||||
if (_.isObject(item)) {
|
||||
|
@ -51,7 +50,7 @@ export default function chainRunner(tlConfig) {
|
|||
const itemFunctionDef = tlConfig.getFunction(item.function);
|
||||
if (itemFunctionDef.cacheKey && queryCache[itemFunctionDef.cacheKey(item)]) {
|
||||
stats.queryCount++;
|
||||
return Bluebird.resolve(_.cloneDeep(queryCache[itemFunctionDef.cacheKey(item)]));
|
||||
return Promise.resolve(_.cloneDeep(queryCache[itemFunctionDef.cacheKey(item)]));
|
||||
}
|
||||
return invoke(item.function, item.arguments);
|
||||
}
|
||||
|
@ -94,7 +93,7 @@ export default function chainRunner(tlConfig) {
|
|||
|
||||
args = _.map(args, resolveArgument);
|
||||
|
||||
return Bluebird.all(args).then(function (args) {
|
||||
return Promise.all(args).then(function (args) {
|
||||
args.byName = indexArguments(functionDef, args);
|
||||
return functionDef.fn(args, tlConfig);
|
||||
});
|
||||
|
@ -128,7 +127,7 @@ export default function chainRunner(tlConfig) {
|
|||
return args;
|
||||
});
|
||||
});
|
||||
return Bluebird.all(seriesList).then(function (args) {
|
||||
return Promise.all(seriesList).then(function (args) {
|
||||
const list = _.chain(args).map('list').flatten().value();
|
||||
const seriesList = _.merge.apply(this, _.flatten([{}, args]));
|
||||
seriesList.list = list;
|
||||
|
@ -158,22 +157,22 @@ export default function chainRunner(tlConfig) {
|
|||
})
|
||||
.value();
|
||||
|
||||
return Bluebird.settle(promises).then(function (resolvedDatasources) {
|
||||
return Promise.allSettled(promises).then(function (resolvedDatasources) {
|
||||
stats.queryTime = new Date().getTime();
|
||||
|
||||
_.each(queries, function (query, i) {
|
||||
const functionDef = tlConfig.getFunction(query.function);
|
||||
const resolvedDatasource = resolvedDatasources[i];
|
||||
|
||||
if (resolvedDatasource.isRejected()) {
|
||||
if (resolvedDatasource.reason().isBoom) {
|
||||
throw resolvedDatasource.reason();
|
||||
if (resolvedDatasource.status === 'rejected') {
|
||||
if (resolvedDatasource.reason.isBoom) {
|
||||
throw resolvedDatasource.reason;
|
||||
} else {
|
||||
throwWithCell(query.cell, resolvedDatasource.reason());
|
||||
throwWithCell(query.cell, resolvedDatasource.reason);
|
||||
}
|
||||
}
|
||||
|
||||
queryCache[functionDef.cacheKey(query)] = resolvedDatasource.value();
|
||||
queryCache[functionDef.cacheKey(query)] = resolvedDatasource.value;
|
||||
});
|
||||
|
||||
stats.cacheCount = _.keys(queryCache).length;
|
||||
|
|
|
@ -6,7 +6,6 @@
|
|||
* Side Public License, v 1.
|
||||
*/
|
||||
|
||||
import Bluebird from 'bluebird';
|
||||
import _ from 'lodash';
|
||||
|
||||
/* @param {Array} args
|
||||
|
@ -18,7 +17,7 @@ import _ from 'lodash';
|
|||
|
||||
export default function alter(args, fn) {
|
||||
// In theory none of the args should ever be promises. This is probably a waste.
|
||||
return Bluebird.all(args)
|
||||
return Promise.all(args)
|
||||
.then(function (args) {
|
||||
const seriesList = args.shift();
|
||||
|
||||
|
|
|
@ -8,7 +8,6 @@
|
|||
|
||||
import { IRouter, Logger, CoreSetup } from 'kibana/server';
|
||||
import { schema } from '@kbn/config-schema';
|
||||
import Bluebird from 'bluebird';
|
||||
import _ from 'lodash';
|
||||
// @ts-ignore
|
||||
import chainRunnerFn from '../handlers/chain_runner.js';
|
||||
|
@ -96,7 +95,7 @@ export function runRoute(
|
|||
});
|
||||
try {
|
||||
const chainRunner = chainRunnerFn(tlConfig);
|
||||
const sheet = await Bluebird.all(chainRunner.processRequest(request.body));
|
||||
const sheet = await Promise.all(await chainRunner.processRequest(request.body));
|
||||
return response.ok({
|
||||
body: {
|
||||
sheet,
|
||||
|
|
|
@ -10,7 +10,6 @@ import { i18n } from '@kbn/i18n';
|
|||
import _ from 'lodash';
|
||||
import fetch from 'node-fetch';
|
||||
import moment from 'moment';
|
||||
fetch.Promise = require('bluebird');
|
||||
|
||||
import Datasource from '../lib/classes/datasource';
|
||||
|
||||
|
|
|
@ -9,7 +9,6 @@
|
|||
import { i18n } from '@kbn/i18n';
|
||||
import _ from 'lodash';
|
||||
import Datasource from '../lib/classes/datasource';
|
||||
import Bluebird from 'bluebird';
|
||||
|
||||
export default new Datasource('static', {
|
||||
aliases: ['value'],
|
||||
|
@ -51,7 +50,7 @@ export default new Datasource('static', {
|
|||
});
|
||||
}
|
||||
|
||||
return Bluebird.resolve({
|
||||
return Promise.resolve({
|
||||
type: 'seriesList',
|
||||
list: [
|
||||
{
|
||||
|
|
|
@ -9,7 +9,6 @@
|
|||
import { i18n } from '@kbn/i18n';
|
||||
import _ from 'lodash';
|
||||
import worldbank from './worldbank.js';
|
||||
import Bluebird from 'bluebird';
|
||||
import Datasource from '../lib/classes/datasource';
|
||||
|
||||
export default new Datasource('worldbank_indicators', {
|
||||
|
@ -61,9 +60,11 @@ export default new Datasource('worldbank_indicators', {
|
|||
return worldbank.timelionFn(wbArgs, tlConfig);
|
||||
});
|
||||
|
||||
return Bluebird.map(seriesLists, function (seriesList) {
|
||||
return seriesList.list[0];
|
||||
}).then(function (list) {
|
||||
return Promise.all(
|
||||
seriesLists.map(function (seriesList) {
|
||||
return seriesList.list[0];
|
||||
})
|
||||
).then(function (list) {
|
||||
return {
|
||||
type: 'seriesList',
|
||||
list: list,
|
||||
|
|
|
@ -7,7 +7,6 @@
|
|||
*/
|
||||
|
||||
import fn from './yaxis';
|
||||
import Bluebird from 'bluebird';
|
||||
const expect = require('chai').expect;
|
||||
import invoke from './helpers/invoke_series_fn.js';
|
||||
|
||||
|
@ -25,7 +24,7 @@ describe('yaxis.js', () => {
|
|||
});
|
||||
|
||||
it('puts odd numbers of the left, even on the right, by default', () => {
|
||||
return Bluebird.all([
|
||||
return Promise.all([
|
||||
invoke(fn, [seriesList, 1]).then((r) => {
|
||||
expect(r.output.list[0]._global.yaxes[0].position).to.equal('left');
|
||||
}),
|
||||
|
@ -39,7 +38,7 @@ describe('yaxis.js', () => {
|
|||
});
|
||||
|
||||
it('it lets you override default positions', () => {
|
||||
return Bluebird.all([
|
||||
return Promise.all([
|
||||
invoke(fn, [seriesList, 1, null, null, 'right']).then((r) => {
|
||||
expect(r.output.list[0]._global.yaxes[0].position).to.equal('right');
|
||||
}),
|
||||
|
@ -50,7 +49,7 @@ describe('yaxis.js', () => {
|
|||
});
|
||||
|
||||
it('sets the minimum (default: no min)', () => {
|
||||
return Bluebird.all([
|
||||
return Promise.all([
|
||||
invoke(fn, [seriesList, 1, null]).then((r) => {
|
||||
expect(r.output.list[0]._global.yaxes[0].min).to.equal(null);
|
||||
}),
|
||||
|
@ -61,7 +60,7 @@ describe('yaxis.js', () => {
|
|||
});
|
||||
|
||||
it('sets the max (default: no max)', () => {
|
||||
return Bluebird.all([
|
||||
return Promise.all([
|
||||
invoke(fn, [seriesList, 1, null]).then((r) => {
|
||||
expect(r.output.list[0]._global.yaxes[0].max).to.equal(undefined);
|
||||
}),
|
||||
|
@ -72,7 +71,7 @@ describe('yaxis.js', () => {
|
|||
});
|
||||
|
||||
it('sets the units (default: no unit', () => {
|
||||
return Bluebird.all([
|
||||
return Promise.all([
|
||||
invoke(fn, [seriesList, 1, null, null, null, null, null, null]).then((r) => {
|
||||
expect(r.output.list[0]._global.yaxes[0].units).to.equal(undefined);
|
||||
}),
|
||||
|
|
|
@ -7,7 +7,6 @@
|
|||
*/
|
||||
|
||||
import expect from '@kbn/expect';
|
||||
import Bluebird from 'bluebird';
|
||||
import { get } from 'lodash';
|
||||
import { FtrProviderContext } from '../../ftr_provider_context';
|
||||
|
||||
|
@ -89,7 +88,7 @@ export default function ({ getService }: FtrProviderContext) {
|
|||
});
|
||||
|
||||
it('should only accept literal boolean values for the opt_in POST body param', function () {
|
||||
return Bluebird.all([
|
||||
return Promise.all([
|
||||
supertest
|
||||
.post('/api/kibana/kql_opt_in_stats')
|
||||
.set('content-type', 'application/json')
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
* Side Public License, v 1.
|
||||
*/
|
||||
|
||||
import { delay } from 'bluebird';
|
||||
import { setTimeout as setTimeoutAsync } from 'timers/promises';
|
||||
import expect from '@kbn/expect';
|
||||
// @ts-ignore
|
||||
import fetch from 'node-fetch';
|
||||
|
@ -214,7 +214,7 @@ export class CommonPageObject extends FtrService {
|
|||
|
||||
async sleep(sleepMilliseconds: number) {
|
||||
this.log.debug(`... sleep(${sleepMilliseconds}) start`);
|
||||
await delay(sleepMilliseconds);
|
||||
await setTimeoutAsync(sleepMilliseconds);
|
||||
this.log.debug(`... sleep(${sleepMilliseconds}) end`);
|
||||
}
|
||||
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
* Side Public License, v 1.
|
||||
*/
|
||||
|
||||
import { delay } from 'bluebird';
|
||||
import { setTimeout as setTimeoutAsync } from 'timers/promises';
|
||||
import { FtrService } from '../ftr_provider_context';
|
||||
|
||||
export class LoginPageObject extends FtrService {
|
||||
|
@ -40,7 +40,7 @@ export class LoginPageObject extends FtrService {
|
|||
|
||||
async sleep(sleepMilliseconds: number) {
|
||||
this.log.debug(`... sleep(${sleepMilliseconds}) start`);
|
||||
await delay(sleepMilliseconds);
|
||||
await setTimeoutAsync(sleepMilliseconds);
|
||||
this.log.debug(`... sleep(${sleepMilliseconds}) end`);
|
||||
}
|
||||
|
||||
|
|
|
@ -7,7 +7,6 @@
|
|||
*/
|
||||
|
||||
import { keyBy } from 'lodash';
|
||||
import { map as mapAsync } from 'bluebird';
|
||||
import { FtrService } from '../../ftr_provider_context';
|
||||
|
||||
export class SavedObjectsPageObject extends FtrService {
|
||||
|
@ -201,51 +200,55 @@ export class SavedObjectsPageObject extends FtrService {
|
|||
|
||||
async getElementsInTable() {
|
||||
const rows = await this.testSubjects.findAll('~savedObjectsTableRow');
|
||||
return mapAsync(rows, async (row) => {
|
||||
const checkbox = await row.findByCssSelector('[data-test-subj*="checkboxSelectRow"]');
|
||||
// return the object type aria-label="index patterns"
|
||||
const objectType = await row.findByTestSubject('objectType');
|
||||
const titleElement = await row.findByTestSubject('savedObjectsTableRowTitle');
|
||||
// not all rows have inspect button - Advanced Settings objects don't
|
||||
// Advanced Settings has 2 actions,
|
||||
// data-test-subj="savedObjectsTableAction-relationships"
|
||||
// data-test-subj="savedObjectsTableAction-copy_saved_objects_to_space"
|
||||
// Some other objects have the ...
|
||||
// data-test-subj="euiCollapsedItemActionsButton"
|
||||
// Maybe some objects still have the inspect element visible?
|
||||
// !!! Also note that since we don't have spaces on OSS, the actions for the same object can be different depending on OSS or not
|
||||
let menuElement = null;
|
||||
let inspectElement = null;
|
||||
let relationshipsElement = null;
|
||||
let copySaveObjectsElement = null;
|
||||
const actions = await row.findByClassName('euiTableRowCell--hasActions');
|
||||
// getting the innerHTML and checking if it 'includes' a string is faster than a timeout looking for each element
|
||||
const actionsHTML = await actions.getAttribute('innerHTML');
|
||||
if (actionsHTML.includes('euiCollapsedItemActionsButton')) {
|
||||
menuElement = await row.findByTestSubject('euiCollapsedItemActionsButton');
|
||||
}
|
||||
if (actionsHTML.includes('savedObjectsTableAction-inspect')) {
|
||||
inspectElement = await row.findByTestSubject('savedObjectsTableAction-inspect');
|
||||
}
|
||||
if (actionsHTML.includes('savedObjectsTableAction-relationships')) {
|
||||
relationshipsElement = await row.findByTestSubject('savedObjectsTableAction-relationships');
|
||||
}
|
||||
if (actionsHTML.includes('savedObjectsTableAction-copy_saved_objects_to_space')) {
|
||||
copySaveObjectsElement = await row.findByTestSubject(
|
||||
'savedObjectsTableAction-copy_saved_objects_to_space'
|
||||
);
|
||||
}
|
||||
return {
|
||||
checkbox,
|
||||
objectType: await objectType.getAttribute('aria-label'),
|
||||
titleElement,
|
||||
title: await titleElement.getVisibleText(),
|
||||
menuElement,
|
||||
inspectElement,
|
||||
relationshipsElement,
|
||||
copySaveObjectsElement,
|
||||
};
|
||||
});
|
||||
return await Promise.all(
|
||||
rows.map(async (row) => {
|
||||
const checkbox = await row.findByCssSelector('[data-test-subj*="checkboxSelectRow"]');
|
||||
// return the object type aria-label="index patterns"
|
||||
const objectType = await row.findByTestSubject('objectType');
|
||||
const titleElement = await row.findByTestSubject('savedObjectsTableRowTitle');
|
||||
// not all rows have inspect button - Advanced Settings objects don't
|
||||
// Advanced Settings has 2 actions,
|
||||
// data-test-subj="savedObjectsTableAction-relationships"
|
||||
// data-test-subj="savedObjectsTableAction-copy_saved_objects_to_space"
|
||||
// Some other objects have the ...
|
||||
// data-test-subj="euiCollapsedItemActionsButton"
|
||||
// Maybe some objects still have the inspect element visible?
|
||||
// !!! Also note that since we don't have spaces on OSS, the actions for the same object can be different depending on OSS or not
|
||||
let menuElement = null;
|
||||
let inspectElement = null;
|
||||
let relationshipsElement = null;
|
||||
let copySaveObjectsElement = null;
|
||||
const actions = await row.findByClassName('euiTableRowCell--hasActions');
|
||||
// getting the innerHTML and checking if it 'includes' a string is faster than a timeout looking for each element
|
||||
const actionsHTML = await actions.getAttribute('innerHTML');
|
||||
if (actionsHTML.includes('euiCollapsedItemActionsButton')) {
|
||||
menuElement = await row.findByTestSubject('euiCollapsedItemActionsButton');
|
||||
}
|
||||
if (actionsHTML.includes('savedObjectsTableAction-inspect')) {
|
||||
inspectElement = await row.findByTestSubject('savedObjectsTableAction-inspect');
|
||||
}
|
||||
if (actionsHTML.includes('savedObjectsTableAction-relationships')) {
|
||||
relationshipsElement = await row.findByTestSubject(
|
||||
'savedObjectsTableAction-relationships'
|
||||
);
|
||||
}
|
||||
if (actionsHTML.includes('savedObjectsTableAction-copy_saved_objects_to_space')) {
|
||||
copySaveObjectsElement = await row.findByTestSubject(
|
||||
'savedObjectsTableAction-copy_saved_objects_to_space'
|
||||
);
|
||||
}
|
||||
return {
|
||||
checkbox,
|
||||
objectType: await objectType.getAttribute('aria-label'),
|
||||
titleElement,
|
||||
title: await titleElement.getVisibleText(),
|
||||
menuElement,
|
||||
inspectElement,
|
||||
relationshipsElement,
|
||||
copySaveObjectsElement,
|
||||
};
|
||||
})
|
||||
);
|
||||
}
|
||||
|
||||
async getRowTitles() {
|
||||
|
@ -259,35 +262,39 @@ export class SavedObjectsPageObject extends FtrService {
|
|||
|
||||
async getRelationshipFlyout() {
|
||||
const rows = await this.testSubjects.findAll('relationshipsTableRow');
|
||||
return mapAsync(rows, async (row) => {
|
||||
const objectType = await row.findByTestSubject('relationshipsObjectType');
|
||||
const relationship = await row.findByTestSubject('directRelationship');
|
||||
const titleElement = await row.findByTestSubject('relationshipsTitle');
|
||||
const inspectElement = await row.findByTestSubject('relationshipsTableAction-inspect');
|
||||
return {
|
||||
objectType: await objectType.getAttribute('aria-label'),
|
||||
relationship: await relationship.getVisibleText(),
|
||||
titleElement,
|
||||
title: await titleElement.getVisibleText(),
|
||||
inspectElement,
|
||||
};
|
||||
});
|
||||
return await Promise.all(
|
||||
rows.map(async (row) => {
|
||||
const objectType = await row.findByTestSubject('relationshipsObjectType');
|
||||
const relationship = await row.findByTestSubject('directRelationship');
|
||||
const titleElement = await row.findByTestSubject('relationshipsTitle');
|
||||
const inspectElement = await row.findByTestSubject('relationshipsTableAction-inspect');
|
||||
return {
|
||||
objectType: await objectType.getAttribute('aria-label'),
|
||||
relationship: await relationship.getVisibleText(),
|
||||
titleElement,
|
||||
title: await titleElement.getVisibleText(),
|
||||
inspectElement,
|
||||
};
|
||||
})
|
||||
);
|
||||
}
|
||||
|
||||
async getInvalidRelations() {
|
||||
const rows = await this.testSubjects.findAll('invalidRelationshipsTableRow');
|
||||
return mapAsync(rows, async (row) => {
|
||||
const objectType = await row.findByTestSubject('relationshipsObjectType');
|
||||
const objectId = await row.findByTestSubject('relationshipsObjectId');
|
||||
const relationship = await row.findByTestSubject('directRelationship');
|
||||
const error = await row.findByTestSubject('relationshipsError');
|
||||
return {
|
||||
type: await objectType.getVisibleText(),
|
||||
id: await objectId.getVisibleText(),
|
||||
relationship: await relationship.getVisibleText(),
|
||||
error: await error.getVisibleText(),
|
||||
};
|
||||
});
|
||||
return await Promise.all(
|
||||
rows.map(async (row) => {
|
||||
const objectType = await row.findByTestSubject('relationshipsObjectType');
|
||||
const objectId = await row.findByTestSubject('relationshipsObjectId');
|
||||
const relationship = await row.findByTestSubject('directRelationship');
|
||||
const error = await row.findByTestSubject('relationshipsError');
|
||||
return {
|
||||
type: await objectType.getVisibleText(),
|
||||
id: await objectId.getVisibleText(),
|
||||
relationship: await relationship.getVisibleText(),
|
||||
error: await error.getVisibleText(),
|
||||
};
|
||||
})
|
||||
);
|
||||
}
|
||||
|
||||
async getTableSummary() {
|
||||
|
|
|
@ -6,7 +6,6 @@
|
|||
* Side Public License, v 1.
|
||||
*/
|
||||
|
||||
import { map as mapAsync } from 'bluebird';
|
||||
import expect from '@kbn/expect';
|
||||
import { FtrService } from '../ftr_provider_context';
|
||||
|
||||
|
@ -234,23 +233,29 @@ export class SettingsPageObject extends FtrService {
|
|||
|
||||
async getFieldNames() {
|
||||
const fieldNameCells = await this.testSubjects.findAll('editIndexPattern > indexedFieldName');
|
||||
return await mapAsync(fieldNameCells, async (cell) => {
|
||||
return (await cell.getVisibleText()).trim();
|
||||
});
|
||||
return await Promise.all(
|
||||
fieldNameCells.map(async (cell) => {
|
||||
return (await cell.getVisibleText()).trim();
|
||||
})
|
||||
);
|
||||
}
|
||||
|
||||
async getFieldTypes() {
|
||||
const fieldNameCells = await this.testSubjects.findAll('editIndexPattern > indexedFieldType');
|
||||
return await mapAsync(fieldNameCells, async (cell) => {
|
||||
return (await cell.getVisibleText()).trim();
|
||||
});
|
||||
return await Promise.all(
|
||||
fieldNameCells.map(async (cell) => {
|
||||
return (await cell.getVisibleText()).trim();
|
||||
})
|
||||
);
|
||||
}
|
||||
|
||||
async getScriptedFieldLangs() {
|
||||
const fieldNameCells = await this.testSubjects.findAll('editIndexPattern > scriptedFieldLang');
|
||||
return await mapAsync(fieldNameCells, async (cell) => {
|
||||
return (await cell.getVisibleText()).trim();
|
||||
});
|
||||
return await Promise.all(
|
||||
fieldNameCells.map(async (cell) => {
|
||||
return (await cell.getVisibleText()).trim();
|
||||
})
|
||||
);
|
||||
}
|
||||
|
||||
async setFieldTypeFilter(type: string) {
|
||||
|
@ -327,9 +332,11 @@ export class SettingsPageObject extends FtrService {
|
|||
|
||||
async getAllIndexPatternNames() {
|
||||
const indexPatterns = await this.getIndexPatternList();
|
||||
return await mapAsync(indexPatterns, async (index) => {
|
||||
return await index.getVisibleText();
|
||||
});
|
||||
return await Promise.all(
|
||||
indexPatterns.map(async (index) => {
|
||||
return await index.getVisibleText();
|
||||
})
|
||||
);
|
||||
}
|
||||
|
||||
async isIndexPatternListEmpty() {
|
||||
|
@ -565,9 +572,11 @@ export class SettingsPageObject extends FtrService {
|
|||
const table = await this.find.byClassName('euiTable');
|
||||
await this.retry.waitFor('field filter to be added', async () => {
|
||||
const tableCells = await table.findAllByCssSelector('td');
|
||||
const fieldNames = await mapAsync(tableCells, async (cell) => {
|
||||
return (await cell.getVisibleText()).trim();
|
||||
});
|
||||
const fieldNames = await Promise.all(
|
||||
tableCells.map(async (cell) => {
|
||||
return (await cell.getVisibleText()).trim();
|
||||
})
|
||||
);
|
||||
return fieldNames.includes(name);
|
||||
});
|
||||
}
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
* Side Public License, v 1.
|
||||
*/
|
||||
|
||||
import { delay } from 'bluebird';
|
||||
import { setTimeout as setTimeoutAsync } from 'timers/promises';
|
||||
import { cloneDeepWith } from 'lodash';
|
||||
import { Key, Origin, WebDriver } from 'selenium-webdriver';
|
||||
// @ts-ignore internal modules are not typed
|
||||
|
@ -303,7 +303,7 @@ class BrowserService extends FtrService {
|
|||
to
|
||||
);
|
||||
// wait for 150ms to make sure the script has run
|
||||
await delay(150);
|
||||
await setTimeoutAsync(150);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -7,7 +7,6 @@
|
|||
*/
|
||||
|
||||
import testSubjSelector from '@kbn/test-subj-selector';
|
||||
import { map as mapAsync } from 'bluebird';
|
||||
import { WebElementWrapper } from '../lib/web_element_wrapper';
|
||||
import { FtrService } from '../../ftr_provider_context';
|
||||
|
||||
|
@ -271,11 +270,11 @@ export class TestSubjects extends FtrService {
|
|||
|
||||
private async _mapAll<T>(
|
||||
selectorAll: string,
|
||||
mapFn: (element: WebElementWrapper, index?: number, arrayLength?: number) => Promise<T>
|
||||
mapFn: (element: WebElementWrapper, index: number, array: WebElementWrapper[]) => Promise<T>
|
||||
): Promise<T[]> {
|
||||
return await this.retry.try(async () => {
|
||||
const elements = await this.findAll(selectorAll);
|
||||
return await mapAsync(elements, mapFn);
|
||||
return await Promise.all(elements.map(mapFn));
|
||||
});
|
||||
}
|
||||
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
* Side Public License, v 1.
|
||||
*/
|
||||
|
||||
import { delay } from 'bluebird';
|
||||
import { setTimeout as setTimeoutAsync } from 'timers/promises';
|
||||
import { WebElement, WebDriver, By, Key } from 'selenium-webdriver';
|
||||
import { PNG } from 'pngjs';
|
||||
import cheerio from 'cheerio';
|
||||
|
@ -121,7 +121,7 @@ export class WebElementWrapper {
|
|||
`finding element '${this.locator.toString()}' again, ${attemptsRemaining - 1} attempts left`
|
||||
);
|
||||
|
||||
await delay(200);
|
||||
await setTimeoutAsync(200);
|
||||
this._webElement = await this.driver.findElement(this.locator);
|
||||
return await this.retryCall(fn, attemptsRemaining - 1);
|
||||
}
|
||||
|
@ -240,7 +240,7 @@ export class WebElementWrapper {
|
|||
const value = await this.getAttribute('value');
|
||||
for (let i = 0; i <= value.length; i++) {
|
||||
await this.pressKeys(this.Keys.BACK_SPACE);
|
||||
await delay(100);
|
||||
await setTimeoutAsync(100);
|
||||
}
|
||||
} else {
|
||||
if (this.isChromium) {
|
||||
|
@ -279,7 +279,7 @@ export class WebElementWrapper {
|
|||
for (const char of value) {
|
||||
await this.retryCall(async function type(wrapper) {
|
||||
await wrapper._webElement.sendKeys(char);
|
||||
await delay(100);
|
||||
await setTimeoutAsync(100);
|
||||
});
|
||||
}
|
||||
} else {
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
* Side Public License, v 1.
|
||||
*/
|
||||
|
||||
import { delay } from 'bluebird';
|
||||
import { setTimeout as setTimeoutAsync } from 'timers/promises';
|
||||
|
||||
import expect from '@kbn/expect';
|
||||
|
||||
|
@ -19,7 +19,7 @@ export async function hasKibanaBooted(context: FtrProviderContext) {
|
|||
// Run 30 consecutive requests with 1.5s delay to check if Kibana is up and running.
|
||||
let kibanaHasBooted = false;
|
||||
for (const counter of [...Array(30).keys()]) {
|
||||
await delay(1500);
|
||||
await setTimeoutAsync(1500);
|
||||
|
||||
try {
|
||||
expect((await supertest.get('/api/status').expect(200)).body).to.have.keys([
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
|
||||
import type { TypeOf } from '@kbn/config-schema';
|
||||
import type { RequestHandler, ResponseHeaders } from 'src/core/server';
|
||||
import bluebird from 'bluebird';
|
||||
import pMap from 'p-map';
|
||||
import { safeDump } from 'js-yaml';
|
||||
|
||||
import { fullAgentPolicyToYaml } from '../../../common/services';
|
||||
|
@ -57,7 +57,7 @@ export const getAgentPoliciesHandler: RequestHandler<
|
|||
perPage,
|
||||
};
|
||||
|
||||
await bluebird.map(
|
||||
await pMap(
|
||||
items,
|
||||
(agentPolicy: GetAgentPoliciesResponseItem) =>
|
||||
getAgentsByKuery(esClient, {
|
||||
|
|
|
@ -6,7 +6,6 @@
|
|||
*/
|
||||
|
||||
import moment from 'moment';
|
||||
import Bluebird from 'bluebird';
|
||||
import { checkParam } from '../error_missing_required';
|
||||
import { getSeries } from './get_series';
|
||||
import { calculateTimeseriesInterval } from '../calculate_timeseries_interval';
|
||||
|
@ -40,25 +39,29 @@ export async function getMetrics(
|
|||
min = max - numOfBuckets * bucketSize * 1000;
|
||||
}
|
||||
|
||||
return Bluebird.map(metricSet, (metric: Metric) => {
|
||||
// metric names match the literal metric name, but they can be supplied in groups or individually
|
||||
let metricNames;
|
||||
return Promise.all(
|
||||
metricSet.map((metric: Metric) => {
|
||||
// metric names match the literal metric name, but they can be supplied in groups or individually
|
||||
let metricNames;
|
||||
|
||||
if (typeof metric !== 'string') {
|
||||
metricNames = metric.keys;
|
||||
} else {
|
||||
metricNames = [metric];
|
||||
}
|
||||
if (typeof metric !== 'string') {
|
||||
metricNames = typeof metric.keys === 'string' ? [metric.keys] : metric.keys;
|
||||
} else {
|
||||
metricNames = [metric];
|
||||
}
|
||||
|
||||
return Bluebird.map(metricNames, (metricName) => {
|
||||
return getSeries(req, indexPattern, metricName, metricOptions, filters, groupBy, {
|
||||
min,
|
||||
max,
|
||||
bucketSize,
|
||||
timezone,
|
||||
});
|
||||
});
|
||||
}).then((rows) => {
|
||||
return Promise.all(
|
||||
metricNames.map((metricName) => {
|
||||
return getSeries(req, indexPattern, metricName, metricOptions, filters, groupBy, {
|
||||
min,
|
||||
max,
|
||||
bucketSize,
|
||||
timezone,
|
||||
});
|
||||
})
|
||||
);
|
||||
})
|
||||
).then((rows) => {
|
||||
const data: Record<string, any> = {};
|
||||
metricSet.forEach((key, index) => {
|
||||
// keyName must match the value stored in the html template
|
||||
|
|
|
@ -5,7 +5,6 @@
|
|||
* 2.0.
|
||||
*/
|
||||
|
||||
import Bluebird from 'bluebird';
|
||||
import { chain, find } from 'lodash';
|
||||
import { LegacyRequest, Cluster, Bucket } from '../../types';
|
||||
import { checkParam } from '../error_missing_required';
|
||||
|
@ -36,182 +35,184 @@ export function getKibanasForClusters(
|
|||
const start = req.payload.timeRange.min;
|
||||
const end = req.payload.timeRange.max;
|
||||
|
||||
return Bluebird.map(clusters, (cluster) => {
|
||||
const clusterUuid = cluster.elasticsearch?.cluster?.id ?? cluster.cluster_uuid;
|
||||
const metric = KibanaClusterMetric.getMetricFields();
|
||||
const params = {
|
||||
index: kbnIndexPattern,
|
||||
size: 0,
|
||||
ignore_unavailable: true,
|
||||
body: {
|
||||
query: createQuery({
|
||||
types: ['stats', 'kibana_stats'],
|
||||
start,
|
||||
end,
|
||||
clusterUuid,
|
||||
metric,
|
||||
}),
|
||||
aggs: {
|
||||
kibana_uuids: {
|
||||
terms: {
|
||||
field: 'kibana_stats.kibana.uuid',
|
||||
size: config.get('monitoring.ui.max_bucket_size'),
|
||||
},
|
||||
aggs: {
|
||||
latest_report: {
|
||||
terms: {
|
||||
field: 'kibana_stats.timestamp',
|
||||
size: 1,
|
||||
order: {
|
||||
_key: 'desc',
|
||||
},
|
||||
},
|
||||
aggs: {
|
||||
response_time_max: {
|
||||
max: {
|
||||
field: 'kibana_stats.response_times.max',
|
||||
return Promise.all(
|
||||
clusters.map((cluster) => {
|
||||
const clusterUuid = cluster.elasticsearch?.cluster?.id ?? cluster.cluster_uuid;
|
||||
const metric = KibanaClusterMetric.getMetricFields();
|
||||
const params = {
|
||||
index: kbnIndexPattern,
|
||||
size: 0,
|
||||
ignore_unavailable: true,
|
||||
body: {
|
||||
query: createQuery({
|
||||
types: ['stats', 'kibana_stats'],
|
||||
start,
|
||||
end,
|
||||
clusterUuid,
|
||||
metric,
|
||||
}),
|
||||
aggs: {
|
||||
kibana_uuids: {
|
||||
terms: {
|
||||
field: 'kibana_stats.kibana.uuid',
|
||||
size: config.get('monitoring.ui.max_bucket_size'),
|
||||
},
|
||||
aggs: {
|
||||
latest_report: {
|
||||
terms: {
|
||||
field: 'kibana_stats.timestamp',
|
||||
size: 1,
|
||||
order: {
|
||||
_key: 'desc',
|
||||
},
|
||||
},
|
||||
memory_rss: {
|
||||
max: {
|
||||
field: 'kibana_stats.process.memory.resident_set_size_in_bytes',
|
||||
aggs: {
|
||||
response_time_max: {
|
||||
max: {
|
||||
field: 'kibana_stats.response_times.max',
|
||||
},
|
||||
},
|
||||
},
|
||||
memory_heap_size_limit: {
|
||||
max: {
|
||||
field: 'kibana_stats.process.memory.heap.size_limit',
|
||||
memory_rss: {
|
||||
max: {
|
||||
field: 'kibana_stats.process.memory.resident_set_size_in_bytes',
|
||||
},
|
||||
},
|
||||
},
|
||||
concurrent_connections: {
|
||||
max: {
|
||||
field: 'kibana_stats.concurrent_connections',
|
||||
memory_heap_size_limit: {
|
||||
max: {
|
||||
field: 'kibana_stats.process.memory.heap.size_limit',
|
||||
},
|
||||
},
|
||||
},
|
||||
requests_total: {
|
||||
max: {
|
||||
field: 'kibana_stats.requests.total',
|
||||
concurrent_connections: {
|
||||
max: {
|
||||
field: 'kibana_stats.concurrent_connections',
|
||||
},
|
||||
},
|
||||
requests_total: {
|
||||
max: {
|
||||
field: 'kibana_stats.requests.total',
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
response_time_max_per: {
|
||||
max_bucket: {
|
||||
buckets_path: 'latest_report>response_time_max',
|
||||
response_time_max_per: {
|
||||
max_bucket: {
|
||||
buckets_path: 'latest_report>response_time_max',
|
||||
},
|
||||
},
|
||||
memory_rss_per: {
|
||||
max_bucket: {
|
||||
buckets_path: 'latest_report>memory_rss',
|
||||
},
|
||||
},
|
||||
memory_heap_size_limit_per: {
|
||||
max_bucket: {
|
||||
buckets_path: 'latest_report>memory_heap_size_limit',
|
||||
},
|
||||
},
|
||||
concurrent_connections_per: {
|
||||
max_bucket: {
|
||||
buckets_path: 'latest_report>concurrent_connections',
|
||||
},
|
||||
},
|
||||
requests_total_per: {
|
||||
max_bucket: {
|
||||
buckets_path: 'latest_report>requests_total',
|
||||
},
|
||||
},
|
||||
},
|
||||
memory_rss_per: {
|
||||
max_bucket: {
|
||||
buckets_path: 'latest_report>memory_rss',
|
||||
},
|
||||
response_time_max: {
|
||||
max_bucket: {
|
||||
buckets_path: 'kibana_uuids>response_time_max_per',
|
||||
},
|
||||
},
|
||||
memory_rss: {
|
||||
sum_bucket: {
|
||||
buckets_path: 'kibana_uuids>memory_rss_per',
|
||||
},
|
||||
},
|
||||
memory_heap_size_limit: {
|
||||
sum_bucket: {
|
||||
buckets_path: 'kibana_uuids>memory_heap_size_limit_per',
|
||||
},
|
||||
},
|
||||
concurrent_connections: {
|
||||
sum_bucket: {
|
||||
buckets_path: 'kibana_uuids>concurrent_connections_per',
|
||||
},
|
||||
},
|
||||
requests_total: {
|
||||
sum_bucket: {
|
||||
buckets_path: 'kibana_uuids>requests_total_per',
|
||||
},
|
||||
},
|
||||
status: {
|
||||
terms: {
|
||||
field: 'kibana_stats.kibana.status',
|
||||
order: {
|
||||
max_timestamp: 'desc',
|
||||
},
|
||||
},
|
||||
memory_heap_size_limit_per: {
|
||||
max_bucket: {
|
||||
buckets_path: 'latest_report>memory_heap_size_limit',
|
||||
},
|
||||
},
|
||||
concurrent_connections_per: {
|
||||
max_bucket: {
|
||||
buckets_path: 'latest_report>concurrent_connections',
|
||||
},
|
||||
},
|
||||
requests_total_per: {
|
||||
max_bucket: {
|
||||
buckets_path: 'latest_report>requests_total',
|
||||
aggs: {
|
||||
max_timestamp: {
|
||||
max: {
|
||||
field: 'timestamp',
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
response_time_max: {
|
||||
max_bucket: {
|
||||
buckets_path: 'kibana_uuids>response_time_max_per',
|
||||
},
|
||||
},
|
||||
memory_rss: {
|
||||
sum_bucket: {
|
||||
buckets_path: 'kibana_uuids>memory_rss_per',
|
||||
},
|
||||
},
|
||||
memory_heap_size_limit: {
|
||||
sum_bucket: {
|
||||
buckets_path: 'kibana_uuids>memory_heap_size_limit_per',
|
||||
},
|
||||
},
|
||||
concurrent_connections: {
|
||||
sum_bucket: {
|
||||
buckets_path: 'kibana_uuids>concurrent_connections_per',
|
||||
},
|
||||
},
|
||||
requests_total: {
|
||||
sum_bucket: {
|
||||
buckets_path: 'kibana_uuids>requests_total_per',
|
||||
},
|
||||
},
|
||||
status: {
|
||||
terms: {
|
||||
field: 'kibana_stats.kibana.status',
|
||||
order: {
|
||||
max_timestamp: 'desc',
|
||||
},
|
||||
},
|
||||
aggs: {
|
||||
max_timestamp: {
|
||||
max: {
|
||||
field: 'timestamp',
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
const { callWithRequest } = req.server.plugins.elasticsearch.getCluster('monitoring');
|
||||
return callWithRequest(req, 'search', params).then((result) => {
|
||||
const aggregations = result.aggregations ?? {};
|
||||
const kibanaUuids = aggregations.kibana_uuids?.buckets ?? [];
|
||||
const statusBuckets = aggregations.status?.buckets ?? [];
|
||||
|
||||
// everything is initialized such that it won't impact any rollup
|
||||
let status = null;
|
||||
let requestsTotal = 0;
|
||||
let connections = 0;
|
||||
let responseTime = 0;
|
||||
let memorySize = 0;
|
||||
let memoryLimit = 0;
|
||||
|
||||
// if the cluster has kibana instances at all
|
||||
if (kibanaUuids.length) {
|
||||
// get instance status by finding the latest status bucket
|
||||
const latestTimestamp = chain(statusBuckets)
|
||||
.map((bucket) => bucket.max_timestamp.value)
|
||||
.max()
|
||||
.value();
|
||||
const latestBucket = find(
|
||||
statusBuckets,
|
||||
(bucket) => bucket.max_timestamp.value === latestTimestamp
|
||||
);
|
||||
status = latestBucket.key;
|
||||
|
||||
requestsTotal = aggregations.requests_total?.value;
|
||||
connections = aggregations.concurrent_connections?.value;
|
||||
responseTime = aggregations.response_time_max?.value;
|
||||
memorySize = aggregations.memory_rss?.value;
|
||||
memoryLimit = aggregations.memory_heap_size_limit?.value;
|
||||
}
|
||||
|
||||
return {
|
||||
clusterUuid,
|
||||
stats: {
|
||||
uuids: kibanaUuids.map(({ key }: Bucket) => key),
|
||||
status,
|
||||
requests_total: requestsTotal,
|
||||
concurrent_connections: connections,
|
||||
response_time_max: responseTime,
|
||||
memory_size: memorySize,
|
||||
memory_limit: memoryLimit,
|
||||
count: kibanaUuids.length,
|
||||
},
|
||||
};
|
||||
});
|
||||
});
|
||||
|
||||
const { callWithRequest } = req.server.plugins.elasticsearch.getCluster('monitoring');
|
||||
return callWithRequest(req, 'search', params).then((result) => {
|
||||
const aggregations = result.aggregations ?? {};
|
||||
const kibanaUuids = aggregations.kibana_uuids?.buckets ?? [];
|
||||
const statusBuckets = aggregations.status?.buckets ?? [];
|
||||
|
||||
// everything is initialized such that it won't impact any rollup
|
||||
let status = null;
|
||||
let requestsTotal = 0;
|
||||
let connections = 0;
|
||||
let responseTime = 0;
|
||||
let memorySize = 0;
|
||||
let memoryLimit = 0;
|
||||
|
||||
// if the cluster has kibana instances at all
|
||||
if (kibanaUuids.length) {
|
||||
// get instance status by finding the latest status bucket
|
||||
const latestTimestamp = chain(statusBuckets)
|
||||
.map((bucket) => bucket.max_timestamp.value)
|
||||
.max()
|
||||
.value();
|
||||
const latestBucket = find(
|
||||
statusBuckets,
|
||||
(bucket) => bucket.max_timestamp.value === latestTimestamp
|
||||
);
|
||||
status = latestBucket.key;
|
||||
|
||||
requestsTotal = aggregations.requests_total?.value;
|
||||
connections = aggregations.concurrent_connections?.value;
|
||||
responseTime = aggregations.response_time_max?.value;
|
||||
memorySize = aggregations.memory_rss?.value;
|
||||
memoryLimit = aggregations.memory_heap_size_limit?.value;
|
||||
}
|
||||
|
||||
return {
|
||||
clusterUuid,
|
||||
stats: {
|
||||
uuids: kibanaUuids.map(({ key }: Bucket) => key),
|
||||
status,
|
||||
requests_total: requestsTotal,
|
||||
concurrent_connections: connections,
|
||||
response_time_max: responseTime,
|
||||
memory_size: memorySize,
|
||||
memory_limit: memoryLimit,
|
||||
count: kibanaUuids.length,
|
||||
},
|
||||
};
|
||||
});
|
||||
})
|
||||
);
|
||||
}
|
||||
|
|
|
@ -5,7 +5,6 @@
|
|||
* 2.0.
|
||||
*/
|
||||
|
||||
import Bluebird from 'bluebird';
|
||||
import { get } from 'lodash';
|
||||
import { LegacyRequest, Cluster, Bucket } from '../../types';
|
||||
import { LOGSTASH } from '../../../common/constants';
|
||||
|
@ -48,208 +47,210 @@ export function getLogstashForClusters(
|
|||
const end = req.payload.timeRange.max;
|
||||
const config = req.server.config();
|
||||
|
||||
return Bluebird.map(clusters, (cluster) => {
|
||||
const clusterUuid = get(cluster, 'elasticsearch.cluster.id', cluster.cluster_uuid);
|
||||
const params = {
|
||||
index: lsIndexPattern,
|
||||
size: 0,
|
||||
ignore_unavailable: true,
|
||||
body: {
|
||||
query: createQuery({
|
||||
types: ['stats', 'logstash_stats'],
|
||||
start,
|
||||
end,
|
||||
clusterUuid,
|
||||
metric: LogstashClusterMetric.getMetricFields(),
|
||||
}),
|
||||
aggs: {
|
||||
logstash_uuids: {
|
||||
terms: {
|
||||
field: 'logstash_stats.logstash.uuid',
|
||||
size: config.get('monitoring.ui.max_bucket_size'),
|
||||
},
|
||||
aggs: {
|
||||
latest_report: {
|
||||
terms: {
|
||||
field: 'logstash_stats.timestamp',
|
||||
size: 1,
|
||||
order: {
|
||||
_key: 'desc',
|
||||
},
|
||||
},
|
||||
aggs: {
|
||||
memory_used: {
|
||||
max: {
|
||||
field: 'logstash_stats.jvm.mem.heap_used_in_bytes',
|
||||
return Promise.all(
|
||||
clusters.map((cluster) => {
|
||||
const clusterUuid = get(cluster, 'elasticsearch.cluster.id', cluster.cluster_uuid);
|
||||
const params = {
|
||||
index: lsIndexPattern,
|
||||
size: 0,
|
||||
ignore_unavailable: true,
|
||||
body: {
|
||||
query: createQuery({
|
||||
types: ['stats', 'logstash_stats'],
|
||||
start,
|
||||
end,
|
||||
clusterUuid,
|
||||
metric: LogstashClusterMetric.getMetricFields(),
|
||||
}),
|
||||
aggs: {
|
||||
logstash_uuids: {
|
||||
terms: {
|
||||
field: 'logstash_stats.logstash.uuid',
|
||||
size: config.get('monitoring.ui.max_bucket_size'),
|
||||
},
|
||||
aggs: {
|
||||
latest_report: {
|
||||
terms: {
|
||||
field: 'logstash_stats.timestamp',
|
||||
size: 1,
|
||||
order: {
|
||||
_key: 'desc',
|
||||
},
|
||||
},
|
||||
memory: {
|
||||
max: {
|
||||
field: 'logstash_stats.jvm.mem.heap_max_in_bytes',
|
||||
aggs: {
|
||||
memory_used: {
|
||||
max: {
|
||||
field: 'logstash_stats.jvm.mem.heap_used_in_bytes',
|
||||
},
|
||||
},
|
||||
},
|
||||
events_in_total: {
|
||||
max: {
|
||||
field: 'logstash_stats.events.in',
|
||||
memory: {
|
||||
max: {
|
||||
field: 'logstash_stats.jvm.mem.heap_max_in_bytes',
|
||||
},
|
||||
},
|
||||
},
|
||||
events_out_total: {
|
||||
max: {
|
||||
field: 'logstash_stats.events.out',
|
||||
events_in_total: {
|
||||
max: {
|
||||
field: 'logstash_stats.events.in',
|
||||
},
|
||||
},
|
||||
events_out_total: {
|
||||
max: {
|
||||
field: 'logstash_stats.events.out',
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
memory_used_per_node: {
|
||||
max_bucket: {
|
||||
buckets_path: 'latest_report>memory_used',
|
||||
memory_used_per_node: {
|
||||
max_bucket: {
|
||||
buckets_path: 'latest_report>memory_used',
|
||||
},
|
||||
},
|
||||
},
|
||||
memory_per_node: {
|
||||
max_bucket: {
|
||||
buckets_path: 'latest_report>memory',
|
||||
memory_per_node: {
|
||||
max_bucket: {
|
||||
buckets_path: 'latest_report>memory',
|
||||
},
|
||||
},
|
||||
},
|
||||
events_in_total_per_node: {
|
||||
max_bucket: {
|
||||
buckets_path: 'latest_report>events_in_total',
|
||||
events_in_total_per_node: {
|
||||
max_bucket: {
|
||||
buckets_path: 'latest_report>events_in_total',
|
||||
},
|
||||
},
|
||||
},
|
||||
events_out_total_per_node: {
|
||||
max_bucket: {
|
||||
buckets_path: 'latest_report>events_out_total',
|
||||
events_out_total_per_node: {
|
||||
max_bucket: {
|
||||
buckets_path: 'latest_report>events_out_total',
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
logstash_versions: {
|
||||
terms: {
|
||||
field: 'logstash_stats.logstash.version',
|
||||
size: config.get('monitoring.ui.max_bucket_size'),
|
||||
},
|
||||
},
|
||||
pipelines_nested: {
|
||||
nested: {
|
||||
path: 'logstash_stats.pipelines',
|
||||
},
|
||||
aggs: {
|
||||
pipelines: {
|
||||
sum_bucket: {
|
||||
buckets_path: 'queue_types>num_pipelines',
|
||||
},
|
||||
logstash_versions: {
|
||||
terms: {
|
||||
field: 'logstash_stats.logstash.version',
|
||||
size: config.get('monitoring.ui.max_bucket_size'),
|
||||
},
|
||||
queue_types: {
|
||||
terms: {
|
||||
field: 'logstash_stats.pipelines.queue.type',
|
||||
size: config.get('monitoring.ui.max_bucket_size'),
|
||||
},
|
||||
pipelines_nested: {
|
||||
nested: {
|
||||
path: 'logstash_stats.pipelines',
|
||||
},
|
||||
aggs: {
|
||||
pipelines: {
|
||||
sum_bucket: {
|
||||
buckets_path: 'queue_types>num_pipelines',
|
||||
},
|
||||
},
|
||||
aggs: {
|
||||
num_pipelines: {
|
||||
cardinality: {
|
||||
field: 'logstash_stats.pipelines.id',
|
||||
queue_types: {
|
||||
terms: {
|
||||
field: 'logstash_stats.pipelines.queue.type',
|
||||
size: config.get('monitoring.ui.max_bucket_size'),
|
||||
},
|
||||
aggs: {
|
||||
num_pipelines: {
|
||||
cardinality: {
|
||||
field: 'logstash_stats.pipelines.id',
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
pipelines_nested_mb: {
|
||||
nested: {
|
||||
path: 'logstash.node.stats.pipelines',
|
||||
},
|
||||
aggs: {
|
||||
pipelines: {
|
||||
sum_bucket: {
|
||||
buckets_path: 'queue_types>num_pipelines',
|
||||
},
|
||||
pipelines_nested_mb: {
|
||||
nested: {
|
||||
path: 'logstash.node.stats.pipelines',
|
||||
},
|
||||
queue_types: {
|
||||
terms: {
|
||||
field: 'logstash.node.stats.pipelines.queue.type',
|
||||
size: config.get('monitoring.ui.max_bucket_size'),
|
||||
aggs: {
|
||||
pipelines: {
|
||||
sum_bucket: {
|
||||
buckets_path: 'queue_types>num_pipelines',
|
||||
},
|
||||
},
|
||||
aggs: {
|
||||
num_pipelines: {
|
||||
cardinality: {
|
||||
field: 'logstash.node.stats.pipelines.id',
|
||||
queue_types: {
|
||||
terms: {
|
||||
field: 'logstash.node.stats.pipelines.queue.type',
|
||||
size: config.get('monitoring.ui.max_bucket_size'),
|
||||
},
|
||||
aggs: {
|
||||
num_pipelines: {
|
||||
cardinality: {
|
||||
field: 'logstash.node.stats.pipelines.id',
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
events_in_total: {
|
||||
sum_bucket: {
|
||||
buckets_path: 'logstash_uuids>events_in_total_per_node',
|
||||
events_in_total: {
|
||||
sum_bucket: {
|
||||
buckets_path: 'logstash_uuids>events_in_total_per_node',
|
||||
},
|
||||
},
|
||||
events_out_total: {
|
||||
sum_bucket: {
|
||||
buckets_path: 'logstash_uuids>events_out_total_per_node',
|
||||
},
|
||||
},
|
||||
memory_used: {
|
||||
sum_bucket: {
|
||||
buckets_path: 'logstash_uuids>memory_used_per_node',
|
||||
},
|
||||
},
|
||||
memory: {
|
||||
sum_bucket: {
|
||||
buckets_path: 'logstash_uuids>memory_per_node',
|
||||
},
|
||||
},
|
||||
max_uptime: {
|
||||
max: {
|
||||
field: 'logstash_stats.jvm.uptime_in_millis',
|
||||
},
|
||||
},
|
||||
},
|
||||
events_out_total: {
|
||||
sum_bucket: {
|
||||
buckets_path: 'logstash_uuids>events_out_total_per_node',
|
||||
},
|
||||
},
|
||||
memory_used: {
|
||||
sum_bucket: {
|
||||
buckets_path: 'logstash_uuids>memory_used_per_node',
|
||||
},
|
||||
},
|
||||
memory: {
|
||||
sum_bucket: {
|
||||
buckets_path: 'logstash_uuids>memory_per_node',
|
||||
},
|
||||
},
|
||||
max_uptime: {
|
||||
max: {
|
||||
field: 'logstash_stats.jvm.uptime_in_millis',
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
const { callWithRequest } = req.server.plugins.elasticsearch.getCluster('monitoring');
|
||||
return callWithRequest(req, 'search', params).then((result) => {
|
||||
const aggregations = get(result, 'aggregations', {});
|
||||
const logstashUuids = get(aggregations, 'logstash_uuids.buckets', []);
|
||||
const logstashVersions = get(aggregations, 'logstash_versions.buckets', []);
|
||||
|
||||
// everything is initialized such that it won't impact any rollup
|
||||
let eventsInTotal = 0;
|
||||
let eventsOutTotal = 0;
|
||||
let memory = 0;
|
||||
let memoryUsed = 0;
|
||||
let maxUptime = 0;
|
||||
|
||||
// if the cluster has logstash instances at all
|
||||
if (logstashUuids.length) {
|
||||
eventsInTotal = get(aggregations, 'events_in_total.value');
|
||||
eventsOutTotal = get(aggregations, 'events_out_total.value');
|
||||
memory = get(aggregations, 'memory.value');
|
||||
memoryUsed = get(aggregations, 'memory_used.value');
|
||||
maxUptime = get(aggregations, 'max_uptime.value');
|
||||
}
|
||||
|
||||
let types = get(aggregations, 'pipelines_nested_mb.queue_types.buckets', []);
|
||||
if (!types || types.length === 0) {
|
||||
types = aggregations.pipelines_nested?.queue_types.buckets ?? [];
|
||||
}
|
||||
|
||||
return {
|
||||
clusterUuid,
|
||||
stats: {
|
||||
node_count: logstashUuids.length,
|
||||
events_in_total: eventsInTotal,
|
||||
events_out_total: eventsOutTotal,
|
||||
avg_memory: memory,
|
||||
avg_memory_used: memoryUsed,
|
||||
max_uptime: maxUptime,
|
||||
pipeline_count:
|
||||
get(aggregations, 'pipelines_nested_mb.pipelines.value') ||
|
||||
get(aggregations, 'pipelines_nested.pipelines.value', 0),
|
||||
queue_types: getQueueTypes(types),
|
||||
versions: logstashVersions.map((versionBucket: Bucket) => versionBucket.key),
|
||||
},
|
||||
};
|
||||
});
|
||||
});
|
||||
|
||||
const { callWithRequest } = req.server.plugins.elasticsearch.getCluster('monitoring');
|
||||
return callWithRequest(req, 'search', params).then((result) => {
|
||||
const aggregations = get(result, 'aggregations', {});
|
||||
const logstashUuids = get(aggregations, 'logstash_uuids.buckets', []);
|
||||
const logstashVersions = get(aggregations, 'logstash_versions.buckets', []);
|
||||
|
||||
// everything is initialized such that it won't impact any rollup
|
||||
let eventsInTotal = 0;
|
||||
let eventsOutTotal = 0;
|
||||
let memory = 0;
|
||||
let memoryUsed = 0;
|
||||
let maxUptime = 0;
|
||||
|
||||
// if the cluster has logstash instances at all
|
||||
if (logstashUuids.length) {
|
||||
eventsInTotal = get(aggregations, 'events_in_total.value');
|
||||
eventsOutTotal = get(aggregations, 'events_out_total.value');
|
||||
memory = get(aggregations, 'memory.value');
|
||||
memoryUsed = get(aggregations, 'memory_used.value');
|
||||
maxUptime = get(aggregations, 'max_uptime.value');
|
||||
}
|
||||
|
||||
let types = get(aggregations, 'pipelines_nested_mb.queue_types.buckets', []);
|
||||
if (!types || types.length === 0) {
|
||||
types = aggregations.pipelines_nested?.queue_types.buckets ?? [];
|
||||
}
|
||||
|
||||
return {
|
||||
clusterUuid,
|
||||
stats: {
|
||||
node_count: logstashUuids.length,
|
||||
events_in_total: eventsInTotal,
|
||||
events_out_total: eventsOutTotal,
|
||||
avg_memory: memory,
|
||||
avg_memory_used: memoryUsed,
|
||||
max_uptime: maxUptime,
|
||||
pipeline_count:
|
||||
get(aggregations, 'pipelines_nested_mb.pipelines.value') ||
|
||||
get(aggregations, 'pipelines_nested.pipelines.value', 0),
|
||||
queue_types: getQueueTypes(types),
|
||||
versions: logstashVersions.map((versionBucket: Bucket) => versionBucket.key),
|
||||
},
|
||||
};
|
||||
});
|
||||
})
|
||||
);
|
||||
}
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
* 2.0.
|
||||
*/
|
||||
|
||||
import bluebird from 'bluebird';
|
||||
import pMap from 'p-map';
|
||||
import { schema } from '@kbn/config-schema';
|
||||
import { filter, uniq, map } from 'lodash';
|
||||
import { satisfies } from 'semver';
|
||||
|
@ -47,7 +47,7 @@ export const getAgentPoliciesRoute = (router: IRouter, osqueryContext: OsqueryAp
|
|||
const agentPolicies = await agentPolicyService?.getByIds(soClient, agentPolicyIds);
|
||||
|
||||
if (agentPolicies?.length) {
|
||||
await bluebird.map(
|
||||
await pMap(
|
||||
agentPolicies,
|
||||
(agentPolicy: GetAgentPoliciesResponseItem) =>
|
||||
agentService
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
import { run, RunFn, createFailError } from '@kbn/dev-utils';
|
||||
import { KbnClient } from '@kbn/test';
|
||||
import { AxiosError } from 'axios';
|
||||
import bluebird from 'bluebird';
|
||||
import pMap from 'p-map';
|
||||
import type { CreateExceptionListSchema } from '@kbn/securitysolution-io-ts-list-types';
|
||||
import {
|
||||
ENDPOINT_EVENT_FILTERS_LIST_DESCRIPTION,
|
||||
|
@ -70,7 +70,7 @@ const createEventFilters: RunFn = async ({ flags, log }) => {
|
|||
|
||||
await ensureCreateEndpointEventFiltersList(kbn);
|
||||
|
||||
await bluebird.map(
|
||||
await pMap(
|
||||
Array.from({ length: flags.count as unknown as number }),
|
||||
() =>
|
||||
kbn
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
import { run, RunFn, createFailError } from '@kbn/dev-utils';
|
||||
import { KbnClient } from '@kbn/test';
|
||||
import { AxiosError } from 'axios';
|
||||
import bluebird from 'bluebird';
|
||||
import pMap from 'p-map';
|
||||
import type { CreateExceptionListSchema } from '@kbn/securitysolution-io-ts-list-types';
|
||||
import {
|
||||
ENDPOINT_HOST_ISOLATION_EXCEPTIONS_LIST_DESCRIPTION,
|
||||
|
@ -70,7 +70,7 @@ const createHostIsolationException: RunFn = async ({ flags, log }) => {
|
|||
|
||||
await ensureCreateEndpointHostIsolationExceptionList(kbn);
|
||||
|
||||
await bluebird.map(
|
||||
await pMap(
|
||||
Array.from({ length: flags.count as unknown as number }),
|
||||
() =>
|
||||
kbn
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
import minimist from 'minimist';
|
||||
import { ToolingLog } from '@kbn/dev-utils';
|
||||
import { KbnClient } from '@kbn/test';
|
||||
import bluebird from 'bluebird';
|
||||
import pMap from 'p-map';
|
||||
import { basename } from 'path';
|
||||
import { AxiosResponse } from 'axios';
|
||||
import { TRUSTED_APPS_CREATE_API, TRUSTED_APPS_LIST_API } from '../../../common/endpoint/constants';
|
||||
|
@ -113,7 +113,7 @@ export const run: (options?: RunOptions) => Promise<TrustedApp[]> = async ({
|
|||
return () => policyIds[randomN(policyIds.length)];
|
||||
})();
|
||||
|
||||
return bluebird.map(
|
||||
return pMap(
|
||||
Array.from({ length: count }),
|
||||
async () => {
|
||||
const body = trustedAppGenerator.generateTrustedAppForCreate();
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
*/
|
||||
|
||||
import expect from '@kbn/expect';
|
||||
import { delay } from 'bluebird';
|
||||
import { setTimeout as setTimeoutAsync } from 'timers/promises';
|
||||
import { FtrProviderContext } from '../ftr_provider_context';
|
||||
import { logWrapper } from './log_wrapper';
|
||||
|
||||
|
@ -1094,7 +1094,7 @@ export function LensPageProvider({ getService, getPageObjects }: FtrProviderCont
|
|||
draggedOver,
|
||||
dropTarget
|
||||
);
|
||||
await delay(150);
|
||||
await setTimeoutAsync(150);
|
||||
},
|
||||
|
||||
/**
|
||||
|
|
|
@ -6,7 +6,6 @@
|
|||
*/
|
||||
|
||||
import expect from '@kbn/expect';
|
||||
import { map as mapAsync } from 'bluebird';
|
||||
import { FtrService } from '../ftr_provider_context';
|
||||
|
||||
export class RollupPageObject extends FtrService {
|
||||
|
@ -111,26 +110,32 @@ export class RollupPageObject extends FtrService {
|
|||
|
||||
async getJobList() {
|
||||
const jobs = await this.testSubjects.findAll('jobTableRow');
|
||||
return mapAsync(jobs, async (job) => {
|
||||
const jobNameElement = await job.findByTestSubject('jobTableCell-id');
|
||||
const jobStatusElement = await job.findByTestSubject('jobTableCell-status');
|
||||
const jobIndexPatternElement = await job.findByTestSubject('jobTableCell-indexPattern');
|
||||
const jobRollUpIndexPatternElement = await job.findByTestSubject('jobTableCell-rollupIndex');
|
||||
const jobDelayElement = await job.findByTestSubject('jobTableCell-rollupDelay');
|
||||
const jobIntervalElement = await job.findByTestSubject('jobTableCell-dateHistogramInterval');
|
||||
const jobGroupElement = await job.findByTestSubject('jobTableCell-groups');
|
||||
const jobMetricsElement = await job.findByTestSubject('jobTableCell-metrics');
|
||||
return await Promise.all(
|
||||
jobs.map(async (job) => {
|
||||
const jobNameElement = await job.findByTestSubject('jobTableCell-id');
|
||||
const jobStatusElement = await job.findByTestSubject('jobTableCell-status');
|
||||
const jobIndexPatternElement = await job.findByTestSubject('jobTableCell-indexPattern');
|
||||
const jobRollUpIndexPatternElement = await job.findByTestSubject(
|
||||
'jobTableCell-rollupIndex'
|
||||
);
|
||||
const jobDelayElement = await job.findByTestSubject('jobTableCell-rollupDelay');
|
||||
const jobIntervalElement = await job.findByTestSubject(
|
||||
'jobTableCell-dateHistogramInterval'
|
||||
);
|
||||
const jobGroupElement = await job.findByTestSubject('jobTableCell-groups');
|
||||
const jobMetricsElement = await job.findByTestSubject('jobTableCell-metrics');
|
||||
|
||||
return {
|
||||
jobName: await jobNameElement.getVisibleText(),
|
||||
jobStatus: await jobStatusElement.getVisibleText(),
|
||||
jobIndexPattern: await jobIndexPatternElement.getVisibleText(),
|
||||
jobRollUpIndexPattern: await jobRollUpIndexPatternElement.getVisibleText(),
|
||||
jobDelayElement: await jobDelayElement.getVisibleText(),
|
||||
jobInterval: await jobIntervalElement.getVisibleText(),
|
||||
jobGroup: await jobGroupElement.getVisibleText(),
|
||||
jobMetrics: await jobMetricsElement.getVisibleText(),
|
||||
};
|
||||
});
|
||||
return {
|
||||
jobName: await jobNameElement.getVisibleText(),
|
||||
jobStatus: await jobStatusElement.getVisibleText(),
|
||||
jobIndexPattern: await jobIndexPatternElement.getVisibleText(),
|
||||
jobRollUpIndexPattern: await jobRollUpIndexPatternElement.getVisibleText(),
|
||||
jobDelayElement: await jobDelayElement.getVisibleText(),
|
||||
jobInterval: await jobIntervalElement.getVisibleText(),
|
||||
jobGroup: await jobGroupElement.getVisibleText(),
|
||||
jobMetrics: await jobMetricsElement.getVisibleText(),
|
||||
};
|
||||
})
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -5,7 +5,6 @@
|
|||
* 2.0.
|
||||
*/
|
||||
|
||||
import { map as mapAsync } from 'bluebird';
|
||||
import { FtrService } from '../ftr_provider_context';
|
||||
|
||||
export class WatcherPageObject extends FtrService {
|
||||
|
@ -51,16 +50,18 @@ export class WatcherPageObject extends FtrService {
|
|||
// get all the watches in the list
|
||||
async getWatches() {
|
||||
const watches = await this.find.allByCssSelector('.euiTableRow');
|
||||
return mapAsync(watches, async (watch) => {
|
||||
const checkBox = await watch.findByCssSelector('td:nth-child(1)');
|
||||
const id = await watch.findByCssSelector('td:nth-child(2)');
|
||||
const name = await watch.findByCssSelector('td:nth-child(3)');
|
||||
return await Promise.all(
|
||||
watches.map(async (watch) => {
|
||||
const checkBox = await watch.findByCssSelector('td:nth-child(1)');
|
||||
const id = await watch.findByCssSelector('td:nth-child(2)');
|
||||
const name = await watch.findByCssSelector('td:nth-child(3)');
|
||||
|
||||
return {
|
||||
checkBox: (await checkBox.getAttribute('innerHTML')).includes('input'),
|
||||
id: await id.getVisibleText(),
|
||||
name: (await name.getVisibleText()).split(',').map((role) => role.trim()),
|
||||
};
|
||||
});
|
||||
return {
|
||||
checkBox: (await checkBox.getAttribute('innerHTML')).includes('input'),
|
||||
id: await id.getVisibleText(),
|
||||
name: (await name.getVisibleText()).split(',').map((role) => role.trim()),
|
||||
};
|
||||
})
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -5,8 +5,6 @@
|
|||
* 2.0.
|
||||
*/
|
||||
|
||||
import { map as mapAsync } from 'bluebird';
|
||||
|
||||
export function AceEditorProvider({ getService }) {
|
||||
const testSubjects = getService('testSubjects');
|
||||
const find = getService('find');
|
||||
|
@ -35,7 +33,7 @@ export function AceEditorProvider({ getService }) {
|
|||
return await retry.try(async () => {
|
||||
const editor = await testSubjects.find(testSubjectSelector);
|
||||
const lines = await editor.findAllByClassName('ace_line');
|
||||
const linesText = await mapAsync(lines, (line) => line.getVisibleText());
|
||||
const linesText = await Promise.all(lines.map((line) => line.getVisibleText()));
|
||||
return linesText.join('\n');
|
||||
});
|
||||
}
|
||||
|
|
|
@ -6,7 +6,6 @@
|
|||
*/
|
||||
|
||||
import { range } from 'lodash';
|
||||
import { map as mapAsync } from 'bluebird';
|
||||
|
||||
export function MonitoringClusterAlertsProvider({ getService, getPageObjects }) {
|
||||
const testSubjects = getService('testSubjects');
|
||||
|
@ -61,9 +60,11 @@ export function MonitoringClusterAlertsProvider({ getService, getPageObjects })
|
|||
const listingRows = await this.getOverviewAlerts();
|
||||
const alertIcons = await retry.try(async () => {
|
||||
const elements = await find.allByCssSelector(SUBJ_OVERVIEW_ICONS);
|
||||
return await mapAsync(elements, async (element) => {
|
||||
return await element.getVisibleText();
|
||||
});
|
||||
return await Promise.all(
|
||||
elements.map(async (element) => {
|
||||
return await element.getVisibleText();
|
||||
})
|
||||
);
|
||||
});
|
||||
|
||||
return await this._getAlertSetAll({
|
||||
|
|
|
@ -6,7 +6,6 @@
|
|||
*/
|
||||
|
||||
import expect from '@kbn/expect';
|
||||
import { props as propsAsync } from 'bluebird';
|
||||
|
||||
export function PipelineEditorProvider({ getService }) {
|
||||
const retry = getService('retry');
|
||||
|
@ -125,20 +124,27 @@ export function PipelineEditorProvider({ getService }) {
|
|||
* @return {Promise<undefined>}
|
||||
*/
|
||||
async assertInputs(expectedValues) {
|
||||
const values = await propsAsync({
|
||||
id: testSubjects.getAttribute(SUBJ_INPUT_ID, 'value'),
|
||||
description: testSubjects.getAttribute(SUBJ_INPUT_DESCRIPTION, 'value'),
|
||||
pipeline: aceEditor.getValue(SUBJ_UI_ACE_PIPELINE),
|
||||
workers: testSubjects.getAttribute(SUBJ_INPUT_WORKERS, 'value'),
|
||||
batchSize: testSubjects.getAttribute(SUBJ_INPUT_BATCH_SIZE, 'value'),
|
||||
queueType: testSubjects.getAttribute(SUBJ_SELECT_QUEUE_TYPE, 'value'),
|
||||
queueMaxBytesNumber: testSubjects.getAttribute(SUBJ_INPUT_QUEUE_MAX_BYTES_NUMBER, 'value'),
|
||||
queueMaxBytesUnits: testSubjects.getAttribute(SUBJ_SELECT_QUEUE_MAX_BYTES_UNITS, 'value'),
|
||||
queueCheckpointWrites: testSubjects.getAttribute(
|
||||
SUBJ_INPUT_QUEUE_CHECKPOINT_WRITES,
|
||||
'value'
|
||||
),
|
||||
});
|
||||
const values = await Promise.all([
|
||||
testSubjects.getAttribute(SUBJ_INPUT_ID, 'value'),
|
||||
testSubjects.getAttribute(SUBJ_INPUT_DESCRIPTION, 'value'),
|
||||
aceEditor.getValue(SUBJ_UI_ACE_PIPELINE),
|
||||
testSubjects.getAttribute(SUBJ_INPUT_WORKERS, 'value'),
|
||||
testSubjects.getAttribute(SUBJ_INPUT_BATCH_SIZE, 'value'),
|
||||
testSubjects.getAttribute(SUBJ_SELECT_QUEUE_TYPE, 'value'),
|
||||
testSubjects.getAttribute(SUBJ_INPUT_QUEUE_MAX_BYTES_NUMBER, 'value'),
|
||||
testSubjects.getAttribute(SUBJ_SELECT_QUEUE_MAX_BYTES_UNITS, 'value'),
|
||||
testSubjects.getAttribute(SUBJ_INPUT_QUEUE_CHECKPOINT_WRITES, 'value'),
|
||||
]).then((values) => ({
|
||||
id: values[0],
|
||||
description: values[1],
|
||||
pipeline: values[2],
|
||||
workers: values[3],
|
||||
batchSize: values[4],
|
||||
queueType: values[5],
|
||||
queueMaxBytesNumber: values[6],
|
||||
queueMaxBytesUnits: values[7],
|
||||
queueCheckpointWrites: values[8],
|
||||
}));
|
||||
|
||||
expect(values).to.eql(expectedValues);
|
||||
}
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
*/
|
||||
|
||||
import expect from '@kbn/expect';
|
||||
import { delay } from 'bluebird';
|
||||
import { setTimeout as setTimeoutAsync } from 'timers/promises';
|
||||
|
||||
import { FtrProviderContext } from '../../ftr_provider_context';
|
||||
|
||||
|
@ -99,7 +99,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => {
|
|||
let alert: any;
|
||||
await retry.tryForTime(60 * 1000, async () => {
|
||||
// add a delay before next call to not overload the server
|
||||
await delay(1500);
|
||||
await setTimeoutAsync(1500);
|
||||
const apiResponse = await supertest.get('/api/alerts/_find?search=uptime-test');
|
||||
const alertsFromThisTest = apiResponse.body.data.filter(
|
||||
({ name }: { name: string }) => name === 'uptime-test'
|
||||
|
|
|
@ -10,7 +10,7 @@ import { resolve } from 'path';
|
|||
import { REPO_ROOT } from '@kbn/utils';
|
||||
import Fs from 'fs';
|
||||
import { createFlagError } from '@kbn/dev-utils';
|
||||
import { delay } from 'bluebird';
|
||||
import { setTimeout as setTimeoutAsync } from 'timers/promises';
|
||||
import { FtrProviderContext } from './../functional/ftr_provider_context';
|
||||
|
||||
const baseSimulationPath = 'src/test/scala/org/kibanaLoadTest/simulation';
|
||||
|
@ -82,7 +82,7 @@ export async function GatlingTestRunner({ getService }: FtrProviderContext) {
|
|||
});
|
||||
// wait a minute between simulations, skip for the last one
|
||||
if (i < simulationClasses.length - 1) {
|
||||
await delay(60 * 1000);
|
||||
await setTimeoutAsync(60 * 1000);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
|
||||
import expect from '@kbn/expect';
|
||||
import { parse as parseCookie, Cookie } from 'tough-cookie';
|
||||
import { delay } from 'bluebird';
|
||||
import { setTimeout as setTimeoutAsync } from 'timers/promises';
|
||||
import { adminTestUser } from '@kbn/test';
|
||||
import { FtrProviderContext } from '../../ftr_provider_context';
|
||||
import {
|
||||
|
@ -319,7 +319,7 @@ export default function ({ getService }: FtrProviderContext) {
|
|||
|
||||
// Access token expiration is set to 15s for API integration tests.
|
||||
// Let's wait for 20s to make sure token expires.
|
||||
await delay(20000);
|
||||
await setTimeoutAsync(20000);
|
||||
|
||||
// This api call should succeed and automatically refresh token. Returned cookie will contain
|
||||
// the new access and refresh token pair.
|
||||
|
@ -350,7 +350,7 @@ export default function ({ getService }: FtrProviderContext) {
|
|||
|
||||
// Access token expiration is set to 15s for API integration tests.
|
||||
// Let's wait for 20s to make sure token expires.
|
||||
await delay(20000);
|
||||
await setTimeoutAsync(20000);
|
||||
|
||||
// This request should succeed and automatically refresh token. Returned cookie will contain
|
||||
// the new access and refresh token pair.
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
import expect from '@kbn/expect';
|
||||
import { parse as parseCookie, Cookie } from 'tough-cookie';
|
||||
import url from 'url';
|
||||
import { delay } from 'bluebird';
|
||||
import { setTimeout as setTimeoutAsync } from 'timers/promises';
|
||||
import { adminTestUser } from '@kbn/test';
|
||||
import { getStateAndNonce } from '../../../fixtures/oidc/oidc_tools';
|
||||
import { FtrProviderContext } from '../../../ftr_provider_context';
|
||||
|
@ -494,7 +494,7 @@ export default function ({ getService }: FtrProviderContext) {
|
|||
|
||||
// Access token expiration is set to 15s for API integration tests.
|
||||
// Let's wait for 20s to make sure token expires.
|
||||
await delay(20000);
|
||||
await setTimeoutAsync(20000);
|
||||
|
||||
// This api call should succeed and automatically refresh token. Returned cookie will contain
|
||||
// the new access and refresh token pair.
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
|
||||
import expect from '@kbn/expect';
|
||||
import { parse as parseCookie, Cookie } from 'tough-cookie';
|
||||
import { delay } from 'bluebird';
|
||||
import { setTimeout as setTimeoutAsync } from 'timers/promises';
|
||||
import { readFileSync } from 'fs';
|
||||
import { resolve } from 'path';
|
||||
import { CA_CERT_PATH } from '@kbn/dev-utils';
|
||||
|
@ -358,7 +358,7 @@ export default function ({ getService }: FtrProviderContext) {
|
|||
|
||||
// Access token expiration is set to 15s for API integration tests.
|
||||
// Let's wait for 20s to make sure token expires.
|
||||
await delay(20000);
|
||||
await setTimeoutAsync(20000);
|
||||
|
||||
// This api call should succeed and automatically refresh token. Returned cookie will contain
|
||||
// the new access token.
|
||||
|
@ -382,7 +382,7 @@ export default function ({ getService }: FtrProviderContext) {
|
|||
|
||||
// Access token expiration is set to 15s for API integration tests.
|
||||
// Let's wait for 20s to make sure token expires.
|
||||
await delay(20000);
|
||||
await setTimeoutAsync(20000);
|
||||
|
||||
// This request should succeed and automatically refresh token. Returned cookie will contain
|
||||
// the new access and refresh token pair.
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
|
||||
import { stringify } from 'query-string';
|
||||
import url from 'url';
|
||||
import { delay } from 'bluebird';
|
||||
import { setTimeout as setTimeoutAsync } from 'timers/promises';
|
||||
import expect from '@kbn/expect';
|
||||
import { parse as parseCookie, Cookie } from 'tough-cookie';
|
||||
import { adminTestUser } from '@kbn/test';
|
||||
|
@ -468,7 +468,7 @@ export default function ({ getService }: FtrProviderContext) {
|
|||
|
||||
// Access token expiration is set to 15s for API integration tests.
|
||||
// Let's wait for 20s to make sure token expires.
|
||||
await delay(20000);
|
||||
await setTimeoutAsync(20000);
|
||||
});
|
||||
|
||||
const expectNewSessionCookie = (cookie: Cookie) => {
|
||||
|
@ -639,7 +639,7 @@ export default function ({ getService }: FtrProviderContext) {
|
|||
['when access token is valid', async () => {}],
|
||||
// Scenario when active cookie has an expired access token. Access token expiration is set
|
||||
// to 15s for API integration tests so we need to wait for 20s to make sure token expires.
|
||||
['when access token is expired', async () => await delay(20000)],
|
||||
['when access token is expired', async () => await setTimeoutAsync(20000)],
|
||||
// Scenario when active cookie references to access/refresh token pair that were already
|
||||
// removed from Elasticsearch (to simulate 24h when expired tokens are removed).
|
||||
[
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
*/
|
||||
|
||||
import { parse as parseCookie, Cookie } from 'tough-cookie';
|
||||
import { delay } from 'bluebird';
|
||||
import { setTimeout as setTimeoutAsync } from 'timers/promises';
|
||||
import expect from '@kbn/expect';
|
||||
import { adminTestUser } from '@kbn/test';
|
||||
import type { AuthenticationProvider } from '../../../../plugins/security/common/model';
|
||||
|
@ -101,7 +101,7 @@ export default function ({ getService }: FtrProviderContext) {
|
|||
// Cleanup routine runs every 10s, and idle timeout threshold is three times larger than 5s
|
||||
// idle timeout, let's wait for 40s to make sure cleanup routine runs when idle timeout
|
||||
// threshold is exceeded.
|
||||
await delay(40000);
|
||||
await setTimeoutAsync(40000);
|
||||
|
||||
// Session info is removed from the index and cookie isn't valid anymore
|
||||
expect(await getNumberOfSessionDocuments()).to.be(0);
|
||||
|
@ -143,7 +143,7 @@ export default function ({ getService }: FtrProviderContext) {
|
|||
// Cleanup routine runs every 10s, and idle timeout threshold is three times larger than 5s
|
||||
// idle timeout, let's wait for 40s to make sure cleanup routine runs when idle timeout
|
||||
// threshold is exceeded.
|
||||
await delay(40000);
|
||||
await setTimeoutAsync(40000);
|
||||
|
||||
// Session for basic and SAML that used global session settings should not be valid anymore.
|
||||
expect(await getNumberOfSessionDocuments()).to.be(2);
|
||||
|
@ -191,7 +191,7 @@ export default function ({ getService }: FtrProviderContext) {
|
|||
// least twice.
|
||||
for (const counter of [...Array(20).keys()]) {
|
||||
// Session idle timeout is 15s, let's wait 10s and make a new request that would extend the session.
|
||||
await delay(1500);
|
||||
await setTimeoutAsync(1500);
|
||||
|
||||
sessionCookie = (await checkSessionCookie(sessionCookie, basicUsername, {
|
||||
type: 'basic',
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
*/
|
||||
|
||||
import { parse as parseCookie, Cookie } from 'tough-cookie';
|
||||
import { delay } from 'bluebird';
|
||||
import { setTimeout as setTimeoutAsync } from 'timers/promises';
|
||||
import expect from '@kbn/expect';
|
||||
import { adminTestUser } from '@kbn/test';
|
||||
import type { AuthenticationProvider } from '../../../../plugins/security/common/model';
|
||||
|
@ -98,7 +98,7 @@ export default function ({ getService }: FtrProviderContext) {
|
|||
|
||||
// Cleanup routine runs every 10s, let's wait for 40s to make sure it runs multiple times and
|
||||
// when lifespan is exceeded.
|
||||
await delay(40000);
|
||||
await setTimeoutAsync(40000);
|
||||
|
||||
// Session info is removed from the index and cookie isn't valid anymore
|
||||
expect(await getNumberOfSessionDocuments()).to.be(0);
|
||||
|
@ -138,7 +138,7 @@ export default function ({ getService }: FtrProviderContext) {
|
|||
|
||||
// Cleanup routine runs every 10s, let's wait for 40s to make sure it runs multiple times and
|
||||
// when lifespan is exceeded.
|
||||
await delay(40000);
|
||||
await setTimeoutAsync(40000);
|
||||
|
||||
// Session for basic and SAML that used global session settings should not be valid anymore.
|
||||
expect(await getNumberOfSessionDocuments()).to.be(2);
|
||||
|
|
10
yarn.lock
10
yarn.lock
|
@ -5905,11 +5905,6 @@
|
|||
resolved "https://registry.yarnpkg.com/@types/base64-js/-/base64-js-1.2.5.tgz#582b2476169a6cba460a214d476c744441d873d5"
|
||||
integrity sha1-WCskdhaabLpGCiFNR2x0REHYc9U=
|
||||
|
||||
"@types/bluebird@^3.1.1":
|
||||
version "3.5.30"
|
||||
resolved "https://registry.yarnpkg.com/@types/bluebird/-/bluebird-3.5.30.tgz#ee034a0eeea8b84ed868b1aa60d690b08a6cfbc5"
|
||||
integrity sha512-8LhzvcjIoqoi1TghEkRMkbbmM+jhHnBokPGkJWjclMK+Ks0MxEBow3/p2/iFTZ+OIbJHQDSfpgdZEb+af3gfVw==
|
||||
|
||||
"@types/braces@*":
|
||||
version "3.0.0"
|
||||
resolved "https://registry.yarnpkg.com/@types/braces/-/braces-3.0.0.tgz#7da1c0d44ff1c7eb660a36ec078ea61ba7eb42cb"
|
||||
|
@ -9422,11 +9417,6 @@ bluebird@3.5.3:
|
|||
resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.3.tgz#7d01c6f9616c9a51ab0f8c549a79dfe6ec33efa7"
|
||||
integrity sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw==
|
||||
|
||||
bluebird@3.5.5:
|
||||
version "3.5.5"
|
||||
resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.5.tgz#a8d0afd73251effbbd5fe384a77d73003c17a71f"
|
||||
integrity sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==
|
||||
|
||||
bluebird@3.7.2, bluebird@^3.3.5, bluebird@^3.4.1, bluebird@^3.5.0, bluebird@^3.5.1, bluebird@^3.5.5, bluebird@^3.7.1, bluebird@^3.7.2:
|
||||
version "3.7.2"
|
||||
resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f"
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue