Skip to content

Commit a3ae257

Browse files
authored
Merge pull request #397 from snyk/fix/remove-class-for-scanner
fix: simplify scanner module by removing the usage of class
2 parents 1860d23 + b466fcc commit a3ae257

File tree

3 files changed

+54
-63
lines changed

3 files changed

+54
-63
lines changed

src/scanner/index.ts

Lines changed: 46 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -5,64 +5,58 @@ import { constructDeleteWorkload, constructDepGraph } from '../transmitter/paylo
55
import { IWorkload, ILocalWorkloadLocator } from '../transmitter/types';
66
import { IPullableImage } from './images/types';
77

8-
export = class WorkloadWorker {
9-
private readonly name: string;
10-
11-
constructor(name: string) {
12-
this.name = name;
8+
export async function processWorkload(workloadMetadata: IWorkload[]): Promise<void> {
9+
// every workload metadata references the same workload name, grab it from the first one
10+
const workloadName = workloadMetadata[0].name;
11+
const allImages = workloadMetadata.map((meta) => meta.imageName);
12+
logger.info({workloadName, imageCount: allImages.length}, 'queried workloads');
13+
const uniqueImages = [...new Set<string>(allImages)];
14+
15+
logger.info({workloadName, imageCount: uniqueImages.length}, 'pulling unique images');
16+
const imagesWithFileSystemPath = getImagesWithFileSystemPath(uniqueImages);
17+
const pulledImages = await pullImages(imagesWithFileSystemPath);
18+
if (pulledImages.length === 0) {
19+
logger.info({workloadName}, 'no images were pulled, halting scanner process.');
20+
return;
1321
}
1422

15-
public async process(workloadMetadata: IWorkload[]): Promise<void> {
16-
const workloadName = this.name;
17-
const allImages = workloadMetadata.map((meta) => meta.imageName);
18-
logger.info({workloadName, imageCount: allImages.length}, 'queried workloads');
19-
const uniqueImages = [...new Set<string>(allImages)];
20-
21-
logger.info({workloadName, imageCount: uniqueImages.length}, 'pulling unique images');
22-
const imagesWithFileSystemPath = getImagesWithFileSystemPath(uniqueImages);
23-
const pulledImages = await pullImages(imagesWithFileSystemPath);
24-
if (pulledImages.length === 0) {
25-
logger.info({workloadName}, 'no images were pulled, halting scanner process.');
26-
return;
27-
}
28-
29-
try {
30-
await this.scanImagesAndSendResults(workloadName, pulledImages, workloadMetadata);
31-
} finally {
32-
await removePulledImages(pulledImages);
33-
}
23+
try {
24+
await scanImagesAndSendResults(workloadName, pulledImages, workloadMetadata);
25+
} finally {
26+
await removePulledImages(pulledImages);
3427
}
35-
36-
// TODO: should be extracted from here and moved to the supervisor
37-
public async delete(localWorkloadLocator: ILocalWorkloadLocator): Promise<void> {
38-
const deletePayload = constructDeleteWorkload(localWorkloadLocator);
39-
logger.info({workloadName: this.name, workload: localWorkloadLocator},
40-
'removing workloads from upstream');
41-
await deleteWorkload(deletePayload);
28+
}
29+
30+
// TODO: should be extracted from here and moved to the supervisor
31+
export async function sendDeleteWorkloadRequest(workloadName: string, localWorkloadLocator: ILocalWorkloadLocator): Promise<void> {
32+
const deletePayload = constructDeleteWorkload(localWorkloadLocator);
33+
logger.info({workloadName, workload: localWorkloadLocator},
34+
'removing workloads from upstream');
35+
await deleteWorkload(deletePayload);
36+
}
37+
38+
async function scanImagesAndSendResults(
39+
workloadName: string,
40+
pulledImages: IPullableImage[],
41+
workloadMetadata: IWorkload[],
42+
): Promise<void> {
43+
const scannedImages = await scanImages(pulledImages);
44+
45+
if (scannedImages.length === 0) {
46+
logger.info({workloadName}, 'no images were scanned, halting scanner process.');
47+
return;
4248
}
4349

44-
private async scanImagesAndSendResults(
45-
workloadName: string,
46-
pulledImages: IPullableImage[],
47-
workloadMetadata: IWorkload[],
48-
): Promise<void> {
49-
const scannedImages = await scanImages(pulledImages);
50-
51-
if (scannedImages.length === 0) {
52-
logger.info({workloadName}, 'no images were scanned, halting scanner process.');
53-
return;
54-
}
50+
logger.info({workloadName, imageCount: scannedImages.length}, 'successfully scanned images');
5551

56-
logger.info({workloadName, imageCount: scannedImages.length}, 'successfully scanned images');
52+
const depGraphPayloads = constructDepGraph(scannedImages, workloadMetadata);
53+
await sendDepGraph(...depGraphPayloads);
5754

58-
const depGraphPayloads = constructDepGraph(scannedImages, workloadMetadata);
59-
await sendDepGraph(...depGraphPayloads);
55+
const pulledImagesNames = pulledImages.map((image) => image.imageName);
56+
const pulledImageMetadata = workloadMetadata.filter((meta) =>
57+
pulledImagesNames.includes(meta.imageName),
58+
);
6059

61-
const pulledImagesNames = pulledImages.map((image) => image.imageName);
62-
const pulledImageMetadata = workloadMetadata.filter((meta) =>
63-
pulledImagesNames.includes(meta.imageName),
64-
);
60+
logger.info({workloadName, imageCount: pulledImageMetadata.length}, 'processed images');
61+
}
6562

66-
logger.info({workloadName, imageCount: pulledImageMetadata.length}, 'processed images');
67-
}
68-
};

src/supervisor/watchers/handlers/pod.ts

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { V1Pod } from '@kubernetes/client-node';
22
import async = require('async');
33
import config = require('../../../common/config');
44
import logger = require('../../../common/logger');
5-
import WorkloadWorker = require('../../../scanner');
5+
import { processWorkload } from '../../../scanner';
66
import { sendWorkloadMetadata } from '../../../transmitter';
77
import { IWorkload } from '../../../transmitter/types';
88
import { constructWorkloadMetadata } from '../../../transmitter/payload';
@@ -28,9 +28,9 @@ function deleteFailedKeysFromState(keys): void {
2828
}
2929

3030
async function queueWorkerWorkloadScan(task, callback): Promise<void> {
31-
const {workloadWorker, workloadMetadata, imageKeys} = task;
31+
const {workloadMetadata, imageKeys} = task;
3232
try {
33-
await workloadWorker.process(workloadMetadata);
33+
await processWorkload(workloadMetadata);
3434
} catch (err) {
3535
logger.error({err, task}, 'error processing a workload in the pod handler 2');
3636
deleteFailedKeysFromState(imageKeys);
@@ -54,7 +54,7 @@ metadataToSendQueue.error(function(err, task) {
5454
logger.error({err, task}, 'error processing a workload metadata send task');
5555
});
5656

57-
function handleReadyPod(workloadWorker: WorkloadWorker, workloadMetadata: IWorkload[]): void {
57+
function handleReadyPod(workloadMetadata: IWorkload[]): void {
5858
const imagesToScan: IWorkload[] = [];
5959
const imageKeys: string[] = [];
6060
for (const image of workloadMetadata) {
@@ -68,7 +68,7 @@ function handleReadyPod(workloadWorker: WorkloadWorker, workloadMetadata: IWorkl
6868
}
6969

7070
if (imagesToScan.length > 0) {
71-
workloadsToScanQueue.push({workloadWorker, workloadMetadata: imagesToScan, imageKeys});
71+
workloadsToScanQueue.push({workloadMetadata: imagesToScan, imageKeys});
7272
}
7373
}
7474

@@ -106,9 +106,7 @@ export async function podWatchHandler(pod: V1Pod): Promise<void> {
106106
metadataToSendQueue.push({workloadMetadataPayload});
107107
}
108108

109-
const workloadName = workloadMember.name;
110-
const workloadWorker = new WorkloadWorker(workloadName);
111-
handleReadyPod(workloadWorker, workloadMetadata);
109+
handleReadyPod(workloadMetadata);
112110
} catch (error) {
113111
logger.error({error, podName}, 'could not build image metadata for pod');
114112
}

src/supervisor/watchers/handlers/workload.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { IKubeObjectMetadata } from '../../types';
22
import { buildWorkloadMetadata } from '../../metadata-extractor';
3-
import WorkloadWorker = require('../../../scanner');
3+
import { sendDeleteWorkloadRequest } from '../../../scanner';
44
import logger = require('../../../common/logger');
55

66
export async function deleteWorkload(kubernetesMetadata: IKubeObjectMetadata, workloadName: string): Promise<void> {
@@ -10,8 +10,7 @@ export async function deleteWorkload(kubernetesMetadata: IKubeObjectMetadata, wo
1010
}
1111

1212
const localWorkloadLocator = buildWorkloadMetadata(kubernetesMetadata);
13-
const workloadWorker = new WorkloadWorker(workloadName);
14-
await workloadWorker.delete(localWorkloadLocator);
13+
await sendDeleteWorkloadRequest(workloadName, localWorkloadLocator);
1514
} catch (error) {
1615
logger.error({error, resourceType: kubernetesMetadata.kind, resourceName: kubernetesMetadata.objectMeta.name},
1716
'could not delete workload');

0 commit comments

Comments
 (0)