Skip to content

Commit 07f4f34

Browse files
committed
fix: scan workloads that are controllers
In order to be accurate when looking for a supported workload, we need to look both at the ownerReferences and to ensure that the owner is a controller. This fix ensures both and adds tests to verify this.
1 parent beca76d commit 07f4f34

File tree

2 files changed

+49
-2
lines changed

2 files changed

+49
-2
lines changed

src/kube-scanner/workload-reader.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,10 @@ export function getWorkloadReader(workloadType: string): IWorkloadReaderFunc {
176176

177177
export function getSupportedWorkload(ownerRefs: V1OwnerReference[] | undefined): V1OwnerReference | undefined {
178178
return ownerRefs !== undefined
179-
? ownerRefs.find((owner) => SupportedWorkloadTypes.includes(owner.kind))
179+
? ownerRefs.find(
180+
(owner) =>
181+
SupportedWorkloadTypes.includes(owner.kind) &&
182+
owner.controller === true,
183+
)
180184
: undefined;
181185
}

test/unit/workload-reader.test.ts

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import * as tap from 'tap';
22

3-
import { SupportedWorkloadTypes } from '../../src/kube-scanner/workload-reader';
3+
import { SupportedWorkloadTypes, getSupportedWorkload } from '../../src/kube-scanner/workload-reader';
4+
import { V1OwnerReference } from '@kubernetes/client-node';
45

56
tap.test('SupportedWorkloadTypes', async (t) => {
67
t.ok(SupportedWorkloadTypes.indexOf('Deployment') > -1, 'Deployment is a supported workload');
@@ -11,3 +12,45 @@ tap.test('SupportedWorkloadTypes', async (t) => {
1112
t.ok(SupportedWorkloadTypes.indexOf('CronJob') > -1, 'CronJob is a supported workload');
1213
t.ok(SupportedWorkloadTypes.indexOf('ReplicationController') > -1, 'ReplicationController is a supported workload');
1314
});
15+
16+
tap.test('getSupportedWorkload()', async (t) => {
17+
t.same(getSupportedWorkload(undefined), undefined, 'returns undefined on receiving undefined');
18+
t.same(getSupportedWorkload([]), undefined, 'returns undefined on empty list');
19+
20+
const unsupportedOwnerRefs = [
21+
{ kind: 'B7', controller: true },
22+
{ kind: ':egg:', controller: true },
23+
];
24+
t.same(
25+
getSupportedWorkload(unsupportedOwnerRefs as V1OwnerReference[]),
26+
undefined,
27+
'returns undefined when there is no match in a list',
28+
);
29+
30+
const noController = [{ kind: 'ReplicaSet' }, { kind: 'Deployment' }];
31+
t.same(
32+
getSupportedWorkload(noController as V1OwnerReference[]),
33+
undefined,
34+
'returns undefined when no OwnerReference is a controller',
35+
);
36+
37+
const oneController = [
38+
{ kind: 'ReplicaSet' },
39+
{ kind: 'Deployment', controller: true },
40+
];
41+
t.same(
42+
getSupportedWorkload(oneController as V1OwnerReference[]),
43+
{ kind: 'Deployment', controller: true },
44+
'returns the only controller in a list',
45+
);
46+
47+
const twoControllers = [
48+
{ kind: 'ReplicaSet', controller: true },
49+
{ kind: 'Deployment', controller: true },
50+
];
51+
t.same(
52+
getSupportedWorkload(twoControllers as V1OwnerReference[]),
53+
{ kind: 'ReplicaSet', controller: true },
54+
'returns the first controller in a list',
55+
);
56+
});

0 commit comments

Comments
 (0)