diff --git a/e2e/package.json b/e2e/package.json index b71466efbb2..60703bd104f 100644 --- a/e2e/package.json +++ b/e2e/package.json @@ -30,7 +30,7 @@ "@terascope/fetch-github-release": "^0.6.0", "bluebird": "^3.5.3", "bunyan": "^1.8.12", - "elasticsearch": "^15.1.1", + "elasticsearch": "^15.3.0", "jest": "^23.6.0", "jest-extended": "^0.11.0", "lodash": "^4.17.11", diff --git a/package.json b/package.json index c38abc9fb53..b5ca72342b2 100644 --- a/package.json +++ b/package.json @@ -36,7 +36,7 @@ "@types/socket.io": "^2.1.2", "@types/socket.io-client": "^1.4.32", "@types/uuid": "^3.4.4", - "lerna": "^3.10.1", + "lerna": "^3.10.5", "rimraf": "^2.6.3", "typescript": "^3.2.2" }, @@ -53,7 +53,7 @@ "lerna-alias": "^3.0.2", "semver": "^5.6.0", "ts-jest": "^23.10.5", - "tslint": "^5.12.0" + "tslint": "^5.12.1" }, "workspaces": [ "packages/*", diff --git a/packages/elasticsearch-api/index.js b/packages/elasticsearch-api/index.js index 3eec5076997..ee084dab089 100644 --- a/packages/elasticsearch-api/index.js +++ b/packages/elasticsearch-api/index.js @@ -512,6 +512,7 @@ module.exports = function elasticsearchApi(client = {}, logger, _opConfig) { return function _errorHandlerFn(err) { const isRejectedError = _.get(err, 'body.error.type') === 'es_rejected_execution_exception'; // const isConnectionError = _.get(err, 'message') === 'No Living connections'; + if (isRejectedError) { // this iteration we will not handle with no living connections issue retry(); diff --git a/packages/job-components/package.json b/packages/job-components/package.json index b682dff99eb..60e4a1ac16d 100644 --- a/packages/job-components/package.json +++ b/packages/job-components/package.json @@ -56,7 +56,7 @@ "jest-fixtures": "^0.6.0", "rimraf": "^2.6.3", "ts-jest": "^23.10.5", - "tslint": "^5.12.0", + "tslint": "^5.12.1", "tslint-config-airbnb": "^5.11.1", "typescript": "^3.2.2" }, diff --git a/packages/teraslice-cli/package.json b/packages/teraslice-cli/package.json index 9285b38da84..fffe6970def 100755 --- a/packages/teraslice-cli/package.json +++ b/packages/teraslice-cli/package.json @@ -43,7 +43,7 @@ "syncprompt": "^2.0.0", "teraslice-client-js": "^0.7.0", "terminal-kit": "^1.26.10", - "tty-table": "^2.6.12", + "tty-table": "^2.6.14", "yargs": "^12.0.2" }, "devDependencies": { diff --git a/packages/teraslice-messaging/package.json b/packages/teraslice-messaging/package.json index 53138712503..d684398fb36 100644 --- a/packages/teraslice-messaging/package.json +++ b/packages/teraslice-messaging/package.json @@ -1,6 +1,6 @@ { "name": "@terascope/teraslice-messaging", - "version": "0.2.6", + "version": "0.3.0", "publishConfig": { "access": "public" }, @@ -38,7 +38,6 @@ }, "dependencies": { "@terascope/queue": "^1.1.6", - "bluebird": "^3.5.3", "debug": "^4.1.1", "nanoid": "^2.0.0", "p-event": "^2.1.0", @@ -55,7 +54,7 @@ "jest-extended": "^0.11.0", "rimraf": "^2.6.3", "ts-jest": "^23.10.5", - "tslint": "^5.12.0", + "tslint": "^5.12.1", "tslint-config-airbnb": "^5.11.1", "typescript": "^3.2.2" }, diff --git a/packages/teraslice-messaging/src/execution-controller/client.ts b/packages/teraslice-messaging/src/execution-controller/client.ts index 5ecf85fc5a8..44c6ec7da1e 100644 --- a/packages/teraslice-messaging/src/execution-controller/client.ts +++ b/packages/teraslice-messaging/src/execution-controller/client.ts @@ -2,6 +2,8 @@ import { isString, pickBy } from 'lodash'; import * as core from '../messenger'; import * as i from './interfaces'; +const ONE_MIN = 60 * 1000; + export class Client extends core.Client { public workerId: string; @@ -81,18 +83,29 @@ export class Client extends core.Client { }); } - async waitForSlice(fn: i.WaitUntilFn = () => false, interval = 100): Promise { + async waitForSlice(fn: i.WaitUntilFn = () => false, timeoutMs = 2 * ONE_MIN): Promise { this.sendAvailable(); + const startTime = Date.now(); + + const isExpired = () => { + const elapsed = Date.now() - startTime; + if (elapsed < timeoutMs) return false; + + // force the next time to send a new available message + this.sendUnavailable(); + return true; + }; + const slice = await new Promise((resolve) => { this.once('execution:slice:new', onMessage); const intervalId = setInterval(() => { - if (this.serverShutdown || !this.ready || fn()) { + if (this.serverShutdown || !this.ready || fn() || isExpired()) { this.removeListener('execution:slice:new', onMessage); finish(); } - }, interval); + }, 100); function onMessage(msg: core.EventMessage) { finish(msg.payload as i.Slice); diff --git a/packages/teraslice-messaging/test/execution-controller-spec.ts b/packages/teraslice-messaging/test/execution-controller-spec.ts index bcef517d4ab..1d4871890c2 100644 --- a/packages/teraslice-messaging/test/execution-controller-spec.ts +++ b/packages/teraslice-messaging/test/execution-controller-spec.ts @@ -1,7 +1,6 @@ import 'jest-extended'; -import bluebird from 'bluebird'; -import findPort from './helpers/find-port'; +import { pDelay, findPort } from './helpers'; import { formatURL, newMsgId, @@ -159,7 +158,7 @@ describe('ExecutionController', () => { }, }); - await bluebird.delay(100); + await pDelay(100); expect(sliceComplete).toHaveBeenCalled(); @@ -201,7 +200,7 @@ describe('ExecutionController', () => { error: 'hello' }); - await bluebird.delay(100); + await pDelay(100); expect(sliceFailure).toHaveBeenCalled(); if (msg == null) { @@ -246,7 +245,7 @@ describe('ExecutionController', () => { const slice = client.waitForSlice(() => (Date.now() - stopAt) > 0); - await bluebird.delay(500); + await pDelay(500); expect(server.queue.exists('workerId', workerId)).toBeTrue(); @@ -273,10 +272,27 @@ describe('ExecutionController', () => { } }); - await bluebird.delay(100); + await pDelay(100); expect(server.activeWorkerCount).toBe(0); }); + + describe('when no slice is sent from the server', () => { + it('should handle the timeout properly', async () => { + await client.sendAvailable(); + + const stopAt = Date.now() + 2000; + const stopFn = () => (Date.now() - stopAt) > 0; + const slice = client.waitForSlice(stopFn, 500); + + await pDelay(600); + + await expect(slice).resolves.toBeUndefined(); + + expect(server.activeWorkerCount).toBe(0); + expect(client.available).toBeFalse(); + }); + }); }); describe('when the client is set as unavailable', () => { diff --git a/packages/teraslice-messaging/test/helpers/index.ts b/packages/teraslice-messaging/test/helpers/index.ts new file mode 100644 index 00000000000..dfa58db023a --- /dev/null +++ b/packages/teraslice-messaging/test/helpers/index.ts @@ -0,0 +1,5 @@ +import { promisify } from 'util'; +import findPort from './find-port'; + +export const pDelay = promisify(setTimeout); +export { findPort }; diff --git a/packages/teraslice-messaging/test/messenger-spec.ts b/packages/teraslice-messaging/test/messenger-spec.ts index 24f05ec1143..300653c4cdd 100644 --- a/packages/teraslice-messaging/test/messenger-spec.ts +++ b/packages/teraslice-messaging/test/messenger-spec.ts @@ -1,10 +1,9 @@ import 'jest-extended'; -import bluebird from 'bluebird'; import http from 'http'; import { Message } from '../src/messenger'; import { Messenger, formatURL, newMsgId } from '../src'; -import findPort from './helpers/find-port'; +import { findPort, pDelay } from './helpers'; describe('Messenger', () => { describe('->Core', () => { @@ -386,7 +385,7 @@ describe('Messenger', () => { // @ts-ignore server.handleResponse(server.server.to(clientId), 'hello', async () => { - await bluebird.delay(1000); + await pDelay(1000); }); try { diff --git a/packages/teraslice-test-harness/package.json b/packages/teraslice-test-harness/package.json index 711378feb9e..af9c66c2e25 100644 --- a/packages/teraslice-test-harness/package.json +++ b/packages/teraslice-test-harness/package.json @@ -51,7 +51,7 @@ "jest-extended": "^0.11.0", "rimraf": "^2.6.3", "ts-jest": "^23.10.5", - "tslint": "^5.12.0", + "tslint": "^5.12.1", "tslint-config-airbnb": "^5.11.1", "typescript": "^3.2.2" }, diff --git a/packages/teraslice/lib/cluster/services/execution.js b/packages/teraslice/lib/cluster/services/execution.js index 75118a2007c..46c903da617 100644 --- a/packages/teraslice/lib/cluster/services/execution.js +++ b/packages/teraslice/lib/cluster/services/execution.js @@ -160,11 +160,19 @@ module.exports = function module(context, { clusterMasterServer }) { function stopExecution(exId, timeout, excludeNode) { return getExecutionContext(exId) .then((execution) => { - const isTerminal = _isTerminalStatus(execution); + const isTerminal = _isTerminalStatus(execution._status); if (isTerminal) { logger.info(`execution ${exId} is in terminal status "${execution._status}", it cannot be stopped`); return true; } + + if (execution._status === 'stopping') { + logger.info('execution is already stopping...'); + // we are kicking this off in the background, not part of the promise chain + executionHasStopped(exId); + return true; + } + logger.debug(`stopping execution ${exId}...`, _.pickBy({ timeout, excludeNode })); return setExecutionStatus(exId, 'stopping') .then(() => clusterService.stopExecution(exId, timeout, excludeNode)) diff --git a/packages/teraslice/lib/cluster/storage/backends/elasticsearch_store.js b/packages/teraslice/lib/cluster/storage/backends/elasticsearch_store.js index f10f9dcd601..cb5977f0d4f 100644 --- a/packages/teraslice/lib/cluster/storage/backends/elasticsearch_store.js +++ b/packages/teraslice/lib/cluster/storage/backends/elasticsearch_store.js @@ -217,7 +217,7 @@ module.exports = function module(context, indexName, recordType, idField, _bulkS return elasticsearch.bulkSend(bulkRequest) .then((results) => { - logger.info(`Flushed ${results.items.length} records to index ${indexName}`); + logger.debug(`Flushed ${results.items.length} records to index ${indexName}`); }) .catch((err) => { const errMsg = parseError(err); diff --git a/packages/teraslice/lib/cluster/storage/execution.js b/packages/teraslice/lib/cluster/storage/execution.js index 7e1256e7993..81f9e945acf 100644 --- a/packages/teraslice/lib/cluster/storage/execution.js +++ b/packages/teraslice/lib/cluster/storage/execution.js @@ -68,10 +68,11 @@ module.exports = function module(context) { // verify the current status to make sure it can be updated to the desired status function verifyStatusUpdate(exId, desiredStatus) { if (!desiredStatus || !_isValidStatus(desiredStatus)) { - return Promise.reject(new Error(`Invalid Job status: "${desiredStatus}"`)); + const error = new Error(`Invalid Job status: "${desiredStatus}"`); + error.statusCode = 422; + return Promise.reject(error); } - return getStatus(exId) .then((status) => { // when setting the same status to shouldn't throw an error diff --git a/packages/teraslice/lib/workers/execution-controller/index.js b/packages/teraslice/lib/workers/execution-controller/index.js index 35d2e913be5..f032d2019c6 100644 --- a/packages/teraslice/lib/workers/execution-controller/index.js +++ b/packages/teraslice/lib/workers/execution-controller/index.js @@ -12,6 +12,7 @@ const makeSliceAnalytics = require('./slice-analytics'); const { waitForWorkerShutdown } = require('../helpers/worker-shutdown'); const { makeStateStore, makeExStore } = require('../../cluster/storage'); const { makeLogger, generateWorkerId } = require('../helpers/terafoundation'); +const { prependErrorMsg } = require('../../utils/error_utils'); const ExecutionControllerServer = Messaging.ExecutionController.Server; const ClusterMasterClient = Messaging.ClusterMaster.Client; @@ -89,6 +90,8 @@ class ExecutionController { trailing: true, maxWait: 500, }); + + this._startSliceFailureWatchDog = this._initSliceFailureWatchDog(); } async initialize() { @@ -201,7 +204,7 @@ class ExecutionController { } else { // in persistent mode we set watchdogs to monitor // when failing can be set back to running - this._checkAndUpdateExecutionState(); + this._startSliceFailureWatchDog(); } this.pendingSlices -= 1; this._updateExecutionStats(); @@ -297,12 +300,16 @@ class ExecutionController { async setFailingStatus() { const { exStore } = this.stores; - const errMsg = `slicer: ${this.exId} has encountered a processing_error`; + const errMsg = `execution ${this.exId} has encountered a processing error`; this.logger.error(errMsg); const executionStats = this.executionAnalytics.getAnalytics(); - const errorMeta = await exStore.executionMetaData(executionStats, errMsg); - await exStore.setStatus(this.exId, 'failing', errorMeta); + const errorMeta = exStore.executionMetaData(executionStats, errMsg); + try { + await exStore.setStatus(this.exId, 'failing', errorMeta); + } catch (err) { + this.logger.error('Failure to set execution status to "failing"', err); + } } async _terminalError(err) { @@ -312,33 +319,39 @@ class ExecutionController { this.slicerFailed = true; - const msg = `slicer for ex ${this.exId} had an error, shutting down execution`; - this.logger.error(msg, err); - - const errMsg = `${msg}, caused by ${err.stack ? err.stack : _.toString(err)}`; + const errMsg = prependErrorMsg(`slicer for ex ${this.exId} had an error, shutting down execution`, err, true); + this.logger.error(errMsg); const executionStats = this.executionAnalytics.getAnalytics(); - const errorMeta = await exStore.executionMetaData(executionStats, errMsg); + const errorMeta = exStore.executionMetaData(executionStats, errMsg); - await exStore.setStatus(this.exId, 'failed', errorMeta); + try { + await exStore.setStatus(this.exId, 'failed', errorMeta); + } catch (_err) { + this.logger.error('failure setting status to failed', _err); + } - this.logger.fatal(`execution ${this.exId} is done because of slice failure`); + this.logger.fatal(`execution ${this.exId} is ended because of slice failure`); await this._endExecution(); } async shutdown(block = true) { if (this.isShutdown) return; if (!this.isInitialized) return; - - if (this.isShuttingDown && block) { - this.logger.debug(`execution shutdown was called for ex ${this.exId} but it was already shutting down, will block until done`); - await waitForWorkerShutdown(this.context, 'worker:shutdown:complete'); + if (this.isShuttingDown) { + this.logger.debug(`execution shutdown was called for ex ${this.exId} but it was already shutting down${block ? ', will block until done' : ''}`); + if (block) { + await waitForWorkerShutdown(this.context, 'worker:shutdown:complete'); + } return; } this.logger.debug(`execution shutdown was called for ex ${this.exId}`); const shutdownErrs = []; + const pushError = (err) => { + shutdownErrs.push(err); + }; // allow clients to go immediately from disconnect to offline this.server.isShuttingDown = true; @@ -355,7 +368,7 @@ class ExecutionController { this.isShuttingDown = true; this.isPaused = false; - clearInterval(this.watcher); + clearInterval(this.sliceFailureInterval); clearTimeout(this.workerConnectTimeoutId); clearTimeout(this.workerDisconnectTimeoutId); @@ -365,47 +378,30 @@ class ExecutionController { (async () => { if (!this.collectAnalytics) return; - try { - await this.slicerAnalytics.shutdown(); - } catch (err) { - shutdownErrs.push(err); - } + await this.slicerAnalytics.shutdown() + .catch(pushError); })(), (async () => { - try { - await this.executionAnalytics.shutdown(); - } catch (err) { - shutdownErrs.push(err); - } - })(), - (async () => { - try { - await this.scheduler.shutdown(); - } catch (err) { - shutdownErrs.push(err); - } + // the execution analytics must be shutdown + // before the message client + await this.executionAnalytics.shutdown() + .catch(pushError); + + await this.client.shutdown() + .catch(pushError); })(), (async () => { - try { - await this.server.shutdown(); - } catch (err) { - shutdownErrs.push(err); - } + await this.scheduler.shutdown() + .catch(pushError); })(), (async () => { - try { - await this.client.shutdown(); - } catch (err) { - shutdownErrs.push(err); - } + await this.server.shutdown() + .catch(pushError); })(), (async () => { const stores = Object.values(this.stores); - try { - await Promise.map(stores, store => store.shutdown(true)); - } catch (err) { - shutdownErrs.push(err); - } + await Promise.map(stores, store => store.shutdown(true) + .catch(pushError)); })(), ]); @@ -803,7 +799,7 @@ class ExecutionController { return false; } - _checkAndUpdateExecutionState() { + _initSliceFailureWatchDog() { const probationWindow = this.executionContext.config.probation_window; let watchDogSet = false; let errorCount; @@ -812,14 +808,15 @@ class ExecutionController { return async () => { if (watchDogSet) return; watchDogSet = true; + const analyticsData = this.executionAnalytics.getAnalytics(); // keep track of how many slices have been processed and failed errorCount = analyticsData.failed; processedCount = analyticsData.processed; + await this.setFailingStatus(); - const { exStore } = this.stores; - this.watcher = setInterval(() => { + this.sliceFailureInterval = setInterval(() => { const currentAnalyticsData = this.executionAnalytics.getAnalytics(); const currentErrorCount = currentAnalyticsData.failed; const currentProcessedCount = currentAnalyticsData.processed; @@ -827,11 +824,16 @@ class ExecutionController { const slicesHaveProcessedSinceError = currentProcessedCount > processedCount; if (errorCountTheSame && slicesHaveProcessedSinceError) { - clearInterval(this.watcher); + clearInterval(this.sliceFailureInterval); + + watchDogSet = false; + this.sliceFailureInterval = null; + this.logger.info(`No slice errors have occurred within execution: ${this.exId} will be set back to 'running' state`); - exStore.setStatus(this.exId, 'running'); + this.stores.exStore.setStatus(this.exId, 'running'); return; } + errorCount = currentErrorCount; processedCount = currentProcessedCount; }, probationWindow); diff --git a/packages/teraslice/lib/workers/execution-controller/slice-analytics.js b/packages/teraslice/lib/workers/execution-controller/slice-analytics.js index 8ff9ec19b95..618564720ea 100644 --- a/packages/teraslice/lib/workers/execution-controller/slice-analytics.js +++ b/packages/teraslice/lib/workers/execution-controller/slice-analytics.js @@ -110,7 +110,7 @@ average memory: ${memory.average}, min: ${memory.min}, and max: ${memory.max} events.on('slice:success', onSliceSuccess); - function shutdown() { + async function shutdown() { events.removeListener('slice:success', onSliceSuccess); } diff --git a/packages/teraslice/lib/workers/helpers/terafoundation.js b/packages/teraslice/lib/workers/helpers/terafoundation.js index d347b4ae8d0..0ada265455e 100644 --- a/packages/teraslice/lib/workers/helpers/terafoundation.js +++ b/packages/teraslice/lib/workers/helpers/terafoundation.js @@ -13,13 +13,16 @@ function makeLogger(context, executionContext, moduleName, extra = {}) { exId, jobId, } = executionContext; - const { assignment } = context; + const { + assignment, + cluster, + } = context; return context.apis.foundation.makeLogger(Object.assign({ ex_id: exId, job_id: jobId, module: moduleName, - worker_id: context.cluster.id, + worker_id: cluster.worker.id, assignment, }, extra)); } diff --git a/packages/teraslice/lib/workers/helpers/worker-shutdown.js b/packages/teraslice/lib/workers/helpers/worker-shutdown.js index f1ea290b13a..5e473ef568e 100644 --- a/packages/teraslice/lib/workers/helpers/worker-shutdown.js +++ b/packages/teraslice/lib/workers/helpers/worker-shutdown.js @@ -118,6 +118,18 @@ function shutdownHandler(context, shutdownFn) { exit('unhandledRejection', err); }); + // See https://github.com/trentm/node-bunyan/issues/246 + function handleStdError(err) { + if (err.code === 'EPIPE' || err.code === 'ERR_STREAM_DESTROYED') { + // ignore + } else { + throw err; + } + } + + process.stdout.on('error', handleStdError); + process.stderr.on('error', handleStdError); + // event is fired from terafoundation when an error occurs during instantiation of a client events.once('client:initialization:error', (err) => { logger.fatal(`${assignment} received a client initialization error, ${exitingIn()}`, err); diff --git a/packages/teraslice/lib/workers/worker/index.js b/packages/teraslice/lib/workers/worker/index.js index 6b2eb2df4d2..e9b60dc4848 100644 --- a/packages/teraslice/lib/workers/worker/index.js +++ b/packages/teraslice/lib/workers/worker/index.js @@ -79,10 +79,11 @@ class Worker { try { await this.runOnce(); } catch (err) { - /* istanbul ignore next */ - this.logger.warn('Slice failed but worker is not done processing'); + this.logger.fatal('Worker must shutdown to Fatal Error', err); + this.shutdown(false); + } finally { + running = false; } - running = false; }; await new Promise((resolve) => { @@ -114,6 +115,7 @@ class Worker { const msg = await this.client.waitForSlice(() => this.isShuttingDown); if (!msg) { + this.logger.debug(`${this.workerId} worker is idle`); return; } @@ -140,6 +142,10 @@ class Worker { this.logger.error(`slice run error for execution ${exId}`, err); } + if (err.fatalError) { + throw err; + } + await this.client.sendSliceComplete({ slice: this.slice.slice, analytics: this.slice.analyticsData, @@ -154,9 +160,11 @@ class Worker { async shutdown(block = true) { if (this.isShutdown) return; if (!this.isInitialized) return; - if (this.isShuttingDown && block) { - this.logger.debug('worker shutdown was called but it was already shutting down, will block until done'); - await waitForWorkerShutdown(this.context, 'worker:shutdown:complete'); + if (this.isShuttingDown) { + this.logger.debug(`worker shutdown was called but it was already shutting down ${block ? ', will block until done' : ''}`); + if (block) { + await waitForWorkerShutdown(this.context, 'worker:shutdown:complete'); + } return; } @@ -165,6 +173,9 @@ class Worker { this.isShuttingDown = true; const shutdownErrs = []; + const pushError = (err) => { + shutdownErrs.push(err); + }; this.logger.warn(`worker shutdown was called for execution ${exId}`); @@ -182,29 +193,15 @@ class Worker { await Promise.all([ (async () => { - try { - await Promise.map(_.values(this.stores), (store) => { - // attempt to shutdown but if it takes longer than shutdown_timeout, cleanup - const forceShutdown = true; - return store.shutdown(forceShutdown); - }); - } catch (err) { - shutdownErrs.push(err); - } + const stores = Object.values(this.stores); + await Promise.map(stores, store => store.shutdown(true) + .catch(pushError)); })(), (async () => { - try { - await this.slice.shutdown(); - } catch (err) { - shutdownErrs.push(err); - } + await this.slice.shutdown().catch(pushError); })(), (async () => { - try { - await this.client.shutdown(); - } catch (err) { - shutdownErrs.push(err); - } + await this.client.shutdown().catch(pushError); })() ]); diff --git a/packages/teraslice/lib/workers/worker/slice.js b/packages/teraslice/lib/workers/worker/slice.js index ceeada8189d..d8aa2c44b60 100644 --- a/packages/teraslice/lib/workers/worker/slice.js +++ b/packages/teraslice/lib/workers/worker/slice.js @@ -42,15 +42,23 @@ class Slice { let result; let remaining = maxTries; + let sliceSuccess = false; try { result = await retry(() => { remaining -= 1; return this._runOnce(remaining > 0); }, retryOptions); + + sliceSuccess = true; await this._markCompleted(); } catch (err) { - await this._markFailed(err); + // avoid incorrectly marking + // the slice as failed when it fails + // to mark it as "complete" + if (!sliceSuccess) { + await this._markFailed(err); + } throw err; } finally { await this._logAnalytics(result && result.analytics); @@ -80,7 +88,7 @@ class Slice { try { await this.analyticsStore.log(executionContext, slice, analyticsData); } catch (_err) { - throw new Error('Failure to update analytics, caused by ', _err); + throw new Error(prependErrorMsg('Failure to update analytics', _err)); } } @@ -90,7 +98,10 @@ class Slice { try { await this.stateStore.updateState(slice, 'completed'); } catch (_err) { - throw new Error(prependErrorMsg('Failure to update success state', _err)); + const err = new Error(prependErrorMsg('Failure to update success state', _err)); + // set fatalError = true to shutdown worker + // error.fatalError = true; + throw err; } this.events.emit('slice:success', slice); @@ -110,7 +121,10 @@ class Slice { try { await stateStore.updateState(slice, 'error', errMsg); } catch (_err) { - throw new Error(prependErrorMsg('Failure to update failed state', _err)); + const error = new Error(prependErrorMsg('Failure to update failed state', _err)); + // set fatalError = true to shutdown worker + // error.fatalError = true; + throw error; } logger.error(err, `slice state for ${this.executionContext.exId} has been marked as error`); @@ -134,8 +148,7 @@ class Slice { } try { - const result = await this.executionContext.runSlice(this.slice); - return result; + return await this.executionContext.runSlice(this.slice); } catch (err) { this.logger.error(`An error has occurred: ${toString(err)}, slice:`, this.slice); @@ -146,7 +159,9 @@ class Slice { await this.executionContext.onSliceRetry(this.slice.slice_id); } catch (retryErr) { - throw new retry.StopError(`Slice failed to retry: ${toString(retryErr)}, caused by: ${toString(err)}`); + const error = new retry.StopError(`Slice failed to retry: ${toString(retryErr)}, caused by: ${toString(err)}`); + error.fatalError = get(retryErr, 'fatalError', false); + throw error; } } diff --git a/packages/teraslice/package.json b/packages/teraslice/package.json index fe75befc781..75a0775059d 100644 --- a/packages/teraslice/package.json +++ b/packages/teraslice/package.json @@ -1,6 +1,6 @@ { "name": "teraslice", - "version": "0.46.1", + "version": "0.46.2", "description": "Slice and dice your Elasticsearch data", "bin": "service.js", "main": "index.js", @@ -38,7 +38,7 @@ "@terascope/error-parser": "^1.0.2", "@terascope/job-components": "^0.14.3", "@terascope/queue": "^1.1.6", - "@terascope/teraslice-messaging": "^0.2.6", + "@terascope/teraslice-messaging": "^0.3.0", "async-mutex": "^0.1.3", "barbe": "^3.0.15", "bluebird": "^3.5.3", @@ -61,7 +61,7 @@ "shortid": "^2.2.13", "socket.io": "^1.7.4", "socket.io-client": "^1.7.4", - "terafoundation": "^0.5.0", + "terafoundation": "^0.5.1", "uuid": "^3.3.2", "yargs": "^12.0.2" }, @@ -70,11 +70,11 @@ "archiver": "^3.0.0", "bufferstreams": "^2.0.1", "chance": "^1.0.18", - "elasticsearch": "^15.1.1", + "elasticsearch": "^15.3.0", "eslint": "^5.12.0", "eslint-config-airbnb-base": "^13.1.0", "eslint-plugin-import": "^2.14.0", - "got": "^9.5.0", + "got": "^9.5.1", "jest": "^23.6.0", "jest-extended": "^0.11.0", "jest-fixtures": "^0.6.0", diff --git a/packages/teraslice/test/workers/execution-controller/execution-controller-spec.js b/packages/teraslice/test/workers/execution-controller/execution-controller-spec.js index dfb896b6410..2ede30b329b 100644 --- a/packages/teraslice/test/workers/execution-controller/execution-controller-spec.js +++ b/packages/teraslice/test/workers/execution-controller/execution-controller-spec.js @@ -82,6 +82,183 @@ describe('ExecutionController', () => { }); }); + describe('when the slice failure watch dog is started', () => { + let testContext; + let exStore; + let exController; + const probationWindow = 500; + + beforeEach(async () => { + const port = await findPort(); + + testContext = new TestContext({ + assignment: 'execution_controller', + slicerPort: port, + probationWindow + }); + + await testContext.initialize(true); + await testContext.addClusterMaster(); + + exController = new ExecutionController( + testContext.context, + testContext.executionContext, + ); + + await exController.initialize(); + + await testContext.addExStore(); + ({ exStore } = testContext.stores); + + testContext.attachCleanup(() => exController.shutdown() + .catch(() => { /* ignore-error */ })); + }); + + afterEach(() => testContext.cleanup()); + + it('should handle the probation period correctly', async () => { + exController.executionAnalytics.increment('processed'); + exController.executionAnalytics.increment('failed'); + + expect(exController.sliceFailureInterval).toBeNil(); + await exController._startSliceFailureWatchDog(); + + expect(exController.sliceFailureInterval).not.toBeNil(); + + // should be able to call slice watch again without resetting the interval + const { sliceFailureInterval } = exController; + + await exController._startSliceFailureWatchDog(); + expect(exController.sliceFailureInterval).toBe(sliceFailureInterval); + + await expect(exStore.getStatus(testContext.exId)) + .resolves.toEqual('failing'); + + await Promise.delay(probationWindow + 100); + + // should be able to setr the status back to running if more slices are processed + exController.executionAnalytics.increment('processed'); + + await Promise.delay(probationWindow + 100); + + await expect(exStore.getStatus(testContext.exId)) + .resolves.toEqual('running'); + + expect(exController.sliceFailureInterval).toBeNil(); + + await exController._startSliceFailureWatchDog(); + expect(exController.sliceFailureInterval).not.toBeNil(); + }); + }); + + describe('when testing setFailingStatus', () => { + let testContext; + let exController; + + beforeEach(async () => { + testContext = new TestContext({ + assignment: 'execution_controller', + }); + + await testContext.initialize(); + + exController = new ExecutionController( + testContext.context, + testContext.executionContext, + ); + }); + + afterEach(() => testContext.cleanup()); + + describe('when it fails to set the status', () => { + it('should log the error twice', async () => { + const logErr = jest.fn(); + const setStatus = jest.fn().mockRejectedValue(new Error('Uh oh')); + const errMeta = { error: 'metadata' }; + const executionMetaData = jest.fn().mockReturnValue(errMeta); + + exController.stores = { + exStore: { + setStatus, + executionMetaData, + } + }; + exController.logger.error = logErr; + + const stats = exController.executionAnalytics.getAnalytics(); + await exController.setFailingStatus(); + + expect(setStatus).toHaveBeenCalledWith(testContext.exId, 'failing', errMeta); + expect(executionMetaData).toHaveBeenCalledWith(stats, `execution ${testContext.exId} has encountered a processing error`); + expect(logErr).toHaveBeenCalledTimes(2); + }); + }); + }); + + describe('when testing _terminalError', () => { + let testContext; + let exController; + + beforeEach(async () => { + testContext = new TestContext({ + assignment: 'execution_controller', + }); + + await testContext.initialize(); + + exController = new ExecutionController( + testContext.context, + testContext.executionContext, + ); + }); + + afterEach(() => testContext.cleanup()); + + describe('when it fails to set the status', () => { + it('should log the error twice', async () => { + const logErr = jest.fn(); + const logFatal = jest.fn(); + const setStatus = jest.fn().mockRejectedValue(new Error('Uh oh')); + const errMeta = { error: 'metadata' }; + const executionMetaData = jest.fn().mockReturnValue(errMeta); + + exController.stores = { + exStore: { + setStatus, + executionMetaData, + } + }; + exController.logger.error = logErr; + exController.logger.fatal = logFatal; + + const stats = exController.executionAnalytics.getAnalytics(); + await exController._terminalError('Uh oh'); + expect(exController.slicerFailed).toBeTrue(); + + expect(setStatus).toHaveBeenCalledWith(testContext.exId, 'failed', errMeta); + const errMsg = `slicer for ex ${testContext.exId} had an error, shutting down execution, caused by Uh oh`; + expect(executionMetaData).toHaveBeenCalledWith(stats, errMsg); + + expect(logErr).toHaveBeenCalledTimes(2); + expect(logFatal).toHaveBeenCalledWith(`execution ${testContext.exId} is ended because of slice failure`); + }); + }); + + describe('when the execution is already done', () => { + it('should not do anything', async () => { + exController.isExecutionDone = true; + + const logErr = jest.fn(); + exController.logger.error = logErr; + + await exController._terminalError(); + + expect(exController.slicerFailed).toBeFalsy(); + expect(logErr).not.toHaveBeenCalled(); + }); + }); + }); + describe('when testing shutdown', () => { let testContext; let exController; diff --git a/packages/teraslice/test/workers/helpers/configs.js b/packages/teraslice/test/workers/helpers/configs.js index d39abba700b..dcc956214df 100644 --- a/packages/teraslice/test/workers/helpers/configs.js +++ b/packages/teraslice/test/workers/helpers/configs.js @@ -69,6 +69,7 @@ const newConfig = (options = {}) => { slicers = 1, recoveredExecution, recoveredSliceType, + probationWindow = 5000, } = options; return { @@ -86,7 +87,8 @@ const newConfig = (options = {}) => { job_id: newId('job-id', true), node_id: newId('node-id', true), slicer_port: slicerPort, - slicer_hostname: 'localhost' + slicer_hostname: 'localhost', + probation_window: probationWindow, }; }; diff --git a/packages/utils/package.json b/packages/utils/package.json index d5718937345..3f789178c7c 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -44,7 +44,7 @@ "jest-extended": "^0.11.0", "rimraf": "^2.6.3", "ts-jest": "^23.10.5", - "tslint": "^5.12.0", + "tslint": "^5.12.1", "tslint-config-airbnb": "^5.11.1", "typescript": "^3.2.2" } diff --git a/yarn.lock b/yarn.lock index 65478fd8f41..9df95aba557 100644 --- a/yarn.lock +++ b/yarn.lock @@ -49,12 +49,12 @@ reflect-metadata "^0.1.12" tslib "^1.8.1" -"@lerna/add@3.10.1": - version "3.10.1" - resolved "https://registry.yarnpkg.com/@lerna/add/-/add-3.10.1.tgz#9668a696cafe1056d27f8fe4a51c6dc89cbad5ae" - integrity sha512-H6rPK13BWC6Hf108C/zoXsg+nf1/osp3PWP1k9DsulLr1OWMrpFqFNa2StQHqbbPL2K0FDFeoswcOL6AxpZRrg== +"@lerna/add@3.10.5": + version "3.10.5" + resolved "https://registry.yarnpkg.com/@lerna/add/-/add-3.10.5.tgz#10dcd1069eee18a84432f826a38d6791af8a2fef" + integrity sha512-T3d9FnSyBOYnM/a1j5Sa65SGOTgnv04HG7Y2lRWJcF6PvOoTsozYW0izi/vLAnAt/DvGhYf2morXkWS8AbIeDg== dependencies: - "@lerna/bootstrap" "3.10.1" + "@lerna/bootstrap" "3.10.5" "@lerna/command" "3.10.0" "@lerna/filter-options" "3.10.1" "@lerna/npm-conf" "3.7.0" @@ -73,10 +73,10 @@ "@lerna/validation-error" "3.6.0" libnpm "^2.0.1" -"@lerna/bootstrap@3.10.1": - version "3.10.1" - resolved "https://registry.yarnpkg.com/@lerna/bootstrap/-/bootstrap-3.10.1.tgz#53d349ae9971505ddd3e637359a64eebb8a18a2a" - integrity sha512-tI6Vt3ewW1Z9Yfv3pFQG0gmbuI8cjo578Ohg5KJQSrMRF+Bm4uuSxJiJ+aqz0xz2OnRT48YYO3GOIJTlhi5wXA== +"@lerna/bootstrap@3.10.5": + version "3.10.5" + resolved "https://registry.yarnpkg.com/@lerna/bootstrap/-/bootstrap-3.10.5.tgz#f0f40de3d1f993ee835b93632fb181aeea7cc2ea" + integrity sha512-WMUfysmX2WFkOzWcpv0mW6Kw91Zsuq9Ecz/TIT4q3FywvABD0mrWbcDXSyrxMspxDEOtPqM/Lk9nm6F9M98kbg== dependencies: "@lerna/batch-packages" "3.10.0" "@lerna/command" "3.10.0" @@ -86,7 +86,7 @@ "@lerna/package-graph" "3.10.0" "@lerna/pulse-till-done" "3.7.1" "@lerna/rimraf-dir" "3.10.0" - "@lerna/run-lifecycle" "3.10.0" + "@lerna/run-lifecycle" "3.10.5" "@lerna/run-parallel-batches" "3.0.0" "@lerna/symlink-binary" "3.10.0" "@lerna/symlink-dependencies" "3.10.0" @@ -102,16 +102,16 @@ read-package-tree "^5.1.6" semver "^5.5.0" -"@lerna/changed@3.10.1": - version "3.10.1" - resolved "https://registry.yarnpkg.com/@lerna/changed/-/changed-3.10.1.tgz#efb110a2eb528f335549edf84e652f8468a26493" - integrity sha512-GlAkOUhQQw6Xaf9HuB1Vwrf//ODZ9S45ZjoDFZWwf+13QkIG3ywNvg7+Cfq/3wdlvarIGc30MQEehku0mazVoA== +"@lerna/changed@3.10.5": + version "3.10.5" + resolved "https://registry.yarnpkg.com/@lerna/changed/-/changed-3.10.5.tgz#8bba2782d2871c4ba1eca5c2a682cc9f18f2103a" + integrity sha512-Uy3VWzjmGg2CjKRTW9os+R6Itg3LVJ6CjczeOsOFwSN4JMdNoObUnCTSdCCTUF/+hQNAoSnkw3+C8dC5FPL1Zw== dependencies: "@lerna/collect-updates" "3.10.1" "@lerna/command" "3.10.0" "@lerna/listable" "3.10.0" "@lerna/output" "3.6.0" - "@lerna/version" "3.10.1" + "@lerna/version" "3.10.5" "@lerna/check-working-tree@3.10.0": version "3.10.0" @@ -397,12 +397,12 @@ signal-exit "^3.0.2" write-pkg "^3.1.0" -"@lerna/npm-publish@3.10.0": - version "3.10.0" - resolved "https://registry.yarnpkg.com/@lerna/npm-publish/-/npm-publish-3.10.0.tgz#3cf133602833cceeb1c06a77f3c345fac2ba0465" - integrity sha512-VceSHFISfZamuRhTx94HKjkoKjNiubw1iLzwHGhkCp4s6cHWwZ0vuE5eopdb61akpcEiavdSwRq0k0MNiiGMzg== +"@lerna/npm-publish@3.10.5": + version "3.10.5" + resolved "https://registry.yarnpkg.com/@lerna/npm-publish/-/npm-publish-3.10.5.tgz#b2eb47cd7f3d1cdbfe32a13140017348ffe0e204" + integrity sha512-6wpgTfu5A5jJeB8RnH2n01HzfaB4Y9aKC0Tq0AAkw37PZ12LTgEL9I+ZZPqhUVFIFLB8/Ekpnj3AcKznJLG5xQ== dependencies: - "@lerna/run-lifecycle" "3.10.0" + "@lerna/run-lifecycle" "3.10.5" figgy-pudding "^3.5.1" fs-extra "^7.0.0" libnpm "^2.0.1" @@ -423,14 +423,14 @@ dependencies: libnpm "^2.0.1" -"@lerna/pack-directory@3.10.0": - version "3.10.0" - resolved "https://registry.yarnpkg.com/@lerna/pack-directory/-/pack-directory-3.10.0.tgz#4f09218d6a15e689dc579c47ce810e70fdec86a2" - integrity sha512-pcGO2BZRlQbRR5Xj+r4qIROT0Lvb7Ks1Z+MuaIAukEzRemAvWpjEYTyWeWxKHxzDsZ0eUpWGnm6WQTzI/TByQQ== +"@lerna/pack-directory@3.10.5": + version "3.10.5" + resolved "https://registry.yarnpkg.com/@lerna/pack-directory/-/pack-directory-3.10.5.tgz#9bdabceacb74e1f54e47bae925e193978f2aae51" + integrity sha512-Ulj24L9XdgjJIxBr6ZjRJEoBULVH3c10lqunUdW41bswXhzhirRtQIxv0+5shngNjDwgMmJfOBcuCVKPSez4tg== dependencies: "@lerna/get-packed" "3.7.0" "@lerna/package" "3.7.2" - "@lerna/run-lifecycle" "3.10.0" + "@lerna/run-lifecycle" "3.10.5" figgy-pudding "^3.5.1" libnpm "^2.0.1" npm-packlist "^1.1.12" @@ -481,10 +481,10 @@ inquirer "^6.2.0" libnpm "^2.0.1" -"@lerna/publish@3.10.1": - version "3.10.1" - resolved "https://registry.yarnpkg.com/@lerna/publish/-/publish-3.10.1.tgz#fe994503c0917730042c39a45121e3f3ca4a223f" - integrity sha512-wDWcXW/7n8M+cnVHM/Gcr8+p1GpN1cOmHFUa8ykVFAeVnAW/nDd7qAeg4pOsOR5uxCrpY9IuWQQVrip0BJwl1w== +"@lerna/publish@3.10.5": + version "3.10.5" + resolved "https://registry.yarnpkg.com/@lerna/publish/-/publish-3.10.5.tgz#70da53112325172a109707a21ecf5b1d6fb40e0a" + integrity sha512-26wjTtRbcUXlG8Na7goI0X1trMYivbuLT1bAXHNvuDaHYs7iE6LRjU4NCTNAmrdVnqagHkTxMuGRFn3r1NgcKg== dependencies: "@lerna/batch-packages" "3.10.0" "@lerna/check-working-tree" "3.10.0" @@ -495,15 +495,15 @@ "@lerna/log-packed" "3.6.0" "@lerna/npm-conf" "3.7.0" "@lerna/npm-dist-tag" "3.8.5" - "@lerna/npm-publish" "3.10.0" + "@lerna/npm-publish" "3.10.5" "@lerna/output" "3.6.0" - "@lerna/pack-directory" "3.10.0" + "@lerna/pack-directory" "3.10.5" "@lerna/prompt" "3.6.0" "@lerna/pulse-till-done" "3.7.1" - "@lerna/run-lifecycle" "3.10.0" + "@lerna/run-lifecycle" "3.10.5" "@lerna/run-parallel-batches" "3.0.0" "@lerna/validation-error" "3.6.0" - "@lerna/version" "3.10.1" + "@lerna/version" "3.10.5" figgy-pudding "^3.5.1" fs-extra "^7.0.0" libnpm "^2.0.1" @@ -539,10 +539,10 @@ path-exists "^3.0.0" rimraf "^2.6.2" -"@lerna/run-lifecycle@3.10.0": - version "3.10.0" - resolved "https://registry.yarnpkg.com/@lerna/run-lifecycle/-/run-lifecycle-3.10.0.tgz#47a1988313c59a612ee7475e5accd3bd015cd9ae" - integrity sha512-awMdASrTetQKGgLMDlusLsw/QQumzrT055U31CfRdBV4U+kfWjVGIR25MKvXRJPG1yOH1Xf6HduyYgZVc8vgCA== +"@lerna/run-lifecycle@3.10.5": + version "3.10.5" + resolved "https://registry.yarnpkg.com/@lerna/run-lifecycle/-/run-lifecycle-3.10.5.tgz#ea4422bb70c0f8d4382ecb2a626c8ba0ca88550b" + integrity sha512-YPmXviaxVlhcKM6IkDTIpTq24mxOuMCilo+MTr1RLoafgB9ZTmP2AHRiFt/sy14wOsq2Zqr0wJyj8KFlDYLTkA== dependencies: "@lerna/npm-conf" "3.7.0" figgy-pudding "^3.5.1" @@ -606,10 +606,10 @@ dependencies: libnpm "^2.0.1" -"@lerna/version@3.10.1": - version "3.10.1" - resolved "https://registry.yarnpkg.com/@lerna/version/-/version-3.10.1.tgz#7d33b1c086879cbdb7329264f28547e5444733e9" - integrity sha512-JrUz37xvvJFCC5M/xNaKMVOJ1Q8Y5d5TlR+3kZFn2qmWX87yYJJHNKzuBAxE5QU4oHjz3ED0qH1LXspSCjl3mg== +"@lerna/version@3.10.5": + version "3.10.5" + resolved "https://registry.yarnpkg.com/@lerna/version/-/version-3.10.5.tgz#233b41a679d3ec020ea85d00d45cba8c22a27ba7" + integrity sha512-I6KynsrWvtusylggw+XmlfUud26ncfUctbn8hUQsofkxiouuElx1fUU4rEsOaonxvNk09bwlsGmfbIFsPeN6Hg== dependencies: "@lerna/batch-packages" "3.10.0" "@lerna/check-working-tree" "3.10.0" @@ -619,7 +619,7 @@ "@lerna/conventional-commits" "3.10.0" "@lerna/output" "3.6.0" "@lerna/prompt" "3.6.0" - "@lerna/run-lifecycle" "3.10.0" + "@lerna/run-lifecycle" "3.10.5" "@lerna/validation-error" "3.6.0" chalk "^2.3.1" dedent "^0.7.0" @@ -664,10 +664,10 @@ resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.7.0.tgz#9a06f4f137ee84d7df0460c1fdb1135ffa6c50fd" integrity sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow== -"@szmarczak/http-timer@^1.1.0": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.1.tgz#6402258dfe467532b26649ef076b4d11f74fb612" - integrity sha512-WljfOGkmSJe8SUkl+4TPvN2ec0dpUGVyfTBQLoXJUiILs+wBSc4Kvp2N3aAWE4VwwDSLGdmD3/bufS5BgZpVSQ== +"@szmarczak/http-timer@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421" + integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA== dependencies: defer-to-connect "^1.0.1" @@ -841,7 +841,7 @@ agent-base@4, agent-base@^4.1.0, agent-base@~4.2.0: dependencies: es6-promisify "^5.0.0" -agentkeepalive@^3.4.1: +agentkeepalive@^3.4.1, agentkeepalive@^3.5.1: version "3.5.2" resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-3.5.2.tgz#a113924dd3fa24a0bc3b78108c450c2abee00f67" integrity sha512-e0L/HNe6qkQ7H19kTlRRqUibEAwDK5AFk6y3PtMsuut2VAH6+Q4xZml1tNDJD7kSAyqmbG/K08K5WEJYtUrSlQ== @@ -856,7 +856,7 @@ aggregate-error@^1.0.0: clean-stack "^1.0.0" indent-string "^3.0.0" -ajv@^6.5.3, ajv@^6.5.5, ajv@^6.6.1: +ajv@^6.5.3, ajv@^6.6.1: version "6.6.1" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.6.1.tgz#6360f5ed0d80f232cc2b294c362d5dc2e538dd61" integrity sha512-ZoJjft5B+EJBjUyu9C9Hc0OZyPZSSlOF+plzouTrg6UlA8f+e/n8NIgBFG/9tppJtpPWfthHakK7juJdNDODww== @@ -866,6 +866,16 @@ ajv@^6.5.3, ajv@^6.5.5, ajv@^6.6.1: json-schema-traverse "^0.4.1" uri-js "^4.2.2" +ajv@^6.5.5: + version "6.7.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.7.0.tgz#e3ce7bb372d6577bb1839f1dfdfcbf5ad2948d96" + integrity sha512-RZXPviBTtfmtka9n9sy1N5M5b82CbxWIR6HIis4s3WQTXDJamc/0gpCWNGz6EWdWp4DOfjzJfhz/AS9zVPjjWg== + dependencies: + fast-deep-equal "^2.0.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + ansi-escapes@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.1.0.tgz#f73207bb81207d75fd6c83f125af26eea378ca30" @@ -1670,10 +1680,10 @@ cacheable-request@^2.1.1: normalize-url "2.0.1" responselike "1.0.2" -cacheable-request@^5.1.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-5.2.0.tgz#00c87097835af4caf92a97390660ecadce51187d" - integrity sha512-h1n0vjpFaByTvU6PiyTKk2kx4OnuV1aVUynCUd/FiKl4icpPSceowk3rHczwFEBuZvz+E1EU4KExR0MCPeQfaQ== +cacheable-request@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.0.0.tgz#4a1727414e02ac4af82560c4da1b61daa3fa2b63" + integrity sha512-2N7AmszH/WPPpl5Z3XMw1HAP+8d+xugnKQAeKvxFZ/04dbT/CAznqwbl+7eSr3HkwdepNwtb2yx3CAMQWvG01Q== dependencies: clone-response "^1.0.2" get-stream "^4.0.0" @@ -1898,15 +1908,6 @@ cli-width@^2.0.0: resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= -cliui@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" - integrity sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0= - dependencies: - string-width "^1.0.1" - strip-ansi "^3.0.1" - wrap-ansi "^2.0.0" - cliui@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" @@ -2213,18 +2214,6 @@ convert-source-map@^1.4.0, convert-source-map@^1.5.1: dependencies: safe-buffer "~5.1.1" -convict@^4.3.2: - version "4.4.0" - resolved "https://registry.yarnpkg.com/convict/-/convict-4.4.0.tgz#3723d3050fabf8e3ea773bd725fd52caf1a37bf0" - integrity sha512-7STJN+UtDR6X+JQdyWo0p6YbOqKNh8KnAeqgPglQTWQYZbClyltp502pyXSPHeDZQT5+j4RD8OdaNNHzX36Lrg== - dependencies: - depd "1.1.2" - json5 "1.0.1" - lodash.clonedeep "4.5.0" - moment "2.22.2" - validator "10.4.0" - yargs-parser "10.1.0" - convict@^4.4.1: version "4.4.1" resolved "https://registry.yarnpkg.com/convict/-/convict-4.4.1.tgz#87f93c2a4f51bfc961e2873864442d0349a1b0d0" @@ -2336,32 +2325,32 @@ cssstyle@^1.0.0: dependencies: cssom "0.3.x" -csv-generate@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/csv-generate/-/csv-generate-2.2.2.tgz#c37808c5f3ead2deec940794073dd32d492adfd1" - integrity sha512-ETG8JGG0xOt2f1JzxrAcQONVc4+7srUdXeyLnow60ntBr+qiNCFTqi+ME6g0vZ4hMCbrwNrDPJPOYVznAeDDHQ== - -csv-parse@^3.1.2: +csv-generate@^3.2.0: version "3.2.0" - resolved "https://registry.yarnpkg.com/csv-parse/-/csv-parse-3.2.0.tgz#9043b5921e7ecd5e3110947df1ef00d290dbeca7" - integrity sha512-1IBQ7PYHc5h6AXS4nyGsmicttbpUbNvlsgKxhvouh+kRaVug8xBWSiIeWdbPUQgjKG88hEGYjdU29fX73mo+6Q== + resolved "https://registry.yarnpkg.com/csv-generate/-/csv-generate-3.2.0.tgz#17c0defbad71bfe63182cd3c41c972138ce0b300" + integrity sha512-ZdS2KrgoLxm1guL9XhuaZX223Tiorldvl9QC0M/gihcrJavNDokAp/rX3CyyRHpK+rImxEE3L47cHe7npQMkkg== -csv-stringify@^4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/csv-stringify/-/csv-stringify-4.3.1.tgz#7bee36f746ef555dd481a735a9e2938965f8478b" - integrity sha512-VRjPYIUzex5kfbsOY7LaJcNE2qMWGQQAanb3/Vv85WbOgA+dAfDNfwntRvv335icJgGYrnTX403WxJxRVpLDFA== +csv-parse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/csv-parse/-/csv-parse-4.3.0.tgz#e27cc1c4c5426201a896389c9f97273a0d47dad4" + integrity sha512-vrZTSMG/6a5EI30ICFU8IQ1kR3xXXoC3Z7jaUv76E5uCgFahr2sffRoTAffvEd1JZNssAgalI4DaEFUnXqQCGw== + +csv-stringify@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/csv-stringify/-/csv-stringify-5.1.2.tgz#0c594ff13f3ae30d40348805eeb0d1f4faf1d9c2" + integrity sha512-rvNEMy8IwVe/gnCjnF4a/3cxKPm8oaAZEBB8RIzlx9HcNrLrn3NlgacUIFZBRH86tKF76WVA13nkFF0mX7G2EQ== dependencies: lodash.get "~4.4.2" -csv@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/csv/-/csv-4.0.0.tgz#c7de44b9a0fd47f7a10db24064519f642a7ce92d" - integrity sha512-rj3+HMMIKskeiipg0VkFSx7o8FhrNSfIb1nLT6AkJ0gx7mdGU5JsJGv4tmk0vl1jV/h/TfWJOwh1tpbbhVqNKA== +csv@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/csv/-/csv-5.1.1.tgz#bd715f15a4ed9141309a24ec6dab1c903ab79f92" + integrity sha512-gezB9D+enrh2tLj+vsAD8JyYRMIJdSMpec/Pgbb+7YRj6Q6/D12HLSwjhx+CrirRT4dESjZYXWX1JfqlV4RlTA== dependencies: - csv-generate "^2.2.2" - csv-parse "^3.1.2" - csv-stringify "^4.3.1" - stream-transform "^1.0.7" + csv-generate "^3.2.0" + csv-parse "^4.3.0" + csv-stringify "^5.1.2" + stream-transform "^1.0.8" currently-unhandled@^0.4.1: version "0.4.1" @@ -2847,22 +2836,10 @@ elasticsearch@^12.1.0: lodash "^4.12.0" promise "^7.1.1" -elasticsearch@^14.2.1: - version "14.2.2" - resolved "https://registry.yarnpkg.com/elasticsearch/-/elasticsearch-14.2.2.tgz#6bbb63b19b17fa97211b22eeacb0f91197f4d6b6" - integrity sha1-a7tjsZsX+pchGyLurLD5EZf01rY= - dependencies: - agentkeepalive "^3.4.1" - chalk "^1.0.0" - lodash "2.4.2" - lodash.get "^4.4.2" - lodash.isempty "^4.4.0" - lodash.trimend "^4.5.1" - -elasticsearch@^15.1.1: - version "15.2.0" - resolved "https://registry.yarnpkg.com/elasticsearch/-/elasticsearch-15.2.0.tgz#234362b5aa743d9c0a925566569ea7813b8f2569" - integrity sha512-jOFcBoEh3Sn3gjUTozInODZTLriJtfppAUC7jnQCUE+OUj8o7GoAyC+L4h/L3ZxmXNFbQCunqVR+nmSofHdo9A== +elasticsearch@^15.3.0: + version "15.3.0" + resolved "https://registry.yarnpkg.com/elasticsearch/-/elasticsearch-15.3.0.tgz#7a478d23e8af02b60fd03201f1c65fd5657bf7d3" + integrity sha512-anZpNB65mqr0aKAN/YPR5OFmD09KnbxBxzyc5vINkip6ECpyCSvBqCKbQNNY/FNwKop2urkRmtnU2sY5cVw1cw== dependencies: agentkeepalive "^3.4.1" chalk "^1.0.0" @@ -3212,19 +3189,6 @@ exec-sh@^0.2.0: dependencies: merge "^1.2.0" -execa@^0.10.0: - version "0.10.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-0.10.0.tgz#ff456a8f53f90f8eccc71a96d11bdfc7f082cb50" - integrity sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw== - dependencies: - cross-spawn "^6.0.0" - get-stream "^3.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" - execa@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" @@ -4012,14 +3976,14 @@ got@^8.3.2: url-parse-lax "^3.0.0" url-to-options "^1.0.1" -got@^9.5.0: - version "9.5.0" - resolved "https://registry.yarnpkg.com/got/-/got-9.5.0.tgz#6fd0312c6b694c0a11d9119d95fd7daed174eb49" - integrity sha512-N+4kb6i9t1lauJ4NwLVVoFVLxZNa6i+iivtNzCSVw7+bVbTXoq0qXctdd8i9rj3lrI0zDk5NGzcO4bfpEP6Uuw== +got@^9.5.1: + version "9.5.1" + resolved "https://registry.yarnpkg.com/got/-/got-9.5.1.tgz#9cd83c64978225790c5142fc4e492cdea01256ef" + integrity sha512-a6UC2YXj3UPQT3UOzCCovwna4WPpN/OBAiiPSUwQ9gFranGs8HQjidyRmen2esBVlauqLWDbMwSTFDtxYNUv+g== dependencies: "@sindresorhus/is" "^0.14.0" - "@szmarczak/http-timer" "^1.1.0" - cacheable-request "^5.1.0" + "@szmarczak/http-timer" "^1.1.2" + cacheable-request "^6.0.0" decompress-response "^3.3.0" duplexer3 "^0.1.4" get-stream "^4.1.0" @@ -5239,7 +5203,7 @@ js-yaml@3.9.1: argparse "^1.0.7" esprima "^4.0.0" -js-yaml@^3.10.0, js-yaml@^3.11.0, js-yaml@^3.12.0, js-yaml@^3.7.0, js-yaml@^3.9.0: +js-yaml@^3.10.0, js-yaml@^3.12.0, js-yaml@^3.7.0, js-yaml@^3.9.0: version "3.12.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.0.tgz#eaed656ec8344f10f527c6bfa1b6e2244de167d1" integrity sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A== @@ -5247,6 +5211,14 @@ js-yaml@^3.10.0, js-yaml@^3.11.0, js-yaml@^3.12.0, js-yaml@^3.7.0, js-yaml@^3.9. argparse "^1.0.7" esprima "^4.0.0" +js-yaml@^3.12.1: + version "3.12.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.1.tgz#295c8632a18a23e054cf5c9d3cecafe678167600" + integrity sha512-um46hB9wNOKlwkHgiuyEVAybXBjwFUV0Z/RaHJblRd9DXltue9FTYvzCr9ErQrK9Adz5MU4gHWVaNUfdmrC8qA== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + js2xmlparser@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/js2xmlparser/-/js2xmlparser-3.0.0.tgz#3fb60eaa089c5440f9319f51760ccd07e2499733" @@ -5543,14 +5515,14 @@ lerna-alias@^3.0.2: dependencies: get-lerna-packages "^0.1.0" -lerna@^3.10.1: - version "3.10.1" - resolved "https://registry.yarnpkg.com/lerna/-/lerna-3.10.1.tgz#9a76f1264796a3115ccbc5177f2330fb50c59184" - integrity sha512-zZ1pVy+aQTmPA4ezaIRALCMAc06TjawcB7PfpSHrlhWxQwv30rq7Fd26+cED5FTbDxmJYyD7a2vdaRlNKZW6bw== +lerna@^3.10.5: + version "3.10.5" + resolved "https://registry.yarnpkg.com/lerna/-/lerna-3.10.5.tgz#6cc0ba2919bb4da016714ec53451b301d78be783" + integrity sha512-rJ67oqEiF8AVw+9phKbGkC0k0oqu1rdnmzrIfVS40EQCwEtzBC1ABX1886PBV0N40Pt9wCy6a0Jhrd+PV4IiIQ== dependencies: - "@lerna/add" "3.10.1" - "@lerna/bootstrap" "3.10.1" - "@lerna/changed" "3.10.1" + "@lerna/add" "3.10.5" + "@lerna/bootstrap" "3.10.5" + "@lerna/changed" "3.10.5" "@lerna/clean" "3.10.1" "@lerna/cli" "3.10.0" "@lerna/create" "3.10.0" @@ -5560,9 +5532,9 @@ lerna@^3.10.1: "@lerna/init" "3.10.0" "@lerna/link" "3.10.0" "@lerna/list" "3.10.1" - "@lerna/publish" "3.10.1" + "@lerna/publish" "3.10.5" "@lerna/run" "3.10.1" - "@lerna/version" "3.10.1" + "@lerna/version" "3.10.5" import-local "^1.0.0" libnpm "^2.0.1" @@ -5788,11 +5760,6 @@ lodash.intersection@^4.4.0: resolved "https://registry.yarnpkg.com/lodash.intersection/-/lodash.intersection-4.4.0.tgz#0a11ba631d0e95c23c7f2f4cbb9a692ed178e705" integrity sha1-ChG6Yx0OlcI8fy9Mu5ppLtF45wU= -lodash.isempty@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.isempty/-/lodash.isempty-4.4.0.tgz#6f86cbedd8be4ec987be9aaf33c9684db1b31e7e" - integrity sha1-b4bL7di+TsmHvpqvM8loTbGzHn4= - lodash.isplainobject@^4.0.6: version "4.0.6" resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" @@ -5843,11 +5810,6 @@ lodash.toarray@^4.4.0: resolved "https://registry.yarnpkg.com/lodash.toarray/-/lodash.toarray-4.4.0.tgz#24c4bfcd6b2fba38bfd0594db1179d8e9b656561" integrity sha1-JMS/zWsvuji/0FlNsRedjptlZWE= -lodash.trimend@^4.5.1: - version "4.5.1" - resolved "https://registry.yarnpkg.com/lodash.trimend/-/lodash.trimend-4.5.1.tgz#12804437286b98cad8996b79414e11300114082f" - integrity sha1-EoBENyhrmMrYmWt5QU4RMAEUCC8= - lodash.union@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.union/-/lodash.union-4.6.0.tgz#48bb5088409f16f1821666641c44dd1aaae3cd88" @@ -5858,11 +5820,6 @@ lodash.uniq@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= -lodash@2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-2.4.2.tgz#fadd834b9683073da179b3eae6d9c0d15053f73e" - integrity sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4= - lodash@4.x, lodash@^4.12.0, lodash@^4.13.1, lodash@^4.14.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.2, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.1, lodash@~4.17.11: version "4.17.11" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" @@ -6260,12 +6217,12 @@ modify-values@^1.0.0: resolved "https://registry.yarnpkg.com/modify-values/-/modify-values-1.0.1.tgz#b3939fa605546474e3e3e3c63d64bd43b4ee6022" integrity sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw== -moment@2.22.2, moment@^2.10.6, moment@^2.11.1, moment@^2.15.2, moment@^2.21.0, moment@^2.22.2: +moment@2.22.2, moment@^2.15.2, moment@^2.22.2: version "2.22.2" resolved "https://registry.yarnpkg.com/moment/-/moment-2.22.2.tgz#3c257f9839fc0e93ff53149632239eb90783ff66" integrity sha1-PCV/mDn8DpP/UxSWMiOeuQeD/2Y= -moment@^2.23.0: +moment@^2.10.6, moment@^2.11.1, moment@^2.23.0: version "2.23.0" resolved "https://registry.yarnpkg.com/moment/-/moment-2.23.0.tgz#759ea491ac97d54bac5ad776996e2a58cc1bc225" integrity sha512-3IE39bHVqFbWWaPOMHZF98Q9c3LDKGTmypMiTM2QygGXXElkFWIH7GxfmlwmY2vwa+wmNsoYZmG2iusf1ZjJoA== @@ -6394,7 +6351,12 @@ mv@~2: ncp "~2.0.0" rimraf "~2.4.0" -nan@^2.10.0, nan@^2.4.0, nan@^2.9.2: +nan@^2.10.0: + version "2.12.1" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.12.1.tgz#7b1aa193e9aa86057e3c7bbd0ac448e770925552" + integrity sha512-JY7V6lRkStKcKTvHO5NVSQRv+RV+FIL5pvDoLiAtSL9pKlC5x9PKQcZDsq7m4FO4d57mkhC6Z+QhAh3Jdk5JFw== + +nan@^2.4.0, nan@^2.9.2: version "2.11.1" resolved "https://registry.yarnpkg.com/nan/-/nan-2.11.1.tgz#90e22bccb8ca57ea4cd37cc83d3819b52eea6766" integrity sha512-iji6k87OSXa0CcrLl9z+ZiYSuR2o+c0bGuNmXdrhTQTakxytAFsC56SArGYoiHlJlFoHSnvmhpceZJaXkVuOtA== @@ -6951,11 +6913,11 @@ os-locale@^2.0.0: mem "^1.1.0" os-locale@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.0.1.tgz#3b014fbf01d87f60a1e5348d80fe870dc82c4620" - integrity sha512-7g5e7dmXPtzcP4bgsZ8ixDVqA7oWYuEz4lOSujeWyliPai4gfVDiFIcwBg3aGCPnmSGfzOKTK3ccPn0CKv3DBw== + version "3.1.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a" + integrity sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q== dependencies: - execa "^0.10.0" + execa "^1.0.0" lcid "^2.0.0" mem "^4.0.0" @@ -7024,9 +6986,9 @@ p-limit@^1.1.0: p-try "^1.0.0" p-limit@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.0.0.tgz#e624ed54ee8c460a778b3c9f3670496ff8a57aec" - integrity sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A== + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.1.0.tgz#1d5a0d20fb12707c758a655f6bbc4386b5930d68" + integrity sha512-NhURkNcrVB+8hNfLuysU8enY5xn2KXphsHBaC2YmRNTZRc7RWusw6apSpdEj3jo4CMb6W9nrF6tTnsJsJeyu6g== dependencies: p-try "^2.0.0" @@ -7545,7 +7507,12 @@ pseudomap@^1.0.2: resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= -psl@^1.1.24, psl@^1.1.28: +psl@^1.1.24: + version "1.1.31" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.31.tgz#e9aa86d0101b5b105cbe93ac6b784cd547276184" + integrity sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw== + +psl@^1.1.28: version "1.1.29" resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.29.tgz#60f580d360170bb722a797cc704411e6da850c67" integrity sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ== @@ -8346,14 +8313,14 @@ smart-buffer@^4.0.1: resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.0.1.tgz#07ea1ca8d4db24eb4cac86537d7d18995221ace3" integrity sha512-RFqinRVJVcCAL9Uh1oVqE6FZkqsyLiVOYEZ20TqIOjuX7iFVJ+zsbs4RIghnw/pTs7mZvt8ZHhvm1ZUrR4fykg== -smartwrap@^1.0.10: - version "1.0.10" - resolved "https://registry.yarnpkg.com/smartwrap/-/smartwrap-1.0.10.tgz#873ef350d4ee1262fed4a80a55634d86ae1faf48" - integrity sha512-S4PF1dIxFcMUP68uxIp7F6Cf0pFCQu8bkjsCmoSXAVAOBe2SUKowlLSxSuEtaUEyQLeY24bMb/YgRZJCfAwlCg== +smartwrap@^1.0.11: + version "1.0.11" + resolved "https://registry.yarnpkg.com/smartwrap/-/smartwrap-1.0.11.tgz#ee8f85878bfac89c1fa4da33e0877f729a8e2a74" + integrity sha512-Pa/Vl0SjKM0Lf1ovLsRIUhXwS2nJbir0dmfQyEq696NeEpbAyduIVPTfjcnTbpM4IepUh6LvQMbApfXXccmviQ== dependencies: breakword "^1.0.3" wcwidth "^1.0.1" - yargs "^8.0.1" + yargs "^12.0.5" snapdragon-node@^2.0.1: version "2.1.1" @@ -8555,9 +8522,9 @@ sprintf-js@~1.0.2: integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= sshpk@^1.7.0: - version "1.15.2" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.15.2.tgz#c946d6bd9b1a39d0e8635763f5242d6ed6dcb629" - integrity sha512-Ra/OXQtuh0/enyl4ETZAfTaeksa6BXks5ZcjpSUNrjBr0DvrJKX+1fsKDPpT9TBXgHAFsa4510aNVgI8g/+SzA== + version "1.16.0" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.0.tgz#1d4963a2fbffe58050aa9084ca20be81741c07de" + integrity sha512-Zhev35/y7hRMcID/upReIvRse+I9SVhyVre/KTJSJQWMz3C3+G+HpO7m1wK/yckEtujKZ7dS4hkVxAnmHaIGVQ== dependencies: asn1 "~0.2.3" assert-plus "^1.0.0" @@ -8624,10 +8591,10 @@ stream-shift@^1.0.0: resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" integrity sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI= -stream-transform@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/stream-transform/-/stream-transform-1.0.7.tgz#5135dd6c29941a1179212da6083be2cacdebc15a" - integrity sha512-bp27sM5lf75yOZAM0HfKgN7jub2FApKmXUVYnN/zuw4raqtinM3muxzd+ny262opnKvAg5PnMO66N4Eq928ayw== +stream-transform@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/stream-transform/-/stream-transform-1.0.8.tgz#54f721122d310eca855a16c97939881ab5bbb76c" + integrity sha512-1q+dL790Ps0NV33rISMq9OLtfDA9KMJZdo1PHZXE85orrWsM4FAh8CVyAOTHO0rhyeM138KNPngBPrx33bFsxw== strict-uri-encode@^1.0.0: version "1.1.0" @@ -8898,26 +8865,26 @@ temp-write@^3.4.0: temp-dir "^1.0.0" uuid "^3.0.1" -terafoundation@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/terafoundation/-/terafoundation-0.5.0.tgz#6aab216817b41256cd578d91f252a7a40587b879" - integrity sha512-dSaoe4ROHy59d++hcXxx21tLZeet1LdWH74I6BhvECnjbCzPX9rKdYeKsn+RiG/33nz+p6iuLIPEWJQQ1LhO6Q== +terafoundation@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/terafoundation/-/terafoundation-0.5.1.tgz#4f0d25c653369c720836cf04d7cfe6f33965e482" + integrity sha512-lfzSD8Lh2h5OSGQLRFpX7Rcf0PAy8AHxjCHxGBzlo10bsI8ork49wDTJ4EoR2NAQoV7GU6PuLf4WWS4UO7LbDA== dependencies: - "@terascope/elasticsearch-api" "^1.1.1" - agentkeepalive "^3.4.1" - bluebird "^3.5.2" + "@terascope/elasticsearch-api" "^1.1.4" + agentkeepalive "^3.5.1" + bluebird "^3.5.3" bunyan "^1.8.12" bunyan-elasticsearch "1.0.1" - convict "^4.3.2" - elasticsearch "^14.2.1" - js-yaml "^3.11.0" + convict "^4.4.1" + elasticsearch "^15.3.0" + js-yaml "^3.12.1" lodash "~4.17.11" - moment "^2.21.0" + moment "^2.23.0" mongoose "~4.13.12" node-statsd "0.1.1" node-webhdfs "^0.2.1" redis "^2.8.0" - yargs "^12.0.2" + yargs "^12.0.5" terminal-kit@^1.26.10: version "1.26.10" @@ -9153,10 +9120,10 @@ tslint-microsoft-contrib@~5.2.1: dependencies: tsutils "^2.27.2 <2.29.0" -tslint@^5.12.0: - version "5.12.0" - resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.12.0.tgz#47f2dba291ed3d580752d109866fb640768fca36" - integrity sha512-CKEcH1MHUBhoV43SA/Jmy1l24HJJgI0eyLbBNSRyFlsQvb9v6Zdq+Nz2vEOH00nC5SUx4SneJ59PZUS/ARcokQ== +tslint@^5.12.1: + version "5.12.1" + resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.12.1.tgz#8cec9d454cf8a1de9b0a26d7bdbad6de362e52c1" + integrity sha512-sfodBHOucFg6egff8d1BvuofoOQ/nOeYNfbp7LDlKBcLNrL3lmS5zoiDGyOMdT7YsEXAwWpTdAHwOGOc8eRZAw== dependencies: babel-code-frame "^6.22.0" builtin-modules "^1.1.1" @@ -9192,17 +9159,17 @@ tsutils@^3.0.0, tsutils@^3.1.0: dependencies: tslib "^1.8.1" -tty-table@^2.6.12: - version "2.6.12" - resolved "https://registry.yarnpkg.com/tty-table/-/tty-table-2.6.12.tgz#7e0603de6fb160b0634fd54ef5cb123a41c80383" - integrity sha512-fajXZ7e/P5H8vRjJyrG9MEuzDi6+RHEI+meGw7Qs3Tnqli8+jF1/P3ZO287Ox7G00FImizNuOONcEZKFRKhksQ== +tty-table@^2.6.14: + version "2.6.14" + resolved "https://registry.yarnpkg.com/tty-table/-/tty-table-2.6.14.tgz#99a9dcb935a2adb56923ab75a448019fff0e0d47" + integrity sha512-qxY7SSO5WKjZf14lkh4kE6/VuUeBilKsjXYqFijGIYMV4RtnSuxWS76Gyn2SR2GYeYh5yymzyxQbFJRezqQBBw== dependencies: - chalk "^2.4.1" - csv "^4.0.0" - smartwrap "^1.0.10" + chalk "^2.4.2" + csv "^5.1.1" + smartwrap "^1.0.11" strip-ansi "^5.0.0" wcwidth "^1.0.1" - yargs "^12.0.2" + yargs "^12.0.5" tunnel-agent@^0.6.0: version "0.6.0" @@ -9444,11 +9411,6 @@ validate-npm-package-name@^3.0.0: dependencies: builtins "^1.0.3" -validator@10.4.0: - version "10.4.0" - resolved "https://registry.yarnpkg.com/validator/-/validator-10.4.0.tgz#ee99a44afb3bb5ed350a159f056ca72a204cfc3c" - integrity sha512-Q/wBy3LB1uOyssgNlXSRmaf22NxjvDNZM2MtIQ4jaEOAB61xsh1TQxsq1CgzUMBV1lDrVMogIh8GjG1DYW0zLg== - validator@10.8.0: version "10.8.0" resolved "https://registry.yarnpkg.com/validator/-/validator-10.8.0.tgz#8acb15a5c39411cbc8ef2be0c98c2514da4410a7" @@ -9712,7 +9674,7 @@ yallist@^3.0.0, yallist@^3.0.2: resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9" integrity sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A== -yargs-parser@10.1.0, yargs-parser@10.x: +yargs-parser@10.x: version "10.1.0" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-10.1.0.tgz#7202265b89f7e9e9f2e5765e0fe735a905edbaa8" integrity sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ== @@ -9735,13 +9697,6 @@ yargs-parser@^11.1.1: camelcase "^5.0.0" decamelize "^1.2.0" -yargs-parser@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz#8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9" - integrity sha1-jQrELxbqVd69MyyvTEA4s+P139k= - dependencies: - camelcase "^4.1.0" - yargs-parser@^9.0.2: version "9.0.2" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-9.0.2.tgz#9ccf6a43460fe4ed40a9bb68f48d43b8a68cc077" @@ -9767,7 +9722,7 @@ yargs@^11.0.0: y18n "^3.2.1" yargs-parser "^9.0.2" -yargs@^12.0.1, yargs@^12.0.2: +yargs@^12.0.1, yargs@^12.0.2, yargs@^12.0.5: version "12.0.5" resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13" integrity sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw== @@ -9785,25 +9740,6 @@ yargs@^12.0.1, yargs@^12.0.2: y18n "^3.2.1 || ^4.0.0" yargs-parser "^11.1.1" -yargs@^8.0.1: - version "8.0.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-8.0.2.tgz#6299a9055b1cefc969ff7e79c1d918dceb22c360" - integrity sha1-YpmpBVsc78lp/355wdkY3Osiw2A= - dependencies: - camelcase "^4.1.0" - cliui "^3.2.0" - decamelize "^1.1.1" - get-caller-file "^1.0.1" - os-locale "^2.0.0" - read-pkg-up "^2.0.0" - require-directory "^2.1.1" - require-main-filename "^1.0.1" - set-blocking "^2.0.0" - string-width "^2.0.0" - which-module "^2.0.0" - y18n "^3.2.1" - yargs-parser "^7.0.0" - yauzl@2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.4.1.tgz#9528f442dab1b2284e58b4379bb194e22e0c4005"