





















@@ -13,14 +13,18 @@ export interface WaitForVmStatusOptions {
1313probeTimeoutMs?: () => number | undefined;
1414}
151516+export interface EnsureVmRunningOptions extends WaitForVmStatusOptions {
17+transitionTimeoutMs?: () => number | undefined;
18+}
19+1620export function listVmNames(): string[] {
1721return listVms()
1822.map((item) => (item.name ?? "").trim())
1923.filter(Boolean);
2024}
212522-export function vmStatus(vmName: string): string {
23-return listVms().find((vm) => vm.name === vmName)?.status || "missing";
26+export function vmStatus(vmName: string, timeoutMs?: number): string {
27+return listVms(timeoutMs).find((vm) => vm.name === vmName)?.status || "missing";
2428}
25292630export function waitForVmStatus(
@@ -44,24 +48,28 @@ export function waitForVmStatus(
4448throw new Error(`VM ${vmName} did not reach ${expected}`);
4549}
465047-export function ensureVmRunning(vmName: string, timeoutSeconds = 180): void {
51+export function ensureVmRunning(
52+vmName: string,
53+timeoutSeconds = 180,
54+options: EnsureVmRunningOptions = {},
55+): void {
4856const deadline = Date.now() + timeoutSeconds * 1000;
4957while (Date.now() < deadline) {
50-const status = vmStatus(vmName);
58+const status = vmStatus(vmName, options.probeTimeoutMs?.());
5159if (status === "running") {
5260return;
5361}
5462if (status === "stopped") {
5563say(`Start ${vmName} before update phase`);
5664run("prlctl", ["start", vmName], {
5765quiet: true,
58-timeoutMs: PRLCTL_TRANSITION_TIMEOUT_MS,
66+timeoutMs: options.transitionTimeoutMs?.() ?? PRLCTL_TRANSITION_TIMEOUT_MS,
5967});
6068} else if (status === "suspended" || status === "paused") {
6169say(`Resume ${vmName} before update phase`);
6270run("prlctl", ["resume", vmName], {
6371quiet: true,
64-timeoutMs: PRLCTL_TRANSITION_TIMEOUT_MS,
72+timeoutMs: options.transitionTimeoutMs?.() ?? PRLCTL_TRANSITION_TIMEOUT_MS,
6573});
6674} else if (status === "missing") {
6775die(`VM not found before update phase: ${vmName}`);
@@ -97,11 +105,11 @@ export function resolveUbuntuVmName(requested: string, explicit = false): string
97105return fallback;
98106}
99107100-function listVms(): PrlctlVmListItem[] {
108+function listVms(timeoutMs = PRLCTL_STATUS_TIMEOUT_MS): PrlctlVmListItem[] {
101109return JSON.parse(
102110run("prlctl", ["list", "--all", "--json"], {
103111quiet: true,
104-timeoutMs: PRLCTL_STATUS_TIMEOUT_MS,
112+ timeoutMs,
105113}).stdout,
106114) as PrlctlVmListItem[];
107115}
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。