Skip to content

Commit f293107

Browse files
authored
Merge pull request #965 from andekande/master
support fieldSelector for Informer
2 parents 14b6d48 + 57c6bfc commit f293107

File tree

3 files changed

+58
-1
lines changed

3 files changed

+58
-1
lines changed

src/cache.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ export class ListWatch<T extends KubernetesObject> implements ObjectCache<T>, In
3838
private readonly listFn: ListPromise<T>,
3939
autoStart: boolean = true,
4040
private readonly labelSelector?: string,
41+
private readonly fieldSelector?: string,
4142
) {
4243
this.callbackCache[ADD] = [];
4344
this.callbackCache[UPDATE] = [];
@@ -169,10 +170,14 @@ export class ListWatch<T extends KubernetesObject> implements ObjectCache<T>, In
169170
} as {
170171
resourceVersion: string | undefined;
171172
labelSelector: string | undefined;
173+
fieldSelector: string | undefined;
172174
};
173175
if (this.labelSelector !== undefined) {
174176
queryParams.labelSelector = ObjectSerializer.serialize(this.labelSelector, 'string');
175177
}
178+
if (this.fieldSelector !== undefined) {
179+
queryParams.fieldSelector = ObjectSerializer.serialize(this.fieldSelector, 'string');
180+
}
176181
this.request = await this.watch.watch(
177182
this.path,
178183
queryParams,

src/cache_test.ts

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1438,6 +1438,57 @@ describe('ListWatchCache', () => {
14381438
expect(reqOpts.qs.labelSelector).to.equal(APP_LABEL_SELECTOR);
14391439
});
14401440

1441+
it('should send field selector', async () => {
1442+
const APP_FIELD_SELECTOR = 'metadata.name=name1';
1443+
1444+
const list: V1Namespace[] = [
1445+
{
1446+
metadata: {
1447+
name: 'name1',
1448+
} as V1ObjectMeta,
1449+
} as V1Namespace,
1450+
{
1451+
metadata: {
1452+
name: 'name2',
1453+
} as V1ObjectMeta,
1454+
} as V1Namespace,
1455+
];
1456+
const listObj = {
1457+
metadata: {
1458+
resourceVersion: '12345',
1459+
} as V1ListMeta,
1460+
items: list,
1461+
} as V1NamespaceList;
1462+
1463+
const listFn: ListPromise<V1Namespace> = function (): Promise<{
1464+
response: http.IncomingMessage;
1465+
body: V1NamespaceList;
1466+
}> {
1467+
return new Promise<{ response: http.IncomingMessage; body: V1NamespaceList }>(
1468+
(resolve, reject) => {
1469+
resolve({ response: {} as http.IncomingMessage, body: listObj });
1470+
},
1471+
);
1472+
};
1473+
1474+
const kc = new KubeConfig();
1475+
Object.assign(kc, fakeConfig);
1476+
const fakeRequestor = mock.mock(DefaultRequest);
1477+
const watch = new Watch(kc, mock.instance(fakeRequestor));
1478+
1479+
const fakeRequest = new FakeRequest();
1480+
mock.when(fakeRequestor.webRequest(mock.anything())).thenReturn(fakeRequest);
1481+
1482+
const informer = new ListWatch('/some/path', watch, listFn, false, undefined, APP_FIELD_SELECTOR);
1483+
1484+
await informer.start();
1485+
1486+
mock.verify(fakeRequestor.webRequest(mock.anything()));
1487+
const [opts] = mock.capture(fakeRequestor.webRequest).last();
1488+
const reqOpts: request.OptionsWithUri = opts as request.OptionsWithUri;
1489+
expect(reqOpts.qs.fieldSelector).to.equal(APP_FIELD_SELECTOR);
1490+
});
1491+
14411492
it('should ignore request errors after it is aborted', async () => {
14421493
const fakeWatch = mock.mock(Watch);
14431494
const list: V1Pod[] = [];

src/informer.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,8 @@ export function makeInformer<T extends KubernetesObject>(
4444
path: string,
4545
listPromiseFn: ListPromise<T>,
4646
labelSelector?: string,
47+
fieldSelector?: string,
4748
): Informer<T> & ObjectCache<T> {
4849
const watch = new Watch(kubeconfig);
49-
return new ListWatch<T>(path, watch, listPromiseFn, false, labelSelector);
50+
return new ListWatch<T>(path, watch, listPromiseFn, false, labelSelector, fieldSelector);
5051
}

0 commit comments

Comments
 (0)