Repository navigation
v0.3.0
Upgrade if you are on 0.1.0 or 0.2.0
0.1.0 and 0.2.0 are yanked and their releases withdrawn. 0.3.0 is the release to
install.
Breaking
Two behaviours callers may be relying on are different, which is why this is
0.3.0 and not 0.2.1.
| 0.2.0 | 0.3.0 | |
|---|---|---|
wait_until_running(), wait_for_guest() |
refused a suspended or stopped computer outright | refuse only one the platform is holding nothing for; a start it has already admitted is waited for |
wait_for_guest() at its deadline |
raised TimeoutError, whatever the probe had hit |
re-raises a permanent error — authentication, permission, billing, a missing computer, TLS; only transient failures become a readiness timeout |
is_transient() |
answered True for every ConflictError but MoveRequiredError |
also answers False for a template_image_preparing conflict, which wants a deliberate continuation rather than a blind retry |
Added
start(resume_only=True)resumes a saved session without cold-booting a
stopped computer (#80). If no saved session remains, the request succeeds and
the computer stays stopped — the method refreshes and returns the computer, so
read its state when you need to know which of the two happened. Both clients
take the keyword. It needs a platform that understandsresume_only; an older
one may ignore it and cold-boot, and a successful response does not say which
happened.create(template_transfer=...)continues onto an image the platform has
already prepared, rather than starting a fresh build, after a409whose
codeistemplate_image_preparing(#83). The refusal carries
body["preparation"]— the preparation's ownstateanderror, failure
included, which deserves diagnosis before any retry. The token requires the
original nonempty template, cannot be combined withsize, and is not a
create idempotency key: stop after success, and never replay an ambiguous or
lost response. The README works both the sync and async shape end to end.APIError.retry_after—Retry-Afteras seconds, HTTP-date form
included,Nonewhen the header is absent or malformed (#83). It now reaches
every refusal that carries one; before, onlyRateLimitErrorhad it. A delay
is not permission to replay the request.
Fixed
- A valid event stream could fail when several small events arrived in one
decompressed chunk (#85). The decoder applied its size limit to the chunk
before splitting it into events, so a burst past the limit was rejected
although no single frame was near it. The bound now applies per normalized
frame and to the incomplete tail, UTF-8 flush output included, and the scan
advances a cursor rather than recopying the rest of the burst. Oversized
frames, complete or not, are still refused; order, delimiter accounting,
UTF-8, BOM, CRLF and terminal-event handling are unchanged. - A permanent failure at a guest-readiness deadline is no longer buried
(#84).wait_for_guest()raisedTimeoutErrorwhen its last probe had been
refused outright, hiding the error the caller had to handle. Both clients keep
it; only transient failures become a readiness timeout. - A start already under way is no longer refused (#81). The two waits told a
computer nobody is starting apart from one whose start has been admitted using
the running-pool figure the platform publishes, and treat its absence as
unknown rather than as nothing coming: a host too old to report it, or one that
could not be reached, has not said a start is not happening. Waiting there
costs a timeout; refusing costs a machine. A memory fork, which reserves its
RAM at the start of its disk copy and resumes itself at the end while
reportingbuildingthroughout, is waited for as well.