* o/assertstate, o/devicestate: add more general function for fetching validation set assertions
* daemon, client: add API routes for creating/removing recovery system
* daemon, o/snapstate: add .snap file extension to snaps from forms
The seed writer will fail to consider files as snaps if their filenames
do not end in .snap.
* tests: test creating a recovery system
* tests: add spread test for offline creation of recovery system
* tests: update offline recovery system test to reboot into new system
* tests/nested/manual/recovery-system-reboot: add variants for factory-reset and install modes
* tests: replace usage of default-recovery-system with default-recovery
* o/devicestate: enable offline creation of recovery system entirely from pre-installed snaps
* daemon, client: test that offline API works without providing snaps or validation sets
* tests/nested/manual/recovery-system-offline: test offline remodel with only pre-installed snaps
* tests/nested/manual/recovery-system-reboot: modify test to create system with new set of essential snaps
* tests: disable shellcheck printf check
* daemon: rename functions for working with form values and add one for working with booleans
* daemon: acquire state lock later in postSystemActionCreateOffline
* daemon: cleanup form files if we fail to make change to create a recovery system
* daemon: rename parseValidationSets to assertionsFromValidationSetStrings for clarity
* client, daemon, tests: add "offline" field to create recovery system JSON api
* daemon: convert TODO about comma-delimited list into explanation of why we use a comma delimited list
* NEWS.md: add mention of create/remove recovery systems API
* tests/nested/manual/recovery-system-offline: explicitly disable network from nested vm
* tests/nested/manual/recovery-system-reboot: do not use new gadget in recovery system for now
* tests/lib/nested.sh: add variable NESTED_FORCE_MS_KEYS to force using microsoft keys
* tests/nested/manual/recovery-system-reboot: add back gadget snap swap to test
* tests/nested/manual/recovery-system-reboot: retry POST to remove since there might be an auto-refresh happening
* daemon: add offline field to remodeling JSON payload
* client, cmd/snap: add offline boolean option for remodeling to client and cli interface
* daemon: make snap files optional in the "multipart/form-data" remodel api
* tests/nested/manual/remodel-offline: add variants to test different combinations of installed/local snaps/assertions
* client: update comment on RemodelWithLocalSnaps to mention not contacting the store
* c/snap: remove unneeded var declaration
* tests/nested/manual/remodel-offline: clarify section that acks/adds the validation set assertion
* tests/nested/manual/remodel-offline: fix shellcheck warning on test's -a flag
* client: verify that normal (online) remodel does not set offline field in JSON payload
This flag will enable offline remodeling, even when all snaps required for the remodel are not provided locally. The remodel will fall back to using already installed snaps in situations that it can. This includes simple channel switches, and when the required revision of a snap is already installed. If a snap is required for the remodel, and the snap is neither provided locally or already installed, then the remodel will fail.
* snap: add support for errors.Is for NotInstalledError
* o/snapstate: add Type to SnapSetup created in snapstate.Switch
* o/devicestate, overlord, daemon: add flag to devicestate.Remodel to force an offline remodel
This flag will enable offline remodeling, even when all snaps required
for the remodel are not provided locally. The remodel will fall back to
using already installed snaps in situations that it can. This includes
simple channel switches, and when the required revision of a snap is
already installed.
* o/devicestate: re-word comment on RemodelOptions.Offline
* o/devicestate: convert sideInfoAndPathFromID to a method on remodelVariant
* o/devicestate: make comment in UpdateWithDeviceContext more clear
* o/devicestate: add TODO about looking for other revisions
* o/devicestate: add comment explaining that case in UpdateWithDeviceContext is unexpected
* o/devicestate: prefix unexpected state error with "internal error"
* o/devicestate: use var for default initialization
* o/devicestate: invert if in UpdateWithDeviceContext to reduce some nesting
* o/devicestate: rename sideInfoAndPathFromID and add some clarifying comments
* o/devicestate: remove unused parameter from remodelEssentialSnapTasks
* o/devicestate: correct copy-pasted comment
the cleanliness gained by having two structures with almost
the same fields is probably not enough to justify both of them,
especially because daemon is where we are supposed to build
responses, we might as well deal with the details
Meta was a quick hack, also it hasn't really grown since so we can
try to remove it now
AsyncResponse never takes anything over the result but the change id