Skip to content

Commit a000a3f

Browse files
fix(compute-providers): make metadata cleanup idempotent
1 parent f10a155 commit a000a3f

2 files changed

Lines changed: 40 additions & 1 deletion

File tree

lambdas/libs/compute-providers/aws/microvm/src/control-plane/runner-metadata.test.ts

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,38 @@ describe('MicroVM metadata lifecycle', () => {
175175
]);
176176
});
177177

178+
it('continues deleting metadata when optional parameters are already absent', async () => {
179+
vi.mocked(deleteParameter)
180+
.mockRejectedValueOnce(
181+
Object.assign(new Error('ParameterNotFound'), {
182+
__type: 'ParameterNotFound',
183+
$fault: 'client',
184+
$metadata: { httpStatusCode: 400 },
185+
}),
186+
)
187+
.mockRejectedValueOnce(Object.assign(new Error('missing parameter'), { name: 'ParameterNotFound' }));
188+
189+
await expect(deleteMicrovmRunnerMetadata(metadataSsmPath, 'mvm-1')).resolves.toBeUndefined();
190+
expect(vi.mocked(deleteParameter).mock.calls.map(([name]) => name)).toEqual([
191+
`${metadataSsmPath}/mvm-1.github-runner-id`,
192+
`${metadataSsmPath}/mvm-1.orphan`,
193+
`${metadataSsmPath}/mvm-1.cleanup-requested-at`,
194+
`${metadataSsmPath}/mvm-1`,
195+
]);
196+
});
197+
198+
it('propagates metadata deletion failures other than missing parameters', async () => {
199+
const error = Object.assign(new Error('AccessDeniedException'), {
200+
__type: 'AccessDeniedException',
201+
$fault: 'client',
202+
$metadata: { httpStatusCode: 400 },
203+
});
204+
vi.mocked(deleteParameter).mockRejectedValueOnce(error);
205+
206+
await expect(deleteMicrovmRunnerMetadata(metadataSsmPath, 'mvm-1')).rejects.toBe(error);
207+
expect(deleteParameter).toHaveBeenCalledTimes(1);
208+
});
209+
178210
it('returns tracked and state-only active cleanup requests for termination retry', async () => {
179211
vi.mocked(getParametersByPath).mockResolvedValue(
180212
new Map([

lambdas/libs/compute-providers/aws/microvm/src/control-plane/runner-metadata.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,13 @@ function isRecord(value: unknown): value is Record<string, unknown> {
8888
return typeof value === 'object' && value !== null && !Array.isArray(value);
8989
}
9090

91+
function isParameterNotFound(error: unknown): boolean {
92+
return (
93+
error instanceof Error &&
94+
(error.name === 'ParameterNotFound' || ('__type' in error && error.__type === 'ParameterNotFound'))
95+
);
96+
}
97+
9198
function optionalString(value: unknown): value is string | undefined {
9299
return value === undefined || (typeof value === 'string' && value.length > 0);
93100
}
@@ -342,7 +349,7 @@ export async function deleteMicrovmRunnerMetadata(metadataSsmPath: string, micro
342349
try {
343350
await deleteParameter(parameterName);
344351
} catch (error) {
345-
if (!(error instanceof Error && error.name === 'ParameterNotFound')) throw error;
352+
if (!isParameterNotFound(error)) throw error;
346353
}
347354
}
348355
}

0 commit comments

Comments
 (0)