diff --git a/package.json b/package.json index ada05c0..e58c68e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@codefresh-io/task-logger", - "version": "1.8.16", + "version": "1.9.0", "description": "Codefresh utilities for working with build logs", "main": "index.js", "scripts": { diff --git a/taskLogger/StepLogger.js b/taskLogger/StepLogger.js index 4faad15..e66ce69 100644 --- a/taskLogger/StepLogger.js +++ b/taskLogger/StepLogger.js @@ -42,6 +42,7 @@ class StepLogger extends EventEmitter { if (this.status === STATUS.PENDING) { this.status = STATUS.RUNNING; this._reportStatus(); + this._reportTitle(); this.setFinishTimestamp(''); this.setCreationTimestamp(+(new Date().getTime() / 1000).toFixed()); @@ -192,6 +193,10 @@ class StepLogger extends EventEmitter { return this.status; } + getTitle() { + return this.title; + } + markPreviouslyExecuted() { if (this.fatal) { return; @@ -258,6 +263,13 @@ class StepLogger extends EventEmitter { this.status = status; return this._reportStatus(); } + + async setTitle(title) { + if (title) { + this.title = title; + await this._reportTitle(); + } + } } module.exports = StepLogger; diff --git a/taskLogger/composition/StepLogger.js b/taskLogger/composition/StepLogger.js index 32f147c..02cf8ee 100644 --- a/taskLogger/composition/StepLogger.js +++ b/taskLogger/composition/StepLogger.js @@ -15,6 +15,7 @@ class CompositionStepLogger extends BaseStepLogger { const restorePromises = this.loggers.map(logger => logger.restore()); await Promise.all(restorePromises); this.status = this.loggers[0].status; + this.title = this.loggers[0].title; this.pendingApproval = this.status === STATUS.PENDING_APPROVAL; } @@ -76,6 +77,13 @@ class CompositionStepLogger extends BaseStepLogger { }); } + async _reportTitle() { + return _.map(this.loggers, (logger) => { + logger.title = this.title; + return logger._reportTitle(); + }); + } + async _reportFinishTimestamp() { return _.map(this.loggers, (logger) => { logger.finishTimeStamp = this.finishTimeStamp; diff --git a/taskLogger/firebase/StepLogger.js b/taskLogger/firebase/StepLogger.js index d145ac5..78e2bcc 100644 --- a/taskLogger/firebase/StepLogger.js +++ b/taskLogger/firebase/StepLogger.js @@ -31,6 +31,7 @@ class FirebaseStepLogger extends BaseStepLogger { return wrapWithRetry(async () => { const nameDeferred = Q.defer(); const statusDeferred = Q.defer(); + const titleDeferred = Q.defer(); debug(`performing restore for step: ${this.name}`); debug(`firebase name reference: ${this.stepRef.child('name').ref()}`); @@ -50,7 +51,17 @@ class FirebaseStepLogger extends BaseStepLogger { statusDeferred.resolve(); }); - return Q.all([nameDeferred.promise, statusDeferred.promise]); + if (this.stepRef.child('title')) { + debug(`firebase title reference: ${this.stepRef.child('title').ref()}`); + this.stepRef.child('title').once('value', (snapshot) => { + debug(`received title for step: ${this.name}`); + this.title = snapshot.val(); + titleDeferred.resolve(); + }); + } else { // nothing to wait for + titleDeferred.resolve(); + } + return Q.all([nameDeferred.promise, statusDeferred.promise, titleDeferred.promise]); }, undefined, extraPrintData); } @@ -82,6 +93,10 @@ class FirebaseStepLogger extends BaseStepLogger { return this.stepRef.child('status').set(this.status); } + async _reportTitle() { + return this.stepRef.child('title').set(this.title); + } + async _reportFinishTimestamp() { return this.stepRef.child('finishTimeStamp').set(this.finishTimeStamp); } diff --git a/taskLogger/firebase/rest/StepLogger.js b/taskLogger/firebase/rest/StepLogger.js index 3639ab6..8442807 100644 --- a/taskLogger/firebase/rest/StepLogger.js +++ b/taskLogger/firebase/rest/StepLogger.js @@ -30,6 +30,12 @@ class FirebaseRestStepLogger extends FirebaseStepLogger { if (this.status === STATUS.PENDING_APPROVAL) { this.pendingApproval = true; } + if (this.stepRef.child('title')) { + debug(`firebase title reference: ${this.stepRef.child('title') + .ref()}`); + this.title = await this.restClient.get(`${this.stepRef.ref() + .toString()}/title`); + } } _reportLog(message) { @@ -81,6 +87,13 @@ class FirebaseRestStepLogger extends FirebaseStepLogger { }); } + async _reportTitle() { + return this.restClient.set(`${this.stepRef.ref().toString()}/title`, this.title) + .catch((err) => { + this.emit('error', err); + }); + } + async _reportFinishTimestamp() { return this.restClient.set(`${this.stepRef.ref().toString()}/finishTimeStamp`, this.finishTimeStamp) .catch((err) => { diff --git a/taskLogger/firebase/test/StepLogger.unit.spec.js b/taskLogger/firebase/test/StepLogger.unit.spec.js index 2c25da3..9dc5cfc 100644 --- a/taskLogger/firebase/test/StepLogger.unit.spec.js +++ b/taskLogger/firebase/test/StepLogger.unit.spec.js @@ -152,6 +152,21 @@ _.forEach(interfaces, (int) => { } }); + it('should report title', async () => { + const opts = _.merge({}, { + baseFirebaseUrl: 'url', + firebaseSecret: 'secret' + }, int.opts); + const stepLogger = await getStepLoggerInstance(undefined, opts); + stepLogger.title = 'title'; + stepLogger._reportTitle(); + if (opts.restInterface) { + expect(stepLogger.restClient.set).to.have.been.calledWith(`${stepLogger.stepRef.ref()}/title`, stepLogger.title); + } else { + expect(Firebase.prototype.set).to.have.been.calledWith(stepLogger.title); + } + }); + it('should report finish timestamp', async () => { const opts = _.merge({}, { baseFirebaseUrl: 'url', diff --git a/taskLogger/mongo/StepLogger.js b/taskLogger/mongo/StepLogger.js index be93ea4..59ea4a9 100644 --- a/taskLogger/mongo/StepLogger.js +++ b/taskLogger/mongo/StepLogger.js @@ -28,6 +28,7 @@ class MongoStepLogger extends BaseStepLogger { const stepFromDoc = _.get(doc, `steps[${this.name}]`); if (stepFromDoc) { this.status = stepFromDoc.status; + this.title = stepFromDoc.title; this.pendingApproval = this.status === STATUS.PENDING_APPROVAL; } } @@ -128,6 +129,17 @@ class MongoStepLogger extends BaseStepLogger { }); } + async _reportTitle() { + const key = `steps.${this.name}.title`; + const setFields = { [key]: this.title }; + return this.db.collection(MongoHelper.getCollection(key)).updateOne(this.getFilter(), + { $set: setFields }, { upsert: true }, (err) => { + if (err) { + this.emitter.emit('ERROR', err); + } + }); + } + async _reportFinishTimestamp() { const key = `steps.${this.name}.finishTimeStamp`; return this.db.collection(MongoHelper.getCollection(key)).updateOne(this.getFilter(), diff --git a/taskLogger/redis/StepLogger.js b/taskLogger/redis/StepLogger.js index 0e9ba5c..1097a4d 100644 --- a/taskLogger/redis/StepLogger.js +++ b/taskLogger/redis/StepLogger.js @@ -17,6 +17,7 @@ class RedisStepLogger extends BaseStepLogger { async restore() { this.status = await this.writter.child('status').get(); this.pendingApproval = this.status === STATUS.PENDING_APPROVAL; + this.title = await this.writter.child('title').get(); } _reportLog(message, syncId = Date.now()) { @@ -51,6 +52,10 @@ class RedisStepLogger extends BaseStepLogger { return this.writter.child('status').set(this.status); } + async _reportTitle() { + return this.writter.child('title').set(this.title); + } + async _reportFinishTimestamp() { return this.writter.child('finishTimeStamp').set(this.finishTimeStamp); } diff --git a/taskLogger/test/StepLogger.unit.spec.js b/taskLogger/test/StepLogger.unit.spec.js index bd76844..fd9397c 100644 --- a/taskLogger/test/StepLogger.unit.spec.js +++ b/taskLogger/test/StepLogger.unit.spec.js @@ -24,8 +24,10 @@ const getStepLoggerInstance = (task = { accountId: 'accountId', jobId: 'jobId', stepLogger.setFinishTimestamp = sinon.spy(stepLogger.setFinishTimestamp); stepLogger.updateLastUpdate = sinon.spy(stepLogger.updateLastUpdate); stepLogger.setStatus = sinon.spy(stepLogger.setStatus); + stepLogger.setTitle = sinon.spy(stepLogger.setTitle); stepLogger.setCreationTimestamp = sinon.spy(stepLogger.setCreationTimestamp); stepLogger._reportStatus = sinon.spy(); + stepLogger._reportTitle = sinon.spy(); stepLogger._reportFinishTimestamp = sinon.spy(); stepLogger._reportCreationTimestamp = sinon.spy(); stepLogger._reportLog = sinon.spy(); @@ -39,6 +41,8 @@ const getStepLoggerInstance = (task = { accountId: 'accountId', jobId: 'jobId', stepLogger.setStatus(STATUS.PENDING); stepLogger.setStatus.resetHistory(); stepLogger._reportStatus.resetHistory(); + stepLogger.setTitle.resetHistory(); + stepLogger._reportTitle.resetHistory(); return stepLogger; };