Skip to content

Commit 677998c

Browse files
committed
fix: rename informer endpoints and handlers to "namespaced"
This is in preparation for distinguishing informers between namespaces and cluster-level. This will allow us to significantly reduce the number of informers we create.
1 parent 8dfe460 commit 677998c

File tree

12 files changed

+119
-73
lines changed

12 files changed

+119
-73
lines changed

src/supervisor/watchers/handlers/cron-job.ts

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,16 @@ import { WorkloadKind } from '../../types';
99
import { FALSY_WORKLOAD_NAME_MARKER } from './types';
1010
import { IncomingMessage } from 'http';
1111
import { k8sApi } from '../../cluster';
12-
import { paginatedList } from './pagination';
12+
import { paginatedNamespacedList } from './pagination';
1313
import {
1414
deleteWorkloadAlreadyScanned,
1515
deleteWorkloadImagesAlreadyScanned,
1616
kubernetesObjectToWorkloadAlreadyScanned,
1717
} from '../../../state';
1818

19-
export async function paginatedCronJobList(namespace: string): Promise<{
19+
export async function paginatedNamespacedCronJobList(
20+
namespace: string,
21+
): Promise<{
2022
response: IncomingMessage;
2123
body: V1CronJobList;
2224
}> {
@@ -25,14 +27,16 @@ export async function paginatedCronJobList(namespace: string): Promise<{
2527
v1CronJobList.kind = 'CronJobList';
2628
v1CronJobList.items = new Array<V1CronJob>();
2729

28-
return await paginatedList(
30+
return await paginatedNamespacedList(
2931
namespace,
3032
v1CronJobList,
3133
k8sApi.batchClient.listNamespacedCronJob.bind(k8sApi.batchClient),
3234
);
3335
}
3436

35-
export async function paginatedCronJobV1Beta1List(namespace: string): Promise<{
37+
export async function paginatedNamespacedCronJobV1Beta1List(
38+
namespace: string,
39+
): Promise<{
3640
response: IncomingMessage;
3741
body: V1beta1CronJobList;
3842
}> {
@@ -41,7 +45,7 @@ export async function paginatedCronJobV1Beta1List(namespace: string): Promise<{
4145
cronJobList.kind = 'CronJobList';
4246
cronJobList.items = new Array<V1beta1CronJob>();
4347

44-
return await paginatedList(
48+
return await paginatedNamespacedList(
4549
namespace,
4650
cronJobList,
4751
k8sApi.batchUnstableClient.listNamespacedCronJob.bind(

src/supervisor/watchers/handlers/daemon-set.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,16 @@ import { WorkloadKind } from '../../types';
44
import { FALSY_WORKLOAD_NAME_MARKER } from './types';
55
import { IncomingMessage } from 'http';
66
import { k8sApi } from '../../cluster';
7-
import { paginatedList } from './pagination';
7+
import { paginatedNamespacedList } from './pagination';
88
import {
99
deleteWorkloadAlreadyScanned,
1010
deleteWorkloadImagesAlreadyScanned,
1111
kubernetesObjectToWorkloadAlreadyScanned,
1212
} from '../../../state';
1313

14-
export async function paginatedDaemonSetList(namespace: string): Promise<{
14+
export async function paginatedNamespacedDaemonSetList(
15+
namespace: string,
16+
): Promise<{
1517
response: IncomingMessage;
1618
body: V1DaemonSetList;
1719
}> {
@@ -20,7 +22,7 @@ export async function paginatedDaemonSetList(namespace: string): Promise<{
2022
v1DaemonSetList.kind = 'DaemonSetList';
2123
v1DaemonSetList.items = new Array<V1DaemonSet>();
2224

23-
return await paginatedList(
25+
return await paginatedNamespacedList(
2426
namespace,
2527
v1DaemonSetList,
2628
k8sApi.appsClient.listNamespacedDaemonSet.bind(k8sApi.appsClient),

src/supervisor/watchers/handlers/deployment-config.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,15 @@ import {
66
V1DeploymentConfig,
77
V1DeploymentConfigList,
88
} from './types';
9-
import { paginatedList } from './pagination';
9+
import { paginatedNamespacedList } from './pagination';
1010
import { k8sApi } from '../../cluster';
1111
import {
1212
deleteWorkloadAlreadyScanned,
1313
deleteWorkloadImagesAlreadyScanned,
1414
kubernetesObjectToWorkloadAlreadyScanned,
1515
} from '../../../state';
1616

17-
export async function paginatedDeploymentConfigList(
17+
export async function paginatedNamespacedDeploymentConfigList(
1818
namespace: string,
1919
): Promise<{
2020
response: IncomingMessage;
@@ -25,7 +25,7 @@ export async function paginatedDeploymentConfigList(
2525
v1DeploymentConfigList.kind = 'DeploymentConfigList';
2626
v1DeploymentConfigList.items = new Array<V1DeploymentConfig>();
2727

28-
return await paginatedList(
28+
return await paginatedNamespacedList(
2929
namespace,
3030
v1DeploymentConfigList,
3131
async (

src/supervisor/watchers/handlers/deployment.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,16 @@ import { WorkloadKind } from '../../types';
44
import { FALSY_WORKLOAD_NAME_MARKER } from './types';
55
import { IncomingMessage } from 'http';
66
import { k8sApi } from '../../cluster';
7-
import { paginatedList } from './pagination';
7+
import { paginatedNamespacedList } from './pagination';
88
import {
99
deleteWorkloadAlreadyScanned,
1010
deleteWorkloadImagesAlreadyScanned,
1111
kubernetesObjectToWorkloadAlreadyScanned,
1212
} from '../../../state';
1313

14-
export async function paginatedDeploymentList(namespace: string): Promise<{
14+
export async function paginatedNamespacedDeploymentList(
15+
namespace: string,
16+
): Promise<{
1517
response: IncomingMessage;
1618
body: V1DeploymentList;
1719
}> {
@@ -20,7 +22,9 @@ export async function paginatedDeploymentList(namespace: string): Promise<{
2022
v1DeploymentList.kind = 'DeploymentList';
2123
v1DeploymentList.items = new Array<V1Deployment>();
2224

23-
return await paginatedList(
25+
k8sApi.appsClient.listDeploymentForAllNamespaces();
26+
27+
return await paginatedNamespacedList(
2428
namespace,
2529
v1DeploymentList,
2630
k8sApi.appsClient.listNamespacedDeployment.bind(k8sApi.appsClient),

src/supervisor/watchers/handlers/index.ts

Lines changed: 70 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -11,27 +11,40 @@ import {
1111

1212
import { logger } from '../../../common/logger';
1313
import { WorkloadKind } from '../../types';
14-
import { podWatchHandler, podDeletedHandler, paginatedPodList } from './pod';
14+
import {
15+
podWatchHandler,
16+
podDeletedHandler,
17+
paginatedNamespacedPodList,
18+
} from './pod';
1519
import {
1620
cronJobWatchHandler,
17-
paginatedCronJobList,
18-
paginatedCronJobV1Beta1List,
21+
paginatedNamespacedCronJobList,
22+
paginatedNamespacedCronJobV1Beta1List,
1923
} from './cron-job';
20-
import { daemonSetWatchHandler, paginatedDaemonSetList } from './daemon-set';
21-
import { deploymentWatchHandler, paginatedDeploymentList } from './deployment';
22-
import { jobWatchHandler, paginatedJobList } from './job';
23-
import { paginatedReplicaSetList, replicaSetWatchHandler } from './replica-set';
2424
import {
25-
paginatedReplicationControllerList,
25+
daemonSetWatchHandler,
26+
paginatedNamespacedDaemonSetList,
27+
} from './daemon-set';
28+
import {
29+
deploymentWatchHandler,
30+
paginatedNamespacedDeploymentList,
31+
} from './deployment';
32+
import { jobWatchHandler, paginatedNamespacedJobList } from './job';
33+
import {
34+
paginatedNamespacedReplicaSetList,
35+
replicaSetWatchHandler,
36+
} from './replica-set';
37+
import {
38+
paginatedNamespacedReplicationControllerList,
2639
replicationControllerWatchHandler,
2740
} from './replication-controller';
2841
import {
29-
paginatedStatefulSetList,
42+
paginatedNamespacedStatefulSetList,
3043
statefulSetWatchHandler,
3144
} from './stateful-set';
3245
import {
3346
deploymentConfigWatchHandler,
34-
paginatedDeploymentConfigList,
47+
paginatedNamespacedDeploymentConfigList,
3548
} from './deployment-config';
3649
import { k8sApi, kubeConfig } from '../../cluster';
3750
import * as kubernetesApiWrappers from '../../kuberenetes-api-wrappers';
@@ -58,97 +71,111 @@ import { RETRYABLE_NETWORK_ERRORS } from '../types';
5871
*/
5972
const workloadWatchMetadata: Readonly<IWorkloadWatchMetadata> = {
6073
[WorkloadKind.Pod]: {
61-
endpoint: '/api/v1/namespaces/{namespace}/pods',
74+
namespacedEndpoint: '/api/v1/namespaces/{namespace}/pods',
6275
handlers: {
6376
[ADD]: podWatchHandler,
6477
[UPDATE]: podWatchHandler,
6578
[DELETE]: podDeletedHandler,
6679
},
67-
listFactory: (namespace) => () => paginatedPodList(namespace),
80+
namespacedListFactory: (namespace) => () =>
81+
paginatedNamespacedPodList(namespace),
6882
},
6983
[WorkloadKind.ReplicationController]: {
70-
endpoint: '/api/v1/watch/namespaces/{namespace}/replicationcontrollers',
84+
namespacedEndpoint:
85+
'/api/v1/watch/namespaces/{namespace}/replicationcontrollers',
7186
handlers: {
7287
[DELETE]: replicationControllerWatchHandler,
7388
},
74-
listFactory: (namespace) => () =>
75-
paginatedReplicationControllerList(namespace),
89+
namespacedListFactory: (namespace) => () =>
90+
paginatedNamespacedReplicationControllerList(namespace),
7691
},
7792
[WorkloadKind.CronJob]: {
78-
endpoint: '/apis/batch/v1/watch/namespaces/{namespace}/cronjobs',
93+
namespacedEndpoint: '/apis/batch/v1/watch/namespaces/{namespace}/cronjobs',
7994
handlers: {
8095
[DELETE]: cronJobWatchHandler,
8196
},
82-
listFactory: (namespace) => () => paginatedCronJobList(namespace),
97+
namespacedListFactory: (namespace) => () =>
98+
paginatedNamespacedCronJobList(namespace),
8399
},
84100
[WorkloadKind.CronJobV1Beta1]: {
85-
endpoint: '/apis/batch/v1beta1/watch/namespaces/{namespace}/cronjobs',
101+
namespacedEndpoint:
102+
'/apis/batch/v1beta1/watch/namespaces/{namespace}/cronjobs',
86103
handlers: {
87104
[DELETE]: cronJobWatchHandler,
88105
},
89-
listFactory: (namespace) => () => paginatedCronJobV1Beta1List(namespace),
106+
namespacedListFactory: (namespace) => () =>
107+
paginatedNamespacedCronJobV1Beta1List(namespace),
90108
},
91109
[WorkloadKind.Job]: {
92-
endpoint: '/apis/batch/v1/watch/namespaces/{namespace}/jobs',
110+
namespacedEndpoint: '/apis/batch/v1/watch/namespaces/{namespace}/jobs',
93111
handlers: {
94112
[DELETE]: jobWatchHandler,
95113
},
96-
listFactory: (namespace) => () => paginatedJobList(namespace),
114+
namespacedListFactory: (namespace) => () =>
115+
paginatedNamespacedJobList(namespace),
97116
},
98117
[WorkloadKind.DaemonSet]: {
99-
endpoint: '/apis/apps/v1/watch/namespaces/{namespace}/daemonsets',
118+
namespacedEndpoint: '/apis/apps/v1/watch/namespaces/{namespace}/daemonsets',
100119
handlers: {
101120
[DELETE]: daemonSetWatchHandler,
102121
},
103-
listFactory: (namespace) => () => paginatedDaemonSetList(namespace),
122+
namespacedListFactory: (namespace) => () =>
123+
paginatedNamespacedDaemonSetList(namespace),
104124
},
105125
[WorkloadKind.Deployment]: {
106-
endpoint: '/apis/apps/v1/watch/namespaces/{namespace}/deployments',
126+
namespacedEndpoint:
127+
'/apis/apps/v1/watch/namespaces/{namespace}/deployments',
107128
handlers: {
108129
[DELETE]: deploymentWatchHandler,
109130
},
110-
listFactory: (namespace) => () => paginatedDeploymentList(namespace),
131+
namespacedListFactory: (namespace) => () =>
132+
paginatedNamespacedDeploymentList(namespace),
111133
},
112134
[WorkloadKind.ReplicaSet]: {
113-
endpoint: '/apis/apps/v1/watch/namespaces/{namespace}/replicasets',
135+
namespacedEndpoint:
136+
'/apis/apps/v1/watch/namespaces/{namespace}/replicasets',
114137
handlers: {
115138
[DELETE]: replicaSetWatchHandler,
116139
},
117-
listFactory: (namespace) => () => paginatedReplicaSetList(namespace),
140+
namespacedListFactory: (namespace) => () =>
141+
paginatedNamespacedReplicaSetList(namespace),
118142
},
119143
[WorkloadKind.StatefulSet]: {
120-
endpoint: '/apis/apps/v1/watch/namespaces/{namespace}/statefulsets',
144+
namespacedEndpoint:
145+
'/apis/apps/v1/watch/namespaces/{namespace}/statefulsets',
121146
handlers: {
122147
[DELETE]: statefulSetWatchHandler,
123148
},
124-
listFactory: (namespace) => () => paginatedStatefulSetList(namespace),
149+
namespacedListFactory: (namespace) => () =>
150+
paginatedNamespacedStatefulSetList(namespace),
125151
},
126152
[WorkloadKind.DeploymentConfig]: {
127153
/** https://docs.openshift.com/container-platform/4.7/rest_api/workloads_apis/deploymentconfig-apps-openshift-io-v1.html */
128-
endpoint:
154+
namespacedEndpoint:
129155
'/apis/apps.openshift.io/v1/watch/namespaces/{namespace}/deploymentconfigs',
130156
handlers: {
131157
[DELETE]: deploymentConfigWatchHandler,
132158
},
133-
listFactory: (namespace) => () => paginatedDeploymentConfigList(namespace),
159+
namespacedListFactory: (namespace) => () =>
160+
paginatedNamespacedDeploymentConfigList(namespace),
134161
},
135162
};
136163

137-
async function isSupportedWorkload(
164+
async function isSupportedNamespacedWorkload(
138165
namespace: string,
139166
workloadKind: WorkloadKind,
140167
): Promise<boolean> {
141168
switch (workloadKind) {
142169
case WorkloadKind.DeploymentConfig:
143-
return await isDeploymentConfigSupported(namespace);
170+
return await isNamespacedDeploymentConfigSupported(namespace);
144171
case WorkloadKind.CronJobV1Beta1:
145-
return await isCronJobVersionSupported(
172+
return await isNamespacedCronJobSupported(
146173
workloadKind,
147174
namespace,
148175
k8sApi.batchUnstableClient,
149176
);
150177
case WorkloadKind.CronJob:
151-
return await isCronJobVersionSupported(
178+
return await isNamespacedCronJobSupported(
152179
workloadKind,
153180
namespace,
154181
k8sApi.batchClient,
@@ -158,7 +185,7 @@ async function isSupportedWorkload(
158185
}
159186
}
160187

161-
async function isCronJobVersionSupported(
188+
async function isNamespacedCronJobSupported(
162189
workloadKind: WorkloadKind,
163190
namespace: string,
164191
client: BatchV1Api | BatchV1beta1Api,
@@ -204,7 +231,7 @@ async function isCronJobVersionSupported(
204231
}
205232
}
206233

207-
async function isDeploymentConfigSupported(
234+
async function isNamespacedDeploymentConfigSupported(
208235
namespace: string,
209236
): Promise<boolean> {
210237
try {
@@ -252,7 +279,10 @@ export async function setupInformer(
252279
workloadKind: WorkloadKind,
253280
): Promise<void> {
254281
const logContext: Record<string, unknown> = { namespace, workloadKind };
255-
const isSupported = await isSupportedWorkload(namespace, workloadKind);
282+
const isSupported = await isSupportedNamespacedWorkload(
283+
namespace,
284+
workloadKind,
285+
);
256286
if (!isSupported) {
257287
logger.debug(
258288
logContext,
@@ -262,12 +292,12 @@ export async function setupInformer(
262292
}
263293

264294
const workloadMetadata = workloadWatchMetadata[workloadKind];
265-
const namespacedEndpoint = workloadMetadata.endpoint.replace(
295+
const namespacedEndpoint = workloadMetadata.namespacedEndpoint.replace(
266296
'{namespace}',
267297
namespace,
268298
);
269299

270-
const listMethod = workloadMetadata.listFactory(namespace);
300+
const listMethod = workloadMetadata.namespacedListFactory(namespace);
271301
const loggedListMethod = async () => {
272302
try {
273303
return await kubernetesApiWrappers.retryKubernetesApiRequest(() =>

src/supervisor/watchers/handlers/job.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,14 @@ import { WorkloadKind } from '../../types';
44
import { FALSY_WORKLOAD_NAME_MARKER } from './types';
55
import { IncomingMessage } from 'http';
66
import { k8sApi } from '../../cluster';
7-
import { paginatedList } from './pagination';
7+
import { paginatedNamespacedList } from './pagination';
88
import {
99
deleteWorkloadAlreadyScanned,
1010
deleteWorkloadImagesAlreadyScanned,
1111
kubernetesObjectToWorkloadAlreadyScanned,
1212
} from '../../../state';
1313

14-
export async function paginatedJobList(namespace: string): Promise<{
14+
export async function paginatedNamespacedJobList(namespace: string): Promise<{
1515
response: IncomingMessage;
1616
body: V1JobList;
1717
}> {
@@ -20,7 +20,7 @@ export async function paginatedJobList(namespace: string): Promise<{
2020
v1JobList.kind = 'JobList';
2121
v1JobList.items = new Array<V1Job>();
2222

23-
return await paginatedList(
23+
return await paginatedNamespacedList(
2424
namespace,
2525
v1JobList,
2626
k8sApi.batchClient.listNamespacedJob.bind(k8sApi.batchClient),

src/supervisor/watchers/handlers/pagination.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ const PAGE_SIZE = 100;
1717
* The workloads collected are additionally trimmed to contain only the relevant data for vulnerability analysis.
1818
* The combination of both listing and trimming ensures we reduce our memory footprint and prevent overloading the API server.
1919
*/
20-
export async function paginatedList<
20+
export async function paginatedNamespacedList<
2121
T extends KubernetesObject & Partial<{ status: unknown; spec: unknown }>,
2222
>(
2323
namespace: string,

0 commit comments

Comments
 (0)