test(clock): add lifecycle deploy checkpoint
This commit is contained in:
@@ -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>'
|
||||||
);
|
);
|
||||||
|
|||||||
Reference in New Issue
Block a user