Skip to content

Commit fb0ec86

Browse files
committed
feat: add parsing logic to detect deprecated images
1 parent 3a915b4 commit fb0ec86

File tree

3 files changed

+50
-3
lines changed

3 files changed

+50
-3
lines changed

lib/ContainerLogger.js

+14-2
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,11 @@ const Q = require('q');
33
const promiseRetry = require('promise-retry');
44
const logger = require('cf-logs').Logger('codefresh:containerLogger');
55
const CFError = require('cf-errors');
6-
const { Transform } = require('stream');
6+
const { Transform, PassThrough } = require('stream');
7+
78
const _ = require('lodash');
89
const { LoggerStrategy } = require('./enums');
10+
const deprecatedImagesCollector = require('./metric/deprecated-images/deprecated-images.collector');
911

1012
const CONTAINER_START_RETRY_TIMEOUT_SECONDS = 1;
1113
const CONTAINER_START_RETRY_LIMIT = 10;
@@ -74,6 +76,7 @@ class ContainerLogger extends EventEmitter {
7476

7577
this._registerToTtyStreams(stdout, stderr);
7678
} else {
79+
// TODO: parse deprecated images here
7780
this._handleNonTtyStream(stdout, false);
7881
if (stderr) {
7982
this._handleNonTtyStream(stderr, true);
@@ -131,6 +134,7 @@ class ContainerLogger extends EventEmitter {
131134
// { end = false } on the stepLoggerWritableStream because there is only one instance of it for all the steps.
132135
this.handledStreams++;
133136
let stdoutStream = stdout
137+
.pipe(this._interceptDeprecatedImagesStream())
134138
.pipe(this._logSizeLimitStream())
135139
.pipe(this.stepLogger.createMaskingStream());
136140

@@ -148,6 +152,7 @@ class ContainerLogger extends EventEmitter {
148152

149153
this.handledStreams++;
150154
let stderrStream = stderr
155+
.pipe(this._interceptDeprecatedImagesStream())
151156
.pipe(this._logSizeLimitStream())
152157
.pipe(this._errorTransformerStream())
153158
.pipe(this.stepLogger.createMaskingStream());
@@ -182,7 +187,9 @@ class ContainerLogger extends EventEmitter {
182187
this.handledStreams++;
183188
stream.on('end', this._handleFinished.bind(this));
184189
stream.on('data', (chunk) => {
185-
this._logMessage(Buffer.from(chunk).toString('utf-8'), isError);
190+
const message = Buffer.from(chunk).toString('utf-8');
191+
deprecatedImagesCollector.catchDeprecatedImage(message);
192+
this._logMessage(message, isError);
186193
});
187194
logger.info(`Listening on stream 'data' event for container: ${this.containerId}`);
188195
}
@@ -233,6 +240,11 @@ class ContainerLogger extends EventEmitter {
233240
this.emit('message.logged', curLogSize);
234241
}
235242

243+
_interceptDeprecatedImagesStream() {
244+
return new PassThrough()
245+
.on('data', (chunk) => deprecatedImagesCollector.catchDeprecatedImage(chunk.toString('utf8')));
246+
}
247+
236248
_errorTransformerStream() {
237249
return new Transform({
238250
transform: (data, encoding, done) => {

lib/metric/deprecated-images/deprecated-images.collector.ts

+35
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
1+
// @ts-expect-error it's a js library
2+
import cfLogs from 'cf-logs';
3+
14
import { DeprecatedImageDto } from './deprecated-image.dto';
25

6+
const logger = cfLogs.Logger('codefresh:containerLogger');
7+
38
class DeprecatedImagesCollector {
49

510
private list: DeprecatedImageDto[] = [];
@@ -15,6 +20,36 @@ class DeprecatedImagesCollector {
1520
destroyConsumed(consumedNumber: number) {
1621
this.list = this.list.slice(consumedNumber);
1722
}
23+
24+
catchDeprecatedImage(logText: string) {
25+
if (logText.includes('[DEPRECATION NOTICE]')) {
26+
const imageName = this._parseImageName(logText);
27+
28+
if (imageName === null) {
29+
logger.error(`detected pulling of the deprecated image but failed to parse the image name. The original log text: '${logText}'`);
30+
} else {
31+
logger.warn(`detected pulling of the deprecated image '${imageName}'. The original log text: '${logText}'`);
32+
33+
this.push({
34+
image: imageName,
35+
});
36+
}
37+
}
38+
}
39+
40+
private _parseImageName(logText: string) {
41+
const startMarker = 'Suggest the author of ';
42+
const endMarker = ' to upgrade the image';
43+
44+
const startIndex = logText.indexOf(startMarker);
45+
const endIndex = logText.indexOf(endMarker);
46+
47+
if (startIndex > -1 && endIndex > -1 && endIndex > startIndex) {
48+
return logText.substring(startIndex + startMarker.length, endIndex);
49+
}
50+
51+
return null;
52+
}
1853
}
1954

2055
export default new DeprecatedImagesCollector();

service.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
version: 1.11.8
1+
version: 1.12.0

0 commit comments

Comments
 (0)