Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 39 additions & 4 deletions .github/workflows/tests.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -11,15 +11,39 @@ on:
- main

jobs:
build-snapd-deb:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
with:
repository: 'valentindavid/snapd'
path: snapd
ref: 'valentindavid/split-snap-bootstrap'
- name: Build snapd deb
working-directory: '${{ github.workspace }}/snapd'
run: |
sudo apt update
sudo DEBIAN_FRONTEND=noninteractive apt build-dep -yqq --no-install-recommends ./
bash get-deps.sh
DEB_BUILD_OPTIONS=nocheck dpkg-buildpackage -us -uc
- uses: actions/upload-artifact@v2
with:
name: snapd
path: "${{ github.workspace }}/snapd_*.deb"

build:
runs-on: self-hosted
needs: build-snapd-deb
steps:
- name: Cleanup job workspace
id: cleanup-job-workspace
run: |
rm -rf "${{ github.workspace }}"
mkdir "${{ github.workspace }}"
- uses: actions/checkout@v2
- uses: actions/download-artifact@v2
with:
name: snapd

- name: Build snap
run: |
Expand All @@ -41,14 +65,19 @@ jobs:

tests-main:
runs-on: self-hosted
needs: build
needs:
- build
- build-snapd-deb
steps:
- name: Cleanup job workspace
id: cleanup-job-workspace
run: |
rm -rf "${{ github.workspace }}"
mkdir "${{ github.workspace }}"
- uses: actions/checkout@v2
- uses: actions/download-artifact@v2
with:
name: snapd
- uses: actions/download-artifact@v2
with:
name: snaps
Expand All @@ -66,7 +95,9 @@ jobs:
done
tests-snapd:
runs-on: ubuntu-latest
needs: build
needs:
- build
- build-snapd-deb
steps:
- name: Cleanup job workspace
id: cleanup-job-workspace
Expand All @@ -79,8 +110,12 @@ jobs:
path: core-initrd
- uses: actions/checkout@v2
with:
repository: 'snapcore/snapd'
repository: 'valentindavid/snapd'
path: snapd
ref: 'valentindavid/split-snap-bootstrap'
- uses: actions/download-artifact@v2
with:
name: snapd
- uses: actions/download-artifact@v2
with:
name: snaps
Expand All @@ -94,7 +129,7 @@ jobs:
. "core-initrd/tests/lib/prepare-utils.sh"

echo "************* INSTALLING DEPS *************"
install_core_initrd_deps '${{ github.workspace }}/core-initrd'
install_core_initrd_deps '${{ github.workspace }}/core-initrd' '${{ github.workspace }}'/snapd_*.deb

echo "************* DOWNLOADING SNAPS *************"
download_core_initrd_snaps 'edge'
Expand Down
1 change: 1 addition & 0 deletions debian/rules
Original file line number Diff line number Diff line change
Expand Up @@ -262,6 +262,7 @@ override_dh_auto_install:
cp -a $(CURDIR)/debian/tmp/usr/lib/systemd/libsystemd-shared* $(TEMPLIBDIR)
set -e; \
for f in \
/usr/bin/systemd-escape \
/lib/$(DEB_HOST_MULTIARCH)/libnss_files.so.* \
/lib/$(DEB_HOST_MULTIARCH)/libnss_compat.so.* \
/lib/$(DEB_HOST_MULTIARCH)/libgcc_s.so.1 \
Expand Down
1 change: 1 addition & 0 deletions factory/usr/lib/systemd/system-generators/snap-generator
90 changes: 90 additions & 0 deletions factory/usr/lib/systemd/system-generators/snap-mounts
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
#!/bin/sh

set -eu

normaldir="${1}"
mkdir -p "${normaldir}"

generate_unit() {
where="${1}"
fs="${2}"
device="${3}"
shift 3

mount_unit="$(systemd-escape --suffix=mount -p "${where}")"

unset before
for target; do
case "${target}" in
-*)
;;
*)
before="${before-}${before:+ }$(echo "${target}" | sed 's/[.]\(requires\|wants\)$//')"
;;
esac
mkdir -p "${normaldir}/${target#-}"
ln -s "../${mount_unit}" "${normaldir}/${target#-}/${mount_unit}"
done

case "${fs}" in
tmpfs)
cat <<EOF >"${normaldir}/${mount_unit}"
[Unit]
DefaultDependencies=no
${before:+Before=}${before}

[Mount]
Type=${fs}
What=${device}
Where=${where}
Options=nosuid,private
EOF
;;
*)
device_escaped="$(systemd-escape -p "${device}")"
cat <<EOF >"${normaldir}/${mount_unit}"
[Unit]
DefaultDependencies=no
BindsTo=${device_escaped}.device
After=${device_escaped}.device
Requires=systemd-fsck@${device_escaped}.service
After=systemd-fsck@${device_escaped}.service
${before:+Before=}${before}

[Mount]
Type=${fs}
What=${device}
Where=${where}
Options=private
EOF
;;
esac
}

if mode="$(/usr/libexec/core/get-arg snapd_recovery_mode)"; then
case "${mode}" in
run)
disable_seed=-
disable_save=-
if [ -L /dev/ubuntu/disk ]; then
if udevadm info --query=property /dev/ubuntu/disk | grep -q '^UBUNTU_SEED_UUID='; then
disable_seed=
fi
if udevadm info --query=property /dev/ubuntu/disk | grep -q '^UBUNTU_SAVE_UUID='; then
disable_save=
fi
fi
generate_unit /run/mnt/data ext4 /dev/ubuntu/data initrd-root-fs.target.requires snap-data-save-mounted.target.requires modeenv-available.target.requires
generate_unit /run/mnt/ubuntu-seed vfat /dev/ubuntu/seed ${disable_seed}initrd-root-fs.target.wants ${disable_seed}model-available.target.wants
generate_unit /run/mnt/ubuntu-boot ext4 /dev/ubuntu/boot initrd-root-fs.target.requires model-available.target.requires
generate_unit /run/mnt/ubuntu-save ext4 /dev/ubuntu/save ${disable_save}initrd-root-fs.target.wants ${disable_save}snap-data-save-mounted.target.wants
;;
install)
generate_unit /run/mnt/ubuntu-seed vfat /dev/ubuntu/seed initrd-root-fs.target.requires model-available.target.requires
generate_unit /run/mnt/data tmpfs tmpfs initrd-root-fs.target.requires
;;
*)
exit 0
;;
esac
fi
2 changes: 2 additions & 0 deletions factory/usr/lib/systemd/system/detect-classic-sysroot.service
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
[Unit]
ConditionKernelCommandLine=!snapd_recovery_mode=run
ConditionKernelCommandLine=!snapd_recovery_mode=install
Description=Detect Ubuntu classic sysroot
DefaultDependencies=no
Before=initrd-root-device.target
Expand Down
2 changes: 2 additions & 0 deletions factory/usr/lib/systemd/system/detect-uc-sysroot.service
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
[Unit]
ConditionKernelCommandLine=!snapd_recovery_mode=run
ConditionKernelCommandLine=!snapd_recovery_mode=install
Description=Detect Ubuntu Core sysroot
DefaultDependencies=no
Before=initrd-root-device.target
Expand Down
5 changes: 5 additions & 0 deletions factory/usr/lib/systemd/system/modeenv-available.target
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
[Unit]
Description=Modeenv available

Wants=reload-disk.service
After=reload-disk.service
10 changes: 10 additions & 0 deletions factory/usr/lib/systemd/system/model-available.target
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
[Unit]
Description=Model available

# This unit will depend on the mount that will contain the model to load.
# In run mode, it will be run-mnt-ubuntu\x2dseed.mount
# In install/recover/reset, it will be in run-mnt-ubuntu\x2dboot.mount
# Those units will be generated and added by /usr/lib/systemd/system-generators/snap-mounts

Wants=reload-disk.service
After=reload-disk.service
4 changes: 4 additions & 0 deletions factory/usr/lib/systemd/system/populate-writable.service
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,18 @@ OnFailure=emergency.target
OnFailureJobMode=replace-irreversibly
DefaultDependencies=no
Before=initrd-root-fs.target
# run-mnt-data.mount is generated by /usr/lib/systemd/system-generators/snap-mounts
After=run-mnt-data.mount
# run-mnt-base.mount is generated by /usr/lib/systemd/system-generators/snap-generator
After=run-mnt-base.mount
After=sysroot.mount
After=sysroot-writable.mount
Requires=sysroot.mount
Requires=sysroot-writable.mount
Wants=snap-initramfs-mounts.service
After=snap-initramfs-mounts.service
Wants=snap-configure-gadget.service
After=snap-configure-gadget.service

ConditionPathIsMountPoint=/run/mnt/base

Expand Down
18 changes: 18 additions & 0 deletions factory/usr/lib/systemd/system/reload-disk.service
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
[Unit]
ConditionKernelCommandLine=|snapd_recovery_mode=run
ConditionKernelCommandLine=|snapd_recovery_mode=install
Description=Reload disk

OnFailure=emergency.target
OnFailureJobMode=replace-irreversibly

DefaultDependencies=no

Requires=dev-ubuntu-disk.device
After=dev-ubuntu-disk.device

[Service]
Type=oneshot
RemainAfterExit=true
ExecStartPre=-systemctl daemon-reload
ExecStart=-systemctl --no-block start initrd-root-fs.target snap-data-mounted-mounted.target
27 changes: 27 additions & 0 deletions factory/usr/lib/systemd/system/reload-model.service
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
[Unit]
ConditionKernelCommandLine=|snapd_recovery_mode=run
ConditionKernelCommandLine=|snapd_recovery_mode=install
Description=Reload model

OnFailure=emergency.target
OnFailureJobMode=replace-irreversibly

DefaultDependencies=no

# run-mnt-data.mount is generated by /usr/lib/systemd/system-generators/snap-mounts
Requires=run-mnt-data.mount
After=run-mnt-data.mount

After=model-available.target
Requires=model-available.target
After=modeenv-available.target
Requires=modeenv-available.target

After=sysinit.target
After=tmp.mount

[Service]
Type=oneshot
RemainAfterExit=true
ExecStartPre=-systemctl daemon-reload
ExecStart=-systemctl --no-block start initrd-root-fs.target
19 changes: 19 additions & 0 deletions factory/usr/lib/systemd/system/snap-compare-data-save.service
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
[Unit]
ConditionKernelCommandLine=snapd_recovery_mode=run
ConditionPathIsEncrypted=/run/mnt/data
Description=Compare data and save partitions
OnFailure=emergency.target
OnFailureJobMode=replace-irreversibly
DefaultDependencies=no

Before=initrd-root-fs.target

Wants=snap-data-save-mounted.target
After=snap-data-save-mounted.target

[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/usr/lib/snapd/snap-bootstrap compare-data-save
StandardOutput=journal+console
StandardError=journal+console
20 changes: 20 additions & 0 deletions factory/usr/lib/systemd/system/snap-configure-gadget.service
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
[Unit]
ConditionKernelCommandLine=|snapd_recovery_mode=install
Description=Configure the gadget
OnFailure=emergency.target
OnFailureJobMode=replace-irreversibly
DefaultDependencies=no

Requires=reload-model.service
After=reload-model.service

# run-mnt-data.mount is generated by /usr/lib/systemd/system-generators/snap-mounts
Requires=run-mnt-data.mount
After=run-mnt-data.mount

[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/usr/lib/snapd/snap-bootstrap configure-gadget
StandardOutput=journal+console
StandardError=journal+console
5 changes: 5 additions & 0 deletions factory/usr/lib/systemd/system/snap-data-save-mounted.target
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
[Unit]
Description=Data mounted

Wants=reload-model.service
After=reload-model.service
20 changes: 20 additions & 0 deletions factory/usr/lib/systemd/system/snap-ephemeral-modeenv.service
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
[Unit]
ConditionKernelCommandLine=|snapd_recovery_mode=install
Description=Generate an ephemeral modeenv
OnFailure=emergency.target
OnFailureJobMode=replace-irreversibly
DefaultDependencies=no

Requires=reload-model.service
After=reload-model.service

# run-mnt-data.mount is generated by /usr/lib/systemd/system-generators/snap-mounts
Requires=run-mnt-data.mount
After=run-mnt-data.mount

[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/usr/lib/snapd/snap-bootstrap ephemeral-modeenv
StandardOutput=journal+console
StandardError=journal+console
5 changes: 5 additions & 0 deletions factory/usr/lib/systemd/system/snap-initramfs-mounts.service
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
[Unit]
ConditionKernelCommandLine=!snapd_recovery_mode=run
ConditionKernelCommandLine=!snapd_recovery_mode=install
Description=Mount initial filesystems
OnFailure=emergency.target
OnFailureJobMode=replace-irreversibly
Expand All @@ -7,6 +9,9 @@ DefaultDependencies=no
After=sysinit.target
Before=initrd-root-device.target

BindsTo=dev-ubuntu-disk.device
After=dev-ubuntu-disk.device

[Service]
Type=oneshot
RemainAfterExit=true
Expand Down
Loading