Commit Graph

5460 Commits

Author SHA1 Message Date
Olivier Gayot 93f06eeb0f dry-run: add configuration object to control dry-run behavior
Oftentimes, we want to simulate a specific behavior of the application
when running in dry-run mode. To do so, we use either command line
parameters or environment variables.

This patch introduces a configuration object for dry-run executions
only. The object can be automatically loaded from a JSON file specified
via the --dry-run-config CLI argument.

Such a configuration object should help us cover way more test cases.
Going forward, I would like to use this object for things like:

 * drivers - to instruct Subiquity what third-party drivers it should
   suggest ; or if Subiquity should run ubuntu-drivers on the host
   instead.
 * ubuntu-pro - to specify the ua-contracts test environment URL - or
   predefined automatic replies for the server
 * to assume that /var/lib/snapd/seed/systems directory exists on the
   source (or not).
 * to specify the Ubuntu release that is returned by lsb_release ; can
   be used to test behavior on LTS vs non LTS releases.
 *
 * ...

Signed-off-by: Olivier Gayot <olivier.gayot@canonical.com>
2022-11-25 15:49:01 +01:00
Olivier Gayot 6d851e348c test_api: remove execution bit from the test_api.py script
The test_api.py is not meant to be used as en entry point. There is no
shebang so executing the script from a sh-compatible shell can be pretty
messy.

Signed-off-by: Olivier Gayot <olivier.gayot@canonical.com>
2022-11-25 13:02:36 +01:00
Olivier Gayot 9eea4cf220
Merge pull request #1490 from ogayot/fetch-keys-with-proxy
Fetch SSH keys through the configured proxy
2022-11-23 12:06:52 +01:00
Olivier Gayot 0f4376ccd3 ssh: split code to import SSH keys and add unit tests
Signed-off-by: Olivier Gayot <olivier.gayot@canonical.com>
2022-11-22 16:47:53 +01:00
Olivier Gayot 18f8735c49 ssh: call ssh-keygen once for each key to import
ssh-keygen -l supports an input file that has multiple keys. As a
result, it will output multiple key fingerprints.

That being said, ssh-keygen will ignore empty newlines from the input
(and maybe other things?).
It makes it slightly challenging to associate each key with its
fingerprint because the number of lines in the input and output can
differ, e.g.:

             input               |               output
  -----------------------------------------------------------------------
  ssh-rsa AA[...] user@host     ◀-▶ 256 SHA256:[...] user@host (RSA)
  <empty line>                   ┌▶ 3072 SHA256:[...] user@host (ED25519)
  ssh-ed25519 AA[...] user@host ◀┘

To simplify this process, we will do one call to ssh-keygen -l for each
key from the input.

Signed-off-by: Olivier Gayot <olivier.gayot@canonical.com>
2022-11-22 16:36:34 +01:00
Olivier Gayot aa4a674352 ssh: use specified proxy when importing SSH keys
When fetching SSH keys, the proxy settings specified by the user were
not used. This resulted in the inability to import keys in networks where
a HTTP proxy is mandatory.

We now explicitly set the https_proxy environment variable when calling
ssh-import-id if a proxy was configured by the user.

Signed-off-by: Olivier Gayot <olivier.gayot@canonical.com>
2022-11-22 16:36:09 +01:00
Olivier Gayot e107504748 ssh: fetch SSH keys on the server side and expose API for it
Instead of fetching SSH keys on the client side, we now make the client
consume an API and have the implementation on the server.

The main benefit is that it gives us more control over the environment
where the ssh-import-id command is executed.

This should allow us to set HTTP proxy environment variables (and
optionally locale-related variables such as LC_MESSAGES) according to
the user's selection.

Signed-off-by: Olivier Gayot <olivier.gayot@canonical.com>
2022-11-22 16:36:08 +01:00
Olivier Gayot 69c120e235 ssh: ignore empty lines when importing multiple SSH keys
ssh-import-id will include empty lines when multiple keys get imported.
These empty lines end up included in the array of authorized keys that
Subiquity manages and subsequently get passed to cloud-init and get
stored in autoinstall-user-data:

  authorized_keys = [
    'ssh-rsa AAAA[...] user@hostname',
    '',
    'ssh-ed255129 AAAA[...] user@hostname2',
  ]

Although cloud-init successfully ignores empty lines, it seems cleaner
to filter those out in Subiquity.

Signed-off-by: Olivier Gayot <olivier.gayot@canonical.com>
2022-11-22 09:55:04 +01:00
Olivier Gayot fd3a856bc4
Merge pull request #1489 from ogayot/inc-proc-output-in-except
utils: inc. captured stdout / stderr when forging CalledProcessError
2022-11-22 09:36:48 +01:00
Olivier Gayot fcebcac568 utils: inc. captured stdout / stderr when forging CalledProcessError
When executing a command via arun_command with check=True, we forge
and then raise a CalledProcessError exception if the command exits
abnormally (i.e., exit code != 0).

When doing so, we only instantiate the exception with the exit code and
the command executed. This means that we lose access to any output
captured so far. This is usually fine for stdout but stderr oftentimes
contains invaluable information to understand what caused the command to
exit abnormally.

Back in Python 3.5, stdout and stderr were introduced as new attributes
for CalledProcessError.
We now also include stdout and stderr in the CalledProcessError
instances that we forge. This allows us to access stderr (if any) when
catching the exception with:

  try:
      ...
  except CalledProcessError as exc:
      print(exc.stderr)

Signed-off-by: Olivier Gayot <olivier.gayot@canonical.com>
2022-11-21 15:11:09 +01:00
Michael Hudson-Doyle 83d1046128 add a new member of the snapdapi.Role enum
This kind of change is a bit of a problem with the current approach to
talking to snapd I guess -- deserialization will fail if we encounter a
new value for one of these fields.
2022-11-21 11:23:07 +13:00
Dan Bungert fa0aa32117
Merge pull request #1485 from mwhudson/tpm-reuse-part
reuse an existing partition if possible in apply_system
2022-11-17 10:00:45 -07:00
Dan Bungert 21713022e4
Merge pull request #1487 from ogayot/fix-tpm-race
Cherry-pick patch - fix answers race (maybe)
2022-11-17 09:09:00 -07:00
Michael Hudson-Doyle 9d3b6cc616 fix answers race (maybe) 2022-11-17 10:51:33 +01:00
Michael Hudson-Doyle 97901a78a2 fix answers race (maybe) 2022-11-17 22:24:22 +13:00
Michael Hudson-Doyle 368d49cca1 FilesystemController.on_devices should always refer to underlying device 2022-11-17 22:03:58 +13:00
Michael Hudson-Doyle f13084169f fix reusing a formatted partition 2022-11-17 22:03:58 +13:00
Michael Hudson-Doyle 72c7e8df43 reuse an existing partition if possible in apply_system
This required a bit of a refactor which lead to rewriting tests as well
as adding a new one.
2022-11-17 22:03:58 +13:00
Michael Hudson-Doyle e735f83a8a
Merge pull request #1482 from mwhudson/server-install-desktop
configure controllers tui does not support when installing desktop
2022-11-16 11:11:57 +13:00
Michael Hudson-Doyle f015634b79 configure controllers tui does not support when installing desktop
A bit of a hack but probably a useful one.
2022-11-15 15:43:33 +13:00
Michael Hudson-Doyle ed13c64b05
Merge pull request #1484 from mwhudson/no-desktop-without-catalog
remove any support for a desktop installer without a source catalog
2022-11-15 15:41:40 +13:00
Michael Hudson-Doyle a48c2b4f14 remove any support for a desktop installer without a source catalog
The code in subiquity main could plausibly be offered as an upgrade to
users installing focal server and focal server ISOs do not have a source
catalog so we need to support that. But we will never support a desktop
ISO that does not have a source catalog so we can remove some slightly
confusing code that attempted to cover that case.
2022-11-15 13:41:42 +13:00
Michael Hudson-Doyle c585c41f3a
Merge pull request #1480 from mwhudson/stickier-channels
do not switch snap channel from .disk/info if not on ubuntu/stable-XX.YY
2022-11-15 11:50:28 +13:00
Michael Hudson-Doyle 820a482d49 do not switch snap channel from .disk/info if not on ubuntu/stable-XX.YY
The point of switching snap channel based on .disk/info is so that we
can avoid releasing updates to point release media if they won't work
there. If the snap is not tracking ubuntu/stable-XX.YY then there is
funny business afoot and we are not on point release media, so switching
channels as if we are is just unhelpful (for example, if you are working
on a project that is going to involve giving someone an image with a
subiquity from a non default track).

If the channel to switch to comes from the kernel command line or
autoinstall though, it should still be honoured.
2022-11-15 11:42:39 +13:00
Michael Hudson-Doyle 22b1958e0a
Merge pull request #1481 from mwhudson/tpm-v2
force storage version to 2 for a core boot classic install
2022-11-15 09:31:34 +13:00
Michael Hudson-Doyle 97d4fd70cd another comment for future work 2022-11-15 08:51:07 +13:00
Michael Hudson-Doyle 68316ceb80 force storage version to 2 for a core boot classic install
also a barely-related tweak to more accurately decide which path to take
in installation
2022-11-15 08:51:02 +13:00
Michael Hudson-Doyle 8b1699eaf2
Merge pull request #1479 from mwhudson/tpm-encrypt
call into snapd to set up encryption when required
2022-11-15 08:38:56 +13:00
Michael Hudson-Doyle 5971541beb use @ogayot's better bash
Co-authored-by: Olivier Gayot <olivier.gayot@sigexec.com>
2022-11-11 14:46:46 +13:00
Michael Hudson-Doyle 5dafdb916d call into snapd to set up encryption when required 2022-11-11 14:46:44 +13:00
Michael Hudson-Doyle cabb8dda8e add the ability to only generate a subset of curtin fs actions
DEVICES == everything up to and including partitioning
FORMAT_MOUNT == formatting and mounting
2022-11-11 14:46:24 +13:00
Michael Hudson-Doyle 21407002bd
Merge pull request #1476 from mwhudson/tpm-install
support installing an unencrypted core boot classic system
2022-11-10 12:06:08 +13:00
Michael Hudson-Doyle 7618ce2af6 extend "unit" test to cover finish_install
and fix the bug it inevitably found.
2022-11-10 11:57:21 +13:00
Michael Hudson-Doyle 2bb3aab362 add sample data which will fail at the finish-install step 2022-11-10 11:48:37 +13:00
Michael Hudson-Doyle c24cfd3d04 call into snapd to finish the installation of a core boot classic system 2022-11-10 11:48:37 +13:00
Michael Hudson-Doyle 8b2df438d9 record the device for each snapdapi.Role 2022-11-10 11:48:36 +13:00
Michael Hudson-Doyle 084a40b15b do not run the curthooks step for an core boot classic system 2022-11-10 11:47:29 +13:00
Michael Hudson-Doyle 5baa7b5e5f tidy sample data slightly 2022-11-10 11:47:29 +13:00
Michael Hudson-Doyle 8869c0edc1
Merge pull request #1477 from mwhudson/tpm-mount-system
bind mount systems from before asking snapd about them
2022-11-10 11:47:00 +13:00
Michael Hudson-Doyle 690f23acf9 add ?wait=true to serverish api test
POSTing to /source now triggers some asynchronous activity
2022-11-09 09:46:47 +13:00
Michael Hudson-Doyle 632e099e1a
Merge pull request #1473 from ogayot/codecs
codecs: add ability to install ubuntu-restricted-addons
2022-11-09 08:51:27 +13:00
Michael Hudson-Doyle 8b9a16c198 bind mount systems from before asking snapd about them
For the systems currently being tested, the live installer environment
is stacked on the one being installed and so the system definition for
the system being installed is already available. That's not going to be
true in full generality though, so add some helpers to make all systems
defined in the source available in the live installer environment before
calling into snapd to find out about them.
2022-11-08 14:48:35 +13:00
Michael Hudson-Doyle a372c3edab
Merge pull request #1475 from mwhudson/asyncio.create_task
switch from loop.create_task to asyncio.create_task
2022-11-08 11:06:18 +13:00
Michael Hudson-Doyle c03b23d7e4
Merge pull request #1470 from mwhudson/tpm-partitioning
do partitioning based on information from gadget
2022-11-08 10:26:59 +13:00
Michael Hudson-Doyle 82f2c78989 improvements suggested in review 2022-11-08 10:13:47 +13:00
Michael Hudson-Doyle 85b3cd0724 switch from loop.create_task to asyncio.create_task
mostly done with sed
2022-11-08 10:08:46 +13:00
Michael Hudson-Doyle 448512e31c only offer disks the gadget will fit on 2022-11-04 12:04:42 +01:00
Michael Hudson-Doyle cf80463e5b do partitioning based on information from gadget 2022-11-04 11:57:17 +01:00
Michael Hudson-Doyle 796f442445 generalize the handling of core boot classic systems we do not / cannot support 2022-11-04 11:56:33 +01:00
Olivier Gayot c46723750b codecs: add ability to install ubuntu-restricted-addons
Subiquity now supports a new endpoint that can be used by the desktop
installer to configure whether the ubuntu-restricted-addons package
should be installed. This package contains third-party codecs commonly
used on a desktop install.

  curl --unix-socket /run/subiquity/socket http://a/codecs
  > {"install": false}

  curl --unix-socket /run/subiquity/socket \
    http://a/codecs -d '{"install": true}'

  curl --unix-socket /run/subiquity/socket http://a/codecs
  > {"install": true}

Signed-off-by: Olivier Gayot <olivier.gayot@canonical.com>
2022-11-04 10:41:03 +01:00