Skip to content

Commit 917c6cb

Browse files
committed
Fix a bug where an error on request wouldn't propogate.
Add tests.
1 parent 8d5047a commit 917c6cb

File tree

2 files changed

+35
-4
lines changed

2 files changed

+35
-4
lines changed

src/cache.ts

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import {
1010
ObjectCallback,
1111
UPDATE,
1212
} from './informer.js';
13-
import { KubernetesObject } from './types.js';
13+
import { KubernetesObject, KubernetesListObject } from './types.js';
1414
import { ObjectSerializer } from './serializer.js';
1515
import { Watch } from './watch.js';
1616

@@ -143,8 +143,14 @@ export class ListWatch<T extends KubernetesObject> implements ObjectCache<T>, In
143143
}
144144
this.callbackCache[CONNECT].forEach((elt: ErrorCallback) => elt(undefined));
145145
if (!this.resourceVersion) {
146-
const promise = this.listFn();
147-
const list = await promise;
146+
let list: KubernetesListObject<T>;
147+
try {
148+
const promise = this.listFn();
149+
list = await promise;
150+
} catch (err) {
151+
this.callbackCache[ERROR].forEach((elt: ErrorCallback) => elt(err));
152+
return;
153+
}
148154
this.objects = deleteItems(this.objects, list.items, this.callbackCache[DELETE].slice());
149155
this.addOrUpdateItems(list.items);
150156
this.resourceVersion = list.metadata!.resourceVersion || '';

src/cache_test.ts

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { deepStrictEqual, notStrictEqual, strictEqual, throws } from 'node:assert';
1+
import { deepStrictEqual, fail, equal, notStrictEqual, strictEqual, throws } from 'node:assert';
22
import mock from 'ts-mockito';
33

44
import { V1Namespace, V1NamespaceList, V1ObjectMeta, V1Pod, V1PodList, V1ListMeta } from './api.js';
@@ -1460,4 +1460,29 @@ describe('delete items', () => {
14601460

14611461
strictEqual(await connectPromise, true);
14621462
});
1463+
1464+
it('should correctly handle errors in the initial list', async () => {
1465+
const fake = mock.mock(Watch);
1466+
const requestErr = Error('request failed');
1467+
const listFn: ListPromise<V1Namespace> = function (): Promise<V1NamespaceList> {
1468+
return new Promise<V1NamespaceList>((resolve, reject) => {
1469+
reject(requestErr);
1470+
});
1471+
};
1472+
const lw = new ListWatch('/some/path', fake, listFn);
1473+
let gotErr: Error | null = null;
1474+
const errCalled = new Promise<void>((resolve, reject) => {
1475+
lw.on('error', (err) => {
1476+
gotErr = err;
1477+
resolve();
1478+
});
1479+
});
1480+
try {
1481+
await lw.start();
1482+
await errCalled;
1483+
equal(gotErr, requestErr);
1484+
} catch (err) {
1485+
fail(`unexpected error: ${err}`);
1486+
}
1487+
});
14631488
});

0 commit comments

Comments
 (0)