Skip to content

Commit b9a013e

Browse files
committed
feat: added example for informer with label selector
1 parent edc9de5 commit b9a013e

File tree

1 file changed

+83
-0
lines changed

1 file changed

+83
-0
lines changed
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
// tslint:disable:no-console
2+
import * as k8s from '@kubernetes/client-node';
3+
4+
const kc = new k8s.KubeConfig();
5+
kc.loadFromDefault();
6+
7+
const k8sApi = kc.makeApiClient(k8s.CoreV1Api);
8+
9+
const APP_LABEL_SELECTOR = 'app=foo';
10+
11+
const listFn = () => k8sApi.listNamespacedPod(
12+
'default',
13+
undefined,
14+
undefined,
15+
undefined,
16+
undefined,
17+
APP_LABEL_SELECTOR,
18+
);
19+
20+
const createPod = async (name, app) => {
21+
const appPodContainer = {
22+
name: 'nginx',
23+
image: 'nginx:latest',
24+
} as k8s.V1Container;
25+
26+
const appPod = {
27+
metadata: {
28+
name,
29+
labels: {
30+
app,
31+
},
32+
},
33+
spec: {
34+
containers: [appPodContainer],
35+
},
36+
} as k8s.V1Pod;
37+
await k8sApi.createNamespacedPod('default', appPod).catch((e) => console.error(e));
38+
console.log('create', name);
39+
};
40+
41+
const deletePod = async (name, namespace) => {
42+
await k8sApi.deleteNamespacedPod(name, namespace);
43+
console.log('delete', name);
44+
};
45+
46+
const delay = (ms) => {
47+
return new Promise((resolve) => setTimeout(resolve, ms));
48+
};
49+
50+
const informer = k8s.makeInformer(
51+
kc,
52+
'/api/v1/namespaces/default/pods',
53+
listFn,
54+
APP_LABEL_SELECTOR,
55+
);
56+
57+
informer.on('add', (obj: k8s.V1Pod) => {
58+
console.log(`Added: ${obj.metadata!.name}`);
59+
});
60+
informer.on('update', (obj: k8s.V1Pod) => {
61+
console.log(`Updated: ${obj.metadata!.name}`);
62+
});
63+
informer.on('delete', (obj: k8s.V1Pod) => {
64+
console.log(`Deleted: ${obj.metadata!.name}`);
65+
});
66+
informer.on('error', (err: k8s.V1Pod) => {
67+
console.error(err);
68+
// Restart informer after 5sec
69+
setTimeout(() => {
70+
informer.start();
71+
}, 5000);
72+
});
73+
74+
informer.start().then(() => {
75+
setTimeout(async () => {
76+
await createPod('server-foo', 'foo');
77+
await delay(5000);
78+
await createPod('server-bar', 'bar');
79+
await delay(5000);
80+
await deletePod('server-foo', 'default');
81+
await deletePod('server-bar', 'default');
82+
}, 5000);
83+
});

0 commit comments

Comments
 (0)