test(clock): add lifecycle deploy checkpoint

This commit is contained in:
2026-09-03 17:30:24 +00:00
parent 0aa549a6c5
commit b250e908f4
@@ -27,6 +27,7 @@ type State = {
preopenAt: string; preopenAt: string;
openAt: string; openAt: string;
resetOperationId: string; resetOperationId: string;
deployOperationId?: string;
users?: Array<{ users?: Array<{
username: string; username: string;
displayName: string; displayName: string;
@@ -189,14 +190,13 @@ const reset = async (): Promise<void> => {
}); });
}; };
const waitReset = async (): Promise<void> => { const waitOperation = async (operationId: string, eventPrefix: string): Promise<void> => {
const state = await readState();
const gateway = await loginAdmin(); const gateway = await loginAdmin();
let cursor: string | undefined; let cursor: string | undefined;
let lastHeartbeatAt = 0; let lastHeartbeatAt = 0;
while (true) { while (true) {
const result = await gateway.admin.operations.logs.query({ const result = await gateway.admin.operations.logs.query({
id: state.resetOperationId, id: operationId,
afterCursor: cursor, afterCursor: cursor,
limit: 200, limit: 200,
timeoutMs: 20_000, timeoutMs: 20_000,
@@ -205,14 +205,14 @@ const waitReset = async (): Promise<void> => {
const notable = result.entries.filter((entry) => entry.level !== 'OUTPUT'); const notable = result.entries.filter((entry) => entry.level !== 'OUTPUT');
if (notable.length > 0 || Date.now() - lastHeartbeatAt >= 20_000) { if (notable.length > 0 || Date.now() - lastHeartbeatAt >= 20_000) {
lastHeartbeatAt = Date.now(); lastHeartbeatAt = Date.now();
log('reset-progress', { log(`${eventPrefix}-progress`, {
status: result.operation.status, status: result.operation.status,
receivedLogEntries: result.entries.length, receivedLogEntries: result.entries.length,
phases: notable.map((entry) => `${entry.level}:${entry.phase}`), phases: notable.map((entry) => `${entry.level}:${entry.phase}`),
}); });
} }
if (['SUCCEEDED', 'FAILED', 'CANCELLED'].includes(result.operation.status)) { if (['SUCCEEDED', 'FAILED', 'CANCELLED'].includes(result.operation.status)) {
log('reset-terminal', { log(`${eventPrefix}-terminal`, {
status: result.operation.status, status: result.operation.status,
error: result.operation.error ?? null, error: result.operation.error ?? null,
completedAt: result.operation.completedAt ?? null, completedAt: result.operation.completedAt ?? null,
@@ -223,6 +223,31 @@ const waitReset = async (): Promise<void> => {
} }
}; };
const waitReset = async (): Promise<void> => {
const state = await readState();
await waitOperation(state.resetOperationId, 'reset');
};
const deploy = async (): Promise<void> => {
const state = await readState();
const gateway = await loginAdmin();
const operation = await gateway.admin.operations.requestDeploy.mutate({
profileName,
sourceMode: 'BRANCH',
sourceRef,
reason: 'deploy suspended-action lifecycle fixes without resetting the isolated season',
});
state.deployOperationId = operation.id;
await writeState(state);
log('deploy-requested', { operationId: operation.id, profileName, sourceMode: 'BRANCH', sourceRef });
};
const waitDeploy = async (): Promise<void> => {
const state = await readState();
if (!state.deployOperationId) throw new Error('No lifecycle deploy operation was requested.');
await waitOperation(state.deployOperationId, 'deploy');
};
const status = async (): Promise<void> => { const status = async (): Promise<void> => {
const gateway = await loginAdmin(); const gateway = await loginAdmin();
const profiles = (await gateway.admin.profiles.list.query()) as unknown as Array< const profiles = (await gateway.admin.profiles.list.query()) as unknown as Array<
@@ -2149,6 +2174,8 @@ const monitorUsers = async (): Promise<void> => {
const command = process.argv[2]; const command = process.argv[2];
if (command === 'reset') await reset(); if (command === 'reset') await reset();
else if (command === 'wait-reset') await waitReset(); else if (command === 'wait-reset') await waitReset();
else if (command === 'deploy') await deploy();
else if (command === 'wait-deploy') await waitDeploy();
else if (command === 'status') await status(); else if (command === 'status') await status();
else if (command === 'prepare-users') await prepareUsers(); else if (command === 'prepare-users') await prepareUsers();
else if (command === 'preopen-messages') await preopenMessages(); else if (command === 'preopen-messages') await preopenMessages();
@@ -2181,5 +2208,5 @@ else if (command === 'wait-runtime-action') await waitRuntimeAction();
else if (command === 'monitor-users') await monitorUsers(); else if (command === 'monitor-users') await monitorUsers();
else else
throw new Error( throw new Error(
'usage: live-ten-user-lifecycle.ts <reset|wait-reset|status|prepare-users|preopen-messages|verified-preopen-messages|repair-preopen-fixture|database-status|prepare-paused-betting|submit-paused-betting|reserve-user-enlistments|prepare-action-fixture|exercise-paused-actions|verify-paused-wall-expiry|exercise-paused-tournament-bet|reserve-actionable-commands|wait-actionable-messages|respond-actionable-messages|reserve-no-aggression-cancellation|wait-no-aggression-cancellation|respond-no-aggression-cancellation|npc-action-audit|repair-opening-clock-runtime|verify-monitor-message|resume-daemon|fast-forward|place-invader-recipients|respond-invader-browser|action|wait-profile-status|wait-runtime-action|monitor-users>' 'usage: live-ten-user-lifecycle.ts <reset|wait-reset|deploy|wait-deploy|status|prepare-users|preopen-messages|verified-preopen-messages|repair-preopen-fixture|database-status|prepare-paused-betting|submit-paused-betting|reserve-user-enlistments|prepare-action-fixture|exercise-paused-actions|verify-paused-wall-expiry|exercise-paused-tournament-bet|reserve-actionable-commands|wait-actionable-messages|respond-actionable-messages|reserve-no-aggression-cancellation|wait-no-aggression-cancellation|respond-no-aggression-cancellation|npc-action-audit|repair-opening-clock-runtime|verify-monitor-message|resume-daemon|fast-forward|place-invader-recipients|respond-invader-browser|action|wait-profile-status|wait-runtime-action|monitor-users>'
); );