Keep invalid container states from dropping host heartbeats

This commit is contained in:
2026-10-05 16:15:15 -04:00
parent 87c5cf4b4b
commit ad63b3957d
6 changed files with 36 additions and 18 deletions
+11 -8
View File
@@ -255,14 +255,17 @@ export function validateInventory(value: unknown): HostInventory {
}
if (inventory.cpuUsagePercent !== undefined && (typeof inventory.cpuUsagePercent !== 'number' || !Number.isFinite(inventory.cpuUsagePercent) || inventory.cpuUsagePercent < 0 || inventory.cpuUsagePercent > 100)) throw new Error('Invalid inventory cpuUsagePercent.');
validateInstanceResources(inventory);
if (inventory.instanceStates !== undefined && (!Array.isArray(inventory.instanceStates) || inventory.instanceStates.length > 1000
|| inventory.instanceStates.some(state => !state || typeof state !== 'object'
|| typeof state.instanceId !== 'string' || !/^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$/.test(state.instanceId)
|| !Number.isSafeInteger(state.generation) || state.generation < 1
|| typeof state.state !== 'string' || !/^[a-z-]{1,40}$/.test(state.state)
|| typeof state.healthy !== 'boolean' || state.healthy && state.state !== 'running'
|| typeof state.observedAt !== 'string' || state.observedAt.length > 40 || !Number.isFinite(Date.parse(state.observedAt))))) {
throw new Error('Invalid instance state inventory.');
if (inventory.instanceStates !== undefined) {
if (!Array.isArray(inventory.instanceStates) || inventory.instanceStates.length > 1000) {
throw new Error('Invalid instance state inventory.');
}
// A malformed server observation must not discard the host heartbeat.
inventory.instanceStates = inventory.instanceStates.filter(state => state && typeof state === 'object'
&& typeof state.instanceId === 'string' && /^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$/.test(state.instanceId)
&& Number.isSafeInteger(state.generation) && state.generation >= 1
&& typeof state.state === 'string' && /^[a-z-]{1,40}$/.test(state.state)
&& typeof state.healthy === 'boolean' && (!state.healthy || state.state === 'running')
&& typeof state.observedAt === 'string' && state.observedAt.length <= 40 && Number.isFinite(Date.parse(state.observedAt)));
}
for (const key of ['dockerRunning','directoriesWritable']) if (inventory[key] !== undefined && typeof inventory[key] !== 'boolean') throw new Error(`Invalid inventory ${key}.`);
if (inventory.runtimeImages !== undefined && (!Array.isArray(inventory.runtimeImages) || inventory.runtimeImages.some(image => typeof image !== 'string'))) throw new Error('Invalid runtime image inventory.');