1
1
const fs = require ( 'fs' ) ;
2
2
const { EventEmitter } = require ( 'events' ) ;
3
3
const _ = require ( 'lodash' ) ;
4
- const Q = require ( 'q' ) ;
5
4
const Docker = require ( 'dockerode' ) ;
6
5
const DockerEvents = require ( 'docker-events' ) ;
7
- const bodyParser = require ( 'body-parser' ) ;
8
6
const CFError = require ( 'cf-errors' ) ;
9
7
const logger = require ( 'cf-logs' ) . Logger ( 'codefresh:containerLogger' ) ;
10
8
const { TaskLogger } = require ( '@codefresh-io/task-logger' ) ;
11
- const express = require ( 'express ' ) ;
9
+ const fastify = require ( 'fastify ' ) ;
12
10
const { ContainerStatus } = require ( './enums' ) ;
13
11
const { LoggerStrategy } = require ( './enums' ) ;
14
12
const { ContainerHandlingStatus } = require ( './enums' ) ;
15
13
const ContainerLogger = require ( './ContainerLogger' ) ;
14
+ const { getPromiseWithResolvers, saveServerAddress } = require ( './helpers' ) ;
16
15
17
16
const initialState = {
18
17
pid : process . pid , status : 'init' , lastLogsDate : new Date ( ) , failedHealthChecks : [ ] , restartCounter : 0 , containers : { }
@@ -35,7 +34,7 @@ class Logger {
35
34
this . containerLoggers = [ ] ;
36
35
this . totalLogSize = 0 ;
37
36
this . taskLogger = undefined ;
38
- this . buildFinishedPromise = buildFinishedPromise || Q . resolve ( ) ;
37
+ this . buildFinishedPromise = buildFinishedPromise || Promise . resolve ( ) ;
39
38
this . finishedContainers = 0 ;
40
39
this . finishedContainersEmitter = new EventEmitter ( ) ;
41
40
this . showProgress = showProgress ;
@@ -77,7 +76,7 @@ class Logger {
77
76
* will attach it self to all existing containers if requested
78
77
* the container label should be 'io.codefresh.loggerId'
79
78
*/
80
- start ( ) {
79
+ async start ( ) {
81
80
82
81
logger . info ( `Logging container created for logger id: ${ this . loggerId } ` ) ;
83
82
@@ -124,7 +123,7 @@ class Logger {
124
123
125
124
} ) ;
126
125
127
- this . _listenForEngineUpdates ( ) ;
126
+ await this . _listenForEngineUpdates ( ) ;
128
127
}
129
128
130
129
_readState ( ) {
@@ -188,9 +187,11 @@ class Logger {
188
187
const receivedLoggerId = _ . get ( container , 'Labels' , _ . get ( container , 'Actor.Attributes' ) ) [ 'io.codefresh.logger.id' ] ;
189
188
const runCreationLogic = _ . get ( container , 'Labels' , _ . get ( container , 'Actor.Attributes' ) ) [ 'io.codefresh.runCreationLogic' ] ;
190
189
const stepName = _ . get ( container , 'Labels' , _ . get ( container , 'Actor.Attributes' ) ) [ 'io.codefresh.logger.stepName' ] ;
191
- const receivedLogSizeLimit = _ . get ( container ,
190
+ const receivedLogSizeLimit = _ . get (
191
+ container ,
192
192
'Labels' ,
193
- _ . get ( container , 'Actor.Attributes' ) ) [ 'io.codefresh.logger.logSizeLimit' ] ;
193
+ _ . get ( container , 'Actor.Attributes' )
194
+ ) [ 'io.codefresh.logger.logSizeLimit' ] ;
194
195
const loggerStrategy = _ . get ( container , 'Labels' , _ . get ( container , 'Actor.Attributes' ) ) [ 'io.codefresh.logger.strategy' ] ;
195
196
196
197
if ( ! containerId ) {
@@ -350,31 +351,45 @@ class Logger {
350
351
} ) ;
351
352
}
352
353
353
- _listenForEngineUpdates ( ) {
354
- const app = express ( ) ;
355
- this . _app = app ;
356
- const port = process . env . PORT || 8080 ;
357
- const host = process . env . HOST || 'localhost' ;
358
-
359
- app . use ( bodyParser . json ( ) ) ;
360
-
361
- app . post ( '/secrets' , ( req , res ) => {
362
- try {
363
- const secret = req . body ;
364
- logger . info ( `got request to add new mask: ${ JSON . stringify ( secret ) } ` ) ;
365
-
366
- // secret must have { key, value } structure
367
- this . taskLogger . addNewMask ( secret ) ;
368
- res . status ( 201 ) . end ( 'secret added' ) ;
369
- } catch ( err ) {
370
- logger . info ( `could not create new mask due to error: ${ err } ` ) ;
371
- res . status ( 400 ) . end ( err ) ;
372
- }
373
- } ) ;
354
+ async _listenForEngineUpdates ( ) {
355
+ try {
356
+ const port = + ( process . env . PORT || 8080 ) ;
357
+ const host = process . env . HOST || '0.0.0.0' ;
358
+
359
+ const server = fastify ( ) ;
360
+ const secretsOptions = {
361
+ schema : {
362
+ body : {
363
+ type : 'object' ,
364
+ required : [ 'key' , 'value' ] ,
365
+ properties : {
366
+ key : { type : 'string' } ,
367
+ value : { type : 'string' } ,
368
+ } ,
369
+ } ,
370
+ } ,
371
+ } ;
372
+ server . post ( '/secrets' , secretsOptions , async ( request , reply ) => {
373
+ try {
374
+ const { body : secret } = request ;
375
+ logger . info ( `got request to add new mask: ${ secret . key } ` ) ;
376
+ this . taskLogger . addNewMask ( secret ) ;
377
+ reply . code ( 201 ) ;
378
+ return 'secret added' ;
379
+ } catch ( err ) {
380
+ logger . info ( `could not create new mask for due to error: ${ err } ` ) ;
381
+ reply . code ( 500 ) ;
382
+ throw err ;
383
+ }
384
+ } ) ;
374
385
375
- app . listen ( port , host , ( ) => {
376
- logger . info ( `listening for engine updates on ${ host } :${ port } ` ) ;
377
- } ) ;
386
+ const address = await server . listen ( { host, port } ) ;
387
+ await saveServerAddress ( address ) ;
388
+ logger . info ( `listening for engine updates on ${ address } ` ) ;
389
+ } catch ( error ) {
390
+ logger . error ( `could not start server for engine updates due to error: ${ error } ` ) ;
391
+ throw error ;
392
+ }
378
393
}
379
394
380
395
_handleContainerStreamEnd ( containerId ) {
@@ -385,7 +400,7 @@ class Logger {
385
400
386
401
// do not call before build is finished
387
402
_awaitAllStreamsClosed ( ) {
388
- const deferred = Q . defer ( ) ;
403
+ const deferred = getPromiseWithResolvers ( ) ;
389
404
this . _checkAllStreamsClosed ( deferred ) ;
390
405
this . finishedContainersEmitter . on ( 'end' , this . _checkAllStreamsClosed . bind ( this , deferred ) ) ;
391
406
return deferred . promise ;
0 commit comments