Commit Graph

5575 Commits

Author SHA1 Message Date
Olivier Gayot f875d59ed7
Merge pull request #1494 from ogayot/ubuntu-pro-test
MagicAttach: add ability to test in dry-run against the staging environment & demo web portal
2022-11-29 10:29:50 +01:00
Olivier Gayot 0b5c32a8e2
Merge pull request #1495 from ogayot/ubuntu-pro-fix
ubuntu-pro: cancel any contract selection before initiating a new one
2022-11-29 10:29:27 +01:00
Michael Hudson-Doyle fb4eb50999 apply default swap configuration for core boot classic 2022-11-29 16:12:07 +13:00
Michael Hudson-Doyle 05050d9788 create an fstab for a core boot classic system 2022-11-29 15:53:58 +13:00
Michael Hudson-Doyle 756fda0f91 stop having Role be an enum
I do not want getting an unexpected value here to crash subiquity.
2022-11-29 15:14:14 +13:00
Michael Hudson-Doyle b90419af41 improve a few log messages and file paths 2022-11-29 15:04:28 +13:00
Michael Hudson-Doyle b1d95a2982 update curtin to get swap, quick_zero, first-lba fixes 2022-11-29 14:55:39 +13:00
Olivier Gayot 0736885d46 ubuntu-pro: cancel any contract selection before initiating a new one
Upon reaching the Ubuntu Pro screen that shows the user-code, we need to
initiate a contract selection. If we are navigating to the screen a
second time though, we need to cancel existing contract selections
before initiating a new one.

Failing to do so results in a UPCSAlreadyInitiatedError.

Signed-off-by: Olivier Gayot <olivier.gayot@canonical.com>
2022-11-28 19:15:52 +01:00
Olivier Gayot fc056b0fbe ubuntu-pro: add ability to choose contracts env in dryrun mode
In dry-run mode, instead of reading the uacontracts environment URL from
/etc/ubuntu-advantage/uaclient.conf, we can now override this variable
by specifying the 'pro_ua_contracts_url' dry-run parameter.

In conjunction with 'pro_magic_attach_run_locally', this allows us to
test Subiquity against testing environments. By default it will use the
staging environment (i.e., https://contracts.staging.canonical.com).

Signed-off-by: Olivier Gayot <olivier.gayot@canonical.com>
2022-11-28 17:27:23 +01:00
Olivier Gayot d74a506f98 ubuntu-pro: add ability to run magic-attach locally in dry-run mode
In dry-run mode, the 'magic_attach_run_locally' variable can now be used
to execute uaclient on the host (against the uacontracts environment
specified in /etc/ubuntu-advantage/uaclient.conf) instead of relying on
a mock mechanism.

Signed-off-by: Olivier Gayot <olivier.gayot@canonical.com>
2022-11-28 17:27:23 +01:00
Olivier Gayot e887232ea1
Merge pull request #1493 from ogayot/fix-mount-snapd-systems
Fix crash when /var/lib/snapd/seed/systems does not exist on source
2022-11-28 10:52:45 +01:00
Michael Hudson-Doyle cba5313b47
Merge pull request #1492 from ogayot/test_api-x
test_api: remove execution bit from the test_api.py script
2022-11-28 09:33:20 +13:00
Olivier Gayot 217ac98fc6 filesystem: mount snapd/seed/systems only if it exists
The "$source"/var/lib/snapd/seed/systems directory only exists in certain
scenarios related to TPM-backed FDE. When the directory does not exist,
attempting to bind-mount it to /var/lib/snapd/seed/systems crashes the
install with a CalledProcessError.

We now make sure the directory exists before trying to mount it. For
dry-run test cases, we added a configuration item that simulates the
presence (or the non-presence) of the systems directory on the source.

Signed-off-by: Olivier Gayot <olivier.gayot@canonical.com>
2022-11-25 15:50:01 +01:00
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