Skip to content

Commit 0eb93bb

Browse files
author
Tal Kaptsan
authored
Merge pull request #121 from snyk/feat/workload-metadata
Feat/workload metadata
2 parents 0cb8499 + cf042b2 commit 0eb93bb

File tree

13 files changed

+47
-30
lines changed

13 files changed

+47
-30
lines changed

src/kube-scanner/index.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import { pullImages } from '../images';
1010
import { scanImages, IScanResult } from './image-scanner';
1111
import { deleteHomebaseWorkload, sendDepGraph } from '../transmitter';
1212
import { constructHomebaseDeleteWorkloadPayload, constructHomebaseWorkloadPayloads } from '../transmitter/payload';
13-
import { IDepGraphPayload, IKubeImage, ILocalWorkloadLocator } from '../transmitter/types';
13+
import { IDepGraphPayload, IWorkload, ILocalWorkloadLocator } from '../transmitter/types';
1414

1515
export = class WorkloadWorker {
1616
private readonly name: string;
@@ -19,7 +19,7 @@ export = class WorkloadWorker {
1919
this.name = name;
2020
}
2121

22-
public async process(workloadMetadata: IKubeImage[]) {
22+
public async process(workloadMetadata: IWorkload[]) {
2323
const workloadName = this.name;
2424
const allImages = workloadMetadata.map((meta) => meta.imageName);
2525
logger.info({workloadName, imageCount: allImages.length}, 'Queried workloads');

src/kube-scanner/metadata-extractor.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { V1OwnerReference, V1Pod, V1Container, V1ContainerStatus } from '@kubernetes/client-node';
2-
import { IKubeImage, ILocalWorkloadLocator } from '../transmitter/types';
2+
import { IWorkload, ILocalWorkloadLocator } from '../transmitter/types';
33
import { currentClusterName } from './cluster';
44
import { KubeObjectMetadata } from './types';
55
import { getSupportedWorkload, getWorkloadReader } from './workload-reader';
@@ -12,8 +12,8 @@ const loopingThreshold = 20;
1212
export function buildImageMetadata(
1313
workloadMeta: KubeObjectMetadata,
1414
containerStatuses: V1ContainerStatus[],
15-
): IKubeImage[] {
16-
const { kind, objectMeta, specMeta, containers } = workloadMeta;
15+
): IWorkload[] {
16+
const { kind, objectMeta, specMeta, containers, revision } = workloadMeta;
1717
const { name, namespace, labels, annotations, uid } = objectMeta;
1818

1919
const containerNameToSpec: {[key: string]: V1Container} = {};
@@ -39,7 +39,8 @@ export function buildImageMetadata(
3939
imageName: containerNameToSpec[containerName].image,
4040
imageId: containerNameToStatus[containerName].imageID,
4141
cluster: currentClusterName,
42-
} as IKubeImage),
42+
revision,
43+
} as IWorkload),
4344
);
4445
return images;
4546
}
@@ -88,7 +89,7 @@ export function buildWorkloadMetadata(kubernetesMetadata: KubeObjectMetadata): I
8889
};
8990
}
9091

91-
export async function buildMetadataForWorkload(pod: V1Pod): Promise<IKubeImage[] | undefined> {
92+
export async function buildMetadataForWorkload(pod: V1Pod): Promise<IWorkload[] | undefined> {
9293
const isAssociatedWithParent = isPodAssociatedWithParent(pod);
9394

9495
if (!pod.metadata || pod.metadata.namespace === undefined || !pod.spec) {

src/kube-scanner/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ export interface KubeObjectMetadata {
1818
specMeta: V1ObjectMeta;
1919
containers: V1Container[];
2020
ownerRefs: V1OwnerReference[] | undefined;
21+
revision?: number;
2122
}
2223

2324
export interface IK8sClients {

src/kube-scanner/watchers/handlers/daemon-set.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { FALSY_WORKLOAD_NAME_MARKER } from './types';
55

66
export async function daemonSetWatchHandler(daemonSet: V1DaemonSet) {
77
if (!daemonSet.metadata || !daemonSet.spec || !daemonSet.spec.template.metadata ||
8-
!daemonSet.spec.template.spec) {
8+
!daemonSet.spec.template.spec || !daemonSet.status) {
99
// TODO(ivanstanev): possibly log this. It shouldn't happen but we should track it!
1010
return;
1111
}
@@ -18,5 +18,6 @@ export async function daemonSetWatchHandler(daemonSet: V1DaemonSet) {
1818
specMeta: daemonSet.spec.template.metadata,
1919
containers: daemonSet.spec.template.spec.containers,
2020
ownerRefs: daemonSet.metadata.ownerReferences,
21+
revision: daemonSet.status.observedGeneration,
2122
}, workloadName);
2223
}

src/kube-scanner/watchers/handlers/deployment.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { FALSY_WORKLOAD_NAME_MARKER } from './types';
55

66
export async function deploymentWatchHandler(deployment: V1Deployment) {
77
if (!deployment.metadata || !deployment.spec || !deployment.spec.template.metadata ||
8-
!deployment.spec.template.spec) {
8+
!deployment.spec.template.spec || !deployment.status) {
99
// TODO(ivanstanev): possibly log this. It shouldn't happen but we should track it!
1010
return;
1111
}
@@ -18,5 +18,6 @@ export async function deploymentWatchHandler(deployment: V1Deployment) {
1818
specMeta: deployment.spec.template.metadata,
1919
containers: deployment.spec.template.spec.containers,
2020
ownerRefs: deployment.metadata.ownerReferences,
21+
revision: deployment.status.observedGeneration,
2122
}, workloadName);
2223
}

src/kube-scanner/watchers/handlers/pod.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import async = require('async');
33
import config = require('../../../common/config');
44
import logger = require('../../../common/logger');
55
import WorkloadWorker = require('../../../kube-scanner');
6-
import { IKubeImage } from '../../../transmitter/types';
6+
import { IWorkload } from '../../../transmitter/types';
77
import { buildMetadataForWorkload } from '../../metadata-extractor';
88
import { PodPhase } from '../types';
99
import state = require('../../../state');
@@ -25,8 +25,8 @@ workloadsToScanQueue.error(function(err, task) {
2525
logger.error({err, task}, 'error processing a workload in the pod handler 1');
2626
});
2727

28-
async function handleReadyPod(workloadWorker: WorkloadWorker, workloadMetadata: IKubeImage[]) {
29-
const imagesToScan: IKubeImage[] = [];
28+
async function handleReadyPod(workloadWorker: WorkloadWorker, workloadMetadata: IWorkload[]) {
29+
const imagesToScan: IWorkload[] = [];
3030
const imageKeys: string[] = [];
3131
for (const image of workloadMetadata) {
3232
const imageKey = `${image.namespace}/${image.type}/${image.name}/${image.imageId}`;

src/kube-scanner/watchers/handlers/replica-set.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { FALSY_WORKLOAD_NAME_MARKER } from './types';
55

66
export async function replicaSetWatchHandler(replicaSet: V1ReplicaSet) {
77
if (!replicaSet.metadata || !replicaSet.spec || !replicaSet.spec.template ||
8-
!replicaSet.spec.template.metadata || !replicaSet.spec.template.spec) {
8+
!replicaSet.spec.template.metadata || !replicaSet.spec.template.spec || !replicaSet.status) {
99
// TODO(ivanstanev): possibly log this. It shouldn't happen but we should track it!
1010
return;
1111
}
@@ -18,5 +18,6 @@ export async function replicaSetWatchHandler(replicaSet: V1ReplicaSet) {
1818
specMeta: replicaSet.spec.template.metadata,
1919
containers: replicaSet.spec.template.spec.containers,
2020
ownerRefs: replicaSet.metadata.ownerReferences,
21+
revision: replicaSet.status.observedGeneration,
2122
}, workloadName);
2223
}

src/kube-scanner/watchers/handlers/replication-controller.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@ import { FALSY_WORKLOAD_NAME_MARKER } from './types';
55

66
export async function replicationControllerWatchHandler(replicationController: V1ReplicationController) {
77
if (!replicationController.metadata || !replicationController.spec || !replicationController.spec.template ||
8-
!replicationController.spec.template.metadata || !replicationController.spec.template.spec) {
8+
!replicationController.spec.template.metadata || !replicationController.spec.template.spec ||
9+
!replicationController.status) {
910
// TODO(ivanstanev): possibly log this. It shouldn't happen but we should track it!
1011
return;
1112
}
@@ -18,5 +19,6 @@ export async function replicationControllerWatchHandler(replicationController: V
1819
specMeta: replicationController.spec.template.metadata,
1920
containers: replicationController.spec.template.spec.containers,
2021
ownerRefs: replicationController.metadata.ownerReferences,
22+
revision: replicationController.status.observedGeneration,
2123
}, workloadName);
2224
}

src/kube-scanner/watchers/handlers/stateful-set.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { FALSY_WORKLOAD_NAME_MARKER } from './types';
55

66
export async function statefulSetWatchHandler(statefulSet: V1StatefulSet) {
77
if (!statefulSet.metadata || !statefulSet.spec || !statefulSet.spec.template.metadata ||
8-
!statefulSet.spec.template.spec) {
8+
!statefulSet.spec.template.spec || !statefulSet.status) {
99
// TODO(ivanstanev): possibly log this. It shouldn't happen but we should track it!
1010
return;
1111
}
@@ -18,5 +18,6 @@ export async function statefulSetWatchHandler(statefulSet: V1StatefulSet) {
1818
specMeta: statefulSet.spec.template.metadata,
1919
containers: statefulSet.spec.template.spec.containers,
2020
ownerRefs: statefulSet.metadata.ownerReferences,
21+
revision: statefulSet.status.observedGeneration,
2122
}, workloadName);
2223
}

src/kube-scanner/workload-reader.ts

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ const deploymentReader: IWorkloadReaderFunc = async (workloadName, namespace) =>
1313
const deployment = deploymentResult.body;
1414

1515
if (!deployment.metadata || !deployment.spec || !deployment.spec.template.metadata ||
16-
!deployment.spec.template.spec) {
16+
!deployment.spec.template.spec || !deployment.status) {
1717
// TODO(ivanstanev): add logging to know when/if it happens!
1818
return undefined;
1919
}
@@ -24,6 +24,7 @@ const deploymentReader: IWorkloadReaderFunc = async (workloadName, namespace) =>
2424
specMeta: deployment.spec.template.metadata,
2525
containers: deployment.spec.template.spec.containers,
2626
ownerRefs: deployment.metadata.ownerReferences,
27+
revision: deployment.status.observedGeneration,
2728
};
2829
};
2930

@@ -33,7 +34,7 @@ const replicaSetReader: IWorkloadReaderFunc = async (workloadName, namespace) =>
3334
const replicaSet = replicaSetResult.body;
3435

3536
if (!replicaSet.metadata || !replicaSet.spec || !replicaSet.spec.template ||
36-
!replicaSet.spec.template.metadata || !replicaSet.spec.template.spec) {
37+
!replicaSet.spec.template.metadata || !replicaSet.spec.template.spec || !replicaSet.status) {
3738
// TODO(ivanstanev): add logging to know when/if it happens!
3839
return undefined;
3940
}
@@ -44,6 +45,7 @@ const replicaSetReader: IWorkloadReaderFunc = async (workloadName, namespace) =>
4445
specMeta: replicaSet.spec.template.metadata,
4546
containers: replicaSet.spec.template.spec.containers,
4647
ownerRefs: replicaSet.metadata.ownerReferences,
48+
revision: replicaSet.status.observedGeneration,
4749
};
4850
};
4951

@@ -53,7 +55,7 @@ const statefulSetReader: IWorkloadReaderFunc = async (workloadName, namespace) =
5355
const statefulSet = statefulSetResult.body;
5456

5557
if (!statefulSet.metadata || !statefulSet.spec || !statefulSet.spec.template.metadata ||
56-
!statefulSet.spec.template.spec) {
58+
!statefulSet.spec.template.spec || !statefulSet.status) {
5759
// TODO(ivanstanev): add logging to know when/if it happens!
5860
return undefined;
5961
}
@@ -64,6 +66,7 @@ const statefulSetReader: IWorkloadReaderFunc = async (workloadName, namespace) =
6466
specMeta: statefulSet.spec.template.metadata,
6567
containers: statefulSet.spec.template.spec.containers,
6668
ownerRefs: statefulSet.metadata.ownerReferences,
69+
revision: statefulSet.status.observedGeneration,
6770
};
6871
};
6972

@@ -73,7 +76,7 @@ const daemonSetReader: IWorkloadReaderFunc = async (workloadName, namespace) =>
7376
const daemonSet = daemonSetResult.body;
7477

7578
if (!daemonSet.metadata || !daemonSet.spec || !daemonSet.spec.template.spec ||
76-
!daemonSet.spec.template.metadata) {
79+
!daemonSet.spec.template.metadata || !daemonSet.status) {
7780
// TODO(ivanstanev): add logging to know when/if it happens!
7881
return undefined;
7982
}
@@ -84,6 +87,7 @@ const daemonSetReader: IWorkloadReaderFunc = async (workloadName, namespace) =>
8487
specMeta: daemonSet.spec.template.metadata,
8588
containers: daemonSet.spec.template.spec.containers,
8689
ownerRefs: daemonSet.metadata.ownerReferences,
90+
revision: daemonSet.status.observedGeneration,
8791
};
8892
};
8993

@@ -135,7 +139,8 @@ const replicationControllerReader: IWorkloadReaderFunc = async (workloadName, na
135139
const replicationController = replicationControllerResult.body;
136140

137141
if (!replicationController.metadata || !replicationController.spec || !replicationController.spec.template ||
138-
!replicationController.spec.template.metadata || !replicationController.spec.template.spec) {
142+
!replicationController.spec.template.metadata || !replicationController.spec.template.spec ||
143+
!replicationController.status) {
139144
// TODO(ivanstanev): add logging to know when/if it happens!
140145
return undefined;
141146
}
@@ -146,6 +151,7 @@ const replicationControllerReader: IWorkloadReaderFunc = async (workloadName, na
146151
specMeta: replicationController.spec.template.metadata,
147152
containers: replicationController.spec.template.spec.containers,
148153
ownerRefs: replicationController.metadata.ownerReferences,
154+
revision: replicationController.status.observedGeneration,
149155
};
150156
};
151157

0 commit comments

Comments
 (0)