Skip to content

Commit a1bdf30

Browse files
committed
feat(secrets): use precise address in updateMasks()
1 parent 8cd018f commit a1bdf30

File tree

9 files changed

+128
-103
lines changed

9 files changed

+128
-103
lines changed

.eslintrc

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,6 @@
7878
"quote-props": ["error", "consistent"],
7979

8080
"promise/catch-or-return": ["error", { "allowThen": true }],
81-
"promise/no-native": "error",
8281

8382
"mocha/no-exclusive-tests": "error",
8483

lib/addNewMask.js

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
11
const rp = require('request-promise');
2+
const { secretsServerAddress } = require('./logger');
23

34
function updateMasks(secret) {
4-
const port = process.env.PORT || 8080;
5-
const host = process.env.HOST || '0.0.0.0';
6-
7-
const opt = {
8-
uri: `http://${host}:${port}/secrets`,
9-
method: 'POST',
10-
json: true,
11-
body: secret,
12-
resolveWithFullResponse: true,
13-
};
14-
15-
rp(opt)
5+
secretsServerAddress
6+
.then((address) => {
7+
const opts = {
8+
uri: `${address}/secrets`,
9+
method: 'POST',
10+
json: true,
11+
body: secret,
12+
resolveWithFullResponse: true,
13+
};
14+
return rp(opts);
15+
})
1616
.then((res) => {
1717
if (res.statusCode >= 400) {
1818
console.log(`could not create mask for secret: ${secret.key}, because server responded with: ${res.statusCode}\n\n${res.body}`);

lib/helpers.js

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
const Q = require('q');
21
const { stat } = require('fs/promises');
32
const path = require('path');
43
const logger = require('cf-logs').Logger('codefresh:containerLogger');
4+
const getPromiseWithResolvers = require('core-js-pure/es/promise/with-resolvers');
55
const { BuildFinishedSignalFilename } = require('./enums');
66

77
const checkFileInterval = 1000;
@@ -27,13 +27,18 @@ function _watchForBuildFinishedSignal(deferred) {
2727
}
2828

2929
function watchForBuildFinishedSignal() {
30-
const deferred = Q.defer();
30+
const deferred = getPromiseWithResolvers();
3131

3232
_watchForBuildFinishedSignal(deferred);
3333

3434
return deferred.promise;
3535
}
3636

3737
module.exports = {
38+
/**
39+
* Polyfill of `Promise.withResolvers`, TC39 Stage 4 proposal.
40+
* @see https://github.com/tc39/proposal-promise-with-resolvers
41+
*/
42+
getPromiseWithResolvers,
3843
watchForBuildFinishedSignal,
3944
};

lib/index.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ const loggerOptions = {
1212
};
1313
cflogs.init(loggerOptions);
1414

15-
const Logger = require('./logger');
15+
const { Logger } = require('./logger');
1616
const { watchForBuildFinishedSignal } = require('./helpers');
1717

1818
const taskLoggerConfig = JSON.parse(process.env.TASK_LOGGER_CONFIG);

lib/logger.js

Lines changed: 45 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
const fs = require('fs');
22
const { EventEmitter } = require('events');
33
const _ = require('lodash');
4-
const Q = require('q');
54
const Docker = require('dockerode');
65
const DockerEvents = require('docker-events');
76
const CFError = require('cf-errors');
@@ -12,11 +11,14 @@ const { ContainerStatus } = require('./enums');
1211
const { LoggerStrategy } = require('./enums');
1312
const { ContainerHandlingStatus } = require('./enums');
1413
const ContainerLogger = require('./ContainerLogger');
14+
const { getPromiseWithResolvers } = require('./helpers');
1515

1616
const initialState = {
1717
pid: process.pid, status: 'init', lastLogsDate: new Date(), failedHealthChecks: [], restartCounter: 0, containers: {}
1818
};
1919

20+
const deferredServerAddress = getPromiseWithResolvers();
21+
2022
class Logger {
2123

2224
constructor({
@@ -34,7 +36,7 @@ class Logger {
3436
this.containerLoggers = [];
3537
this.totalLogSize = 0;
3638
this.taskLogger = undefined;
37-
this.buildFinishedPromise = buildFinishedPromise || Q.resolve();
39+
this.buildFinishedPromise = buildFinishedPromise || Promise.resolve();
3840
this.finishedContainers = 0;
3941
this.finishedContainersEmitter = new EventEmitter();
4042
this.showProgress = showProgress;
@@ -350,38 +352,45 @@ class Logger {
350352
}
351353

352354
async _listenForEngineUpdates() {
353-
const port = +(process.env.PORT || 8080);
354-
const host = process.env.HOST || '0.0.0.0';
355-
356-
const secretsServer = fastify();
357-
const secretsOptions = {
358-
schema: {
359-
body: {
360-
type: 'object',
361-
required: ['key', 'value'],
362-
properties: {
363-
key: { type: 'string' },
364-
value: { type: 'string' },
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+
},
365369
},
366370
},
367-
},
368-
};
369-
secretsServer.post('/secrets', secretsOptions, async (request, reply) => {
370-
try {
371-
const { body: secret } = request;
372-
logger.info(`got request to add new mask: ${JSON.stringify(secret)}`);
373-
this.taskLogger.addNewMask(secret);
374-
reply.code(201);
375-
return 'secret added';
376-
} catch (err) {
377-
logger.info(`could not create new mask due to error: ${err}`);
378-
reply.code(500);
379-
throw err;
380-
}
381-
});
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: ${JSON.stringify(secret)}`);
376+
this.taskLogger.addNewMask(secret);
377+
reply.code(201);
378+
return 'secret added';
379+
} catch (err) {
380+
logger.info(`could not create new mask due to error: ${err}`);
381+
reply.code(500);
382+
throw err;
383+
}
384+
});
382385

383-
const address = await secretsServer.listen({ host, port });
384-
logger.info(`listening for engine updates on ${address}`);
386+
const address = await server.listen({ host, port });
387+
deferredServerAddress.resolve(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+
deferredServerAddress.reject(error);
392+
throw error;
393+
}
385394
}
386395

387396
_handleContainerStreamEnd(containerId) {
@@ -392,7 +401,7 @@ class Logger {
392401

393402
// do not call before build is finished
394403
_awaitAllStreamsClosed() {
395-
const deferred = Q.defer();
404+
const deferred = getPromiseWithResolvers();
396405
this._checkAllStreamsClosed(deferred);
397406
this.finishedContainersEmitter.on('end', this._checkAllStreamsClosed.bind(this, deferred));
398407
return deferred.promise;
@@ -423,4 +432,7 @@ class Logger {
423432
}
424433
}
425434

426-
module.exports = Logger;
435+
module.exports = {
436+
Logger,
437+
secretsServerAddress: deferredServerAddress.promise,
438+
};

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
"@codefresh-io/task-logger": "^1.12.3",
1414
"cf-errors": "^0.1.16",
1515
"cf-logs": "^1.1.25",
16+
"core-js-pure": "^3.37.1",
1617
"docker-events": "0.0.2",
1718
"dockerode": "^2.5.8",
1819
"fastify": "^4.28.1",

test/addNewMask.unit.spec.js

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
11
/* jshint ignore:start */
22

3-
'use strict';
4-
const Q = require('q');
5-
3+
const timers = require('node:timers/promises');
64
const chai = require('chai');
75
const expect = chai.expect;
86
const sinon = require('sinon');
97
const sinonChai = require('sinon-chai');
8+
const { getPromiseWithResolvers } = require('../lib/helpers');
109
const proxyquire = require('proxyquire').noCallThru();
1110
chai.use(sinonChai);
1211

@@ -27,52 +26,56 @@ describe('addNewMask', () => {
2726

2827
describe('positive', () => {
2928
it('should send a request to add a secret', async () => {
30-
const rpSpy = sinon.spy(() => Q.resolve({ statusCode: 201 }));
29+
const rpSpy = sinon.spy(async () => ({ statusCode: 201 }));
30+
const deferredAddress = getPromiseWithResolvers();
3131
const addNewMask = proxyquire('../lib/addNewMask', {
32-
'request-promise': rpSpy
32+
'request-promise': rpSpy,
33+
'./logger': {
34+
secretsServerAddress: deferredAddress.promise,
35+
},
3336
});
34-
35-
process.env.PORT = 1337;
36-
process.env.HOST = '127.0.0.1';
3737

3838
const secret = {
3939
key: '123',
4040
value: 'ABC',
4141
};
4242

43+
deferredAddress.resolve('http://127.0.0.1:1337');
4344
addNewMask(secret);
4445

46+
await timers.setTimeout(10);
4547
expect(rpSpy).to.have.been.calledOnceWith({
4648
uri: `http://127.0.0.1:1337/secrets`,
4749
method: 'POST',
4850
json: true,
4951
body: secret,
5052
resolveWithFullResponse: true,
5153
});
52-
await Q.delay(10);
54+
await timers.setTimeout(10);
5355
expect(process.exit).to.have.been.calledOnceWith(0);
5456
});
5557
});
5658

5759
describe('negative', () => {
5860
it('should send a request to add a secret', async () => {
59-
const rpSpy = sinon.spy(() => Q.reject('could not send request'));
61+
const rpSpy = sinon.spy(async () => { throw 'could not send request';});
62+
deferredAddress = getPromiseWithResolvers();
6063
const addNewMask = proxyquire('../lib/addNewMask', {
61-
'request-promise': rpSpy
64+
'request-promise': rpSpy,
65+
'./logger': {
66+
secretsServerAddress: deferredAddress.promise,
67+
},
6268
});
63-
64-
process.env.PORT = 1337;
65-
process.env.HOST = '127.0.0.1';
6669

6770
const secret = {
6871
key: '123',
6972
value: 'ABC',
7073
};
7174

75+
deferredAddress.resolve('http://127.0.0.1:1337');
7276
addNewMask(secret);
73-
await Q.delay(10);
77+
await timers.setTimeout(10);
7478
expect(process.exit).to.have.been.calledOnceWith(1);
7579
});
7680
});
7781
});
78-

0 commit comments

Comments
 (0)