mirror of
https://github.com/koverstreet/bcachefs-tools.git
synced 2025-03-31 00:00:03 +03:00
Merge 0e0be9baa6
into 86cbeaf1c2
This commit is contained in:
commit
926917e659
1
.github/workflows/nix-flake.yml
vendored
1
.github/workflows/nix-flake.yml
vendored
@ -19,4 +19,3 @@ jobs:
|
|||||||
authToken: '${{ secrets.CACHIX_AUTH_TOKEN }}'
|
authToken: '${{ secrets.CACHIX_AUTH_TOKEN }}'
|
||||||
- run: nix flake show
|
- run: nix flake show
|
||||||
- run: nix flake check --print-build-logs
|
- run: nix flake check --print-build-logs
|
||||||
- run: nix build --print-build-logs
|
|
||||||
|
14
README.md
14
README.md
@ -30,6 +30,20 @@ Build and install
|
|||||||
|
|
||||||
Refer to [INSTALL.md](./INSTALL.md)
|
Refer to [INSTALL.md](./INSTALL.md)
|
||||||
|
|
||||||
|
Testing
|
||||||
|
-------
|
||||||
|
|
||||||
|
Besides manual testing, which is also encouraged, there are also a number of
|
||||||
|
checks defined that are used for CI (e.g. github actions).
|
||||||
|
|
||||||
|
These checks can be listed using `nix flake show`. You can, for example, test
|
||||||
|
the current state of the repo or test every patch before publishing them.
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ nix flake check
|
||||||
|
$ git rev-list origin/master.. | xargs -I{} nix flake check "git+file://$(pwd)?rev={}"
|
||||||
|
```
|
||||||
|
|
||||||
Bug reports and contributions
|
Bug reports and contributions
|
||||||
-----------------------------
|
-----------------------------
|
||||||
|
|
||||||
|
72
checks/README.md
Normal file
72
checks/README.md
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
# NixOS tests
|
||||||
|
|
||||||
|
Any `*.sh` file in this directory will be run in a NixOS VM for basic
|
||||||
|
functionality testing as part of CI. To list all outputs, including the checks,
|
||||||
|
you can use this command:
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ nix flake show
|
||||||
|
```
|
||||||
|
|
||||||
|
You can also run these tests locally by running `nix flake check`. To run one
|
||||||
|
specific test you can use `nix build` like this:
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ nix build ".#checks.x86_64-linux.subvolume"
|
||||||
|
```
|
||||||
|
|
||||||
|
With the flag `-L`/`--print-build-logs` outputs are shown fully as checks are
|
||||||
|
executing. Additionally, if the specific check has already been run locally, you
|
||||||
|
can view the log for the check or force another run with the following:
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ nix log .#checks.x86_64-linux.subvolume
|
||||||
|
$ nix build --rebuild .#checks.x86_64-linux.subvolume
|
||||||
|
```
|
||||||
|
|
||||||
|
If you need any more packages inside of the VM for a test, you can add them to
|
||||||
|
`environment.systemPackages` in `default.nix`. If you're unsure about the
|
||||||
|
package you need, [NixOS package search] may be able to help.
|
||||||
|
|
||||||
|
For more information about the NixOS testing library see the
|
||||||
|
[testing wiki article].
|
||||||
|
|
||||||
|
## Kernel version inside VM
|
||||||
|
|
||||||
|
By default `linuxPackages_latest` from nixpkgs is used in the testing VM. This
|
||||||
|
is the latest stable kernel version available in the nixpkgs revision. Updating
|
||||||
|
the nixpkgs flake input may update the used kernel. A custom-built kernel can be
|
||||||
|
used as well but with added build times in CI.
|
||||||
|
|
||||||
|
## Adding new tests
|
||||||
|
|
||||||
|
The easiest way to add new tests is of course to copy an existing test and adapt
|
||||||
|
it accordingly. Importantly, for nix to see a file as part of the sources, the
|
||||||
|
file needs to be in the git index. It doesn't have to be committed to the repo
|
||||||
|
just yet but you need to `git add` it. If `git ls-files` lists the file, nix
|
||||||
|
will also see it.
|
||||||
|
|
||||||
|
## Interactive debugging of tests
|
||||||
|
|
||||||
|
When writing a new test or experiencing a difficult to understand test failure,
|
||||||
|
an interactive login can be very handy. This can be achieved by building the
|
||||||
|
`driverInteractive` attribute of the check, for example like this:
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ nix build .#checks.x86_64-linux.subvolume.driverInteractive
|
||||||
|
```
|
||||||
|
|
||||||
|
The `nix build` will create a symlink in your working directory called `result`
|
||||||
|
which leads to a script that launches the VM interactively:
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ ./result/bin/nixos-test-driver
|
||||||
|
```
|
||||||
|
|
||||||
|
There is more information about this in the NixOS manual under
|
||||||
|
[running tests interactively].
|
||||||
|
|
||||||
|
[Linux wiki article]: https://wiki.nixos.org/wiki/Linux_kernel
|
||||||
|
[NixOS package search]: https://search.nixos.org
|
||||||
|
[running tests interactively]: https://nixos.org/manual/nixos/stable/#sec-running-nixos-tests-interactively
|
||||||
|
[testing wiki article]: https://wiki.nixos.org/wiki/NixOS_Testing_library
|
52
checks/default.nix
Normal file
52
checks/default.nix
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
{ pkgs }:
|
||||||
|
let
|
||||||
|
inherit (builtins) baseNameOf readDir;
|
||||||
|
inherit (pkgs.lib)
|
||||||
|
filterAttrs
|
||||||
|
genAttrs
|
||||||
|
hasSuffix
|
||||||
|
mapAttrsToList
|
||||||
|
removeSuffix
|
||||||
|
;
|
||||||
|
|
||||||
|
scriptName = shFile: removeSuffix ".sh" (baseNameOf shFile);
|
||||||
|
|
||||||
|
scriptNames = mapAttrsToList (n: v: scriptName n) (
|
||||||
|
filterAttrs (n: v: v == "regular" && hasSuffix ".sh" n) (readDir ./.)
|
||||||
|
);
|
||||||
|
|
||||||
|
mkTest =
|
||||||
|
name:
|
||||||
|
pkgs.testers.runNixOSTest {
|
||||||
|
inherit name;
|
||||||
|
|
||||||
|
nodes.machine =
|
||||||
|
{ pkgs, ... }:
|
||||||
|
{
|
||||||
|
virtualisation.emptyDiskImages = [
|
||||||
|
4096
|
||||||
|
1024
|
||||||
|
];
|
||||||
|
boot.supportedFilesystems = [ "bcachefs" ];
|
||||||
|
boot.kernelPackages = pkgs.linuxPackages_latest;
|
||||||
|
|
||||||
|
# Add any packages you need inside test scripts here
|
||||||
|
environment.systemPackages = with pkgs; [
|
||||||
|
f3
|
||||||
|
genpass
|
||||||
|
keyutils
|
||||||
|
];
|
||||||
|
|
||||||
|
environment.variables = {
|
||||||
|
BCACHEFS_LOG = "trace";
|
||||||
|
RUST_BACKTRACE = "full";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
testScript = ''
|
||||||
|
machine.succeed("modprobe bcachefs")
|
||||||
|
machine.succeed("${./${name}.sh} 1>&2")
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
in
|
||||||
|
genAttrs scriptNames mkTest
|
45
checks/encrypted-multidev.sh
Executable file
45
checks/encrypted-multidev.sh
Executable file
@ -0,0 +1,45 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
set -euxo pipefail
|
||||||
|
|
||||||
|
blkdev="/dev/vdb"
|
||||||
|
blkdev2="/dev/vdc"
|
||||||
|
mnt=$(mktemp -d)
|
||||||
|
pw=$(genpass)
|
||||||
|
uuid=$(uuidgen)
|
||||||
|
|
||||||
|
# link user and session keyrings so that the key can be found by the kernel
|
||||||
|
keyctl link @u @s
|
||||||
|
|
||||||
|
sfdisk "$blkdev" <<EOF
|
||||||
|
label: gpt
|
||||||
|
type=linux, size=1G
|
||||||
|
type=linux, size=1G
|
||||||
|
type=linux
|
||||||
|
EOF
|
||||||
|
|
||||||
|
udevadm settle
|
||||||
|
|
||||||
|
echo "$pw" | bcachefs format \
|
||||||
|
--verbose \
|
||||||
|
--encrypted \
|
||||||
|
--replicas=2 \
|
||||||
|
--uuid "$uuid" \
|
||||||
|
--fs_label test-fs \
|
||||||
|
"${blkdev}"{1,2}
|
||||||
|
|
||||||
|
udevadm settle
|
||||||
|
|
||||||
|
echo "$pw" | bcachefs mount "UUID=$uuid" "$mnt"
|
||||||
|
|
||||||
|
bcachefs device add "$mnt" "${blkdev}3"
|
||||||
|
bcachefs device add "$mnt" "$blkdev2"
|
||||||
|
|
||||||
|
udevadm settle
|
||||||
|
|
||||||
|
blkid
|
||||||
|
|
||||||
|
keyctl search @u user "bcachefs:$uuid"
|
||||||
|
|
||||||
|
umount "$mnt"
|
||||||
|
|
||||||
|
bcachefs mount "UUID=$uuid" "$mnt"
|
55
checks/encrypted-unlock.sh
Executable file
55
checks/encrypted-unlock.sh
Executable file
@ -0,0 +1,55 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
set -euxo pipefail
|
||||||
|
|
||||||
|
blkdev="/dev/vdb"
|
||||||
|
mnt=$(mktemp -d)
|
||||||
|
pw=$(genpass)
|
||||||
|
uuid=$(uuidgen)
|
||||||
|
|
||||||
|
# link user and session keyrings so that the key can be found by the kernel
|
||||||
|
keyctl link @u @s
|
||||||
|
|
||||||
|
echo "$pw" | bcachefs format \
|
||||||
|
--verbose \
|
||||||
|
--encrypted \
|
||||||
|
--uuid "$uuid" \
|
||||||
|
--fs_label test-fs \
|
||||||
|
"$blkdev"
|
||||||
|
|
||||||
|
udevadm settle
|
||||||
|
|
||||||
|
bcachefs unlock -c "$blkdev"
|
||||||
|
|
||||||
|
echo "$pw" | bcachefs unlock "$blkdev"
|
||||||
|
key_id=$(keyctl search @u user "bcachefs:$uuid")
|
||||||
|
|
||||||
|
bcachefs mount "$blkdev" "$mnt"
|
||||||
|
umount "$mnt"
|
||||||
|
|
||||||
|
keyctl unlink "$key_id"
|
||||||
|
|
||||||
|
echo "$pw" | bcachefs unlock -k session "$blkdev"
|
||||||
|
key_id=$(keyctl search @s user "bcachefs:$uuid")
|
||||||
|
|
||||||
|
mount -t bcachefs "$blkdev" "$mnt"
|
||||||
|
umount "$mnt"
|
||||||
|
|
||||||
|
keyctl unlink "$key_id"
|
||||||
|
|
||||||
|
bcachefs mount -f <(echo "$pw") "$blkdev" "$mnt"
|
||||||
|
key_id=$(keyctl search @u user "bcachefs:$uuid")
|
||||||
|
umount "$mnt"
|
||||||
|
keyctl unlink "$key_id"
|
||||||
|
|
||||||
|
echo "$pw" | bcachefs mount -k stdin "$blkdev" "$mnt"
|
||||||
|
key_id=$(keyctl search @u user "bcachefs:$uuid")
|
||||||
|
umount "$mnt"
|
||||||
|
keyctl unlink "$key_id"
|
||||||
|
|
||||||
|
echo "$pw" | bcachefs mount "$blkdev" "$mnt"
|
||||||
|
key_id=$(keyctl search @u user "bcachefs:$uuid")
|
||||||
|
umount "$mnt"
|
||||||
|
bcachefs mount -k fail "$blkdev"
|
||||||
|
bcachefs mount -k wait "$blkdev" "$mnt"
|
||||||
|
umount "$mnt"
|
||||||
|
keyctl unlink "$key_id"
|
40
checks/nested.sh
Executable file
40
checks/nested.sh
Executable file
@ -0,0 +1,40 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
set -euxo pipefail
|
||||||
|
|
||||||
|
blkdev="/dev/vdb"
|
||||||
|
mnt1=$(mktemp -d)
|
||||||
|
mnt2=$(mktemp -d)
|
||||||
|
pw=$(genpass)
|
||||||
|
uuid=$(uuidgen)
|
||||||
|
|
||||||
|
# link user and session keyrings so that the key can be found by the kernel
|
||||||
|
keyctl link @u @s
|
||||||
|
|
||||||
|
echo "$pw" | bcachefs format \
|
||||||
|
--verbose \
|
||||||
|
--encrypted \
|
||||||
|
--uuid "$uuid" \
|
||||||
|
--fs_label test-fs \
|
||||||
|
"$blkdev"
|
||||||
|
|
||||||
|
udevadm settle
|
||||||
|
|
||||||
|
echo "$pw" | bcachefs mount "UUID=$uuid" "$mnt1"
|
||||||
|
|
||||||
|
fallocate --length 2G "$mnt1/fs.img"
|
||||||
|
|
||||||
|
bcachefs format \
|
||||||
|
--verbose \
|
||||||
|
"$mnt1/fs.img"
|
||||||
|
|
||||||
|
loopdev=$(losetup --find --show "$mnt1/fs.img")
|
||||||
|
|
||||||
|
udevadm settle
|
||||||
|
|
||||||
|
mount "$loopdev" "$mnt2"
|
||||||
|
|
||||||
|
f3write "$mnt1"
|
||||||
|
f3write "$mnt2"
|
||||||
|
|
||||||
|
f3read "$mnt1"
|
||||||
|
f3read "$mnt2"
|
19
checks/outputs.sh
Executable file
19
checks/outputs.sh
Executable file
@ -0,0 +1,19 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
set -euxo pipefail
|
||||||
|
|
||||||
|
blkdev="/dev/vdb"
|
||||||
|
mnt=$(mktemp -d)
|
||||||
|
uuid=$(uuidgen)
|
||||||
|
|
||||||
|
bcachefs format \
|
||||||
|
--verbose \
|
||||||
|
--uuid "$uuid" \
|
||||||
|
--fs_label test-fs \
|
||||||
|
"$blkdev"
|
||||||
|
|
||||||
|
udevadm settle
|
||||||
|
|
||||||
|
mount "$blkdev" "$mnt"
|
||||||
|
|
||||||
|
bcachefs show-super "$blkdev" | grep -i "external.*$uuid"
|
||||||
|
bcachefs fs usage "$mnt" | grep "$uuid"
|
35
checks/subvolume.sh
Executable file
35
checks/subvolume.sh
Executable file
@ -0,0 +1,35 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
set -euxo pipefail
|
||||||
|
|
||||||
|
blkdev="/dev/vdb"
|
||||||
|
mnt=$(mktemp -d)
|
||||||
|
uuid=$(uuidgen)
|
||||||
|
|
||||||
|
bcachefs format \
|
||||||
|
--verbose \
|
||||||
|
--uuid "$uuid" \
|
||||||
|
--fs_label test-fs \
|
||||||
|
"$blkdev"
|
||||||
|
|
||||||
|
udevadm settle
|
||||||
|
|
||||||
|
mount "$blkdev" "$mnt"
|
||||||
|
|
||||||
|
touch "$mnt/file1"
|
||||||
|
|
||||||
|
bcachefs subvolume create "$mnt/subvol1"
|
||||||
|
bcachefs subvolume delete "$mnt/subvol1"
|
||||||
|
|
||||||
|
(
|
||||||
|
cd "$mnt"
|
||||||
|
|
||||||
|
bcachefs subvolume create subvol1
|
||||||
|
bcachefs subvolume create subvol1/subvol1
|
||||||
|
bcachefs subvolume create subvol1/subvol2
|
||||||
|
touch subvol1/file1
|
||||||
|
|
||||||
|
rm subvol1/file1
|
||||||
|
bcachefs subvolume delete subvol1/subvol2
|
||||||
|
bcachefs subvolume delete subvol1/subvol1
|
||||||
|
bcachefs subvolume delete subvol1
|
||||||
|
)
|
63
flake.nix
63
flake.nix
@ -59,6 +59,7 @@
|
|||||||
}:
|
}:
|
||||||
let
|
let
|
||||||
inherit (builtins) readFile split;
|
inherit (builtins) readFile split;
|
||||||
|
inherit (lib) fileset;
|
||||||
inherit (lib.lists) findFirst;
|
inherit (lib.lists) findFirst;
|
||||||
inherit (lib.strings) hasPrefix removePrefix substring;
|
inherit (lib.strings) hasPrefix removePrefix substring;
|
||||||
|
|
||||||
@ -75,7 +76,17 @@
|
|||||||
|
|
||||||
commonArgs = {
|
commonArgs = {
|
||||||
inherit version;
|
inherit version;
|
||||||
src = self;
|
src = fileset.toSource {
|
||||||
|
root = ./.;
|
||||||
|
|
||||||
|
fileset = fileset.difference (fileset.gitTracked ./.) (
|
||||||
|
fileset.unions [
|
||||||
|
./checks
|
||||||
|
./doc
|
||||||
|
./tests
|
||||||
|
]
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
env = {
|
env = {
|
||||||
PKG_CONFIG_SYSTEMD_SYSTEMDSYSTEMUNITDIR = "${placeholder "out"}/lib/systemd/system";
|
PKG_CONFIG_SYSTEMD_SYSTEMDSYSTEMUNITDIR = "${placeholder "out"}/lib/systemd/system";
|
||||||
@ -150,31 +161,37 @@
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
checks.cargo-clippy = craneLib.cargoClippy (
|
checks =
|
||||||
commonArgs
|
let
|
||||||
// {
|
overlay = final: prev: { inherit (config.packages) bcachefs-tools; };
|
||||||
inherit cargoArtifacts;
|
|
||||||
cargoClippyExtraArgs = "--all-targets -- --deny warnings";
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
# we have to build our own `craneLib.cargoTest`
|
cargo-clippy = craneLib.cargoClippy (
|
||||||
checks.cargo-test = craneLib.mkCargoDerivation (
|
commonArgs
|
||||||
commonArgs
|
// {
|
||||||
// {
|
inherit cargoArtifacts;
|
||||||
inherit cargoArtifacts;
|
cargoClippyExtraArgs = "--all-targets -- --deny warnings";
|
||||||
doCheck = true;
|
}
|
||||||
|
);
|
||||||
|
|
||||||
enableParallelChecking = true;
|
# we have to build our own `craneLib.cargoTest`
|
||||||
|
cargo-test = craneLib.mkCargoDerivation (
|
||||||
|
commonArgs
|
||||||
|
// {
|
||||||
|
inherit cargoArtifacts;
|
||||||
|
doCheck = true;
|
||||||
|
|
||||||
pnameSuffix = "-test";
|
enableParallelChecking = true;
|
||||||
buildPhaseCargoCommand = "";
|
|
||||||
checkPhaseCargoCommand = ''
|
pnameSuffix = "-test";
|
||||||
make ''${enableParallelChecking:+-j''${NIX_BUILD_CORES}} $makeFlags libbcachefs.a
|
buildPhaseCargoCommand = "";
|
||||||
cargo test --profile release -- --nocapture
|
checkPhaseCargoCommand = ''
|
||||||
'';
|
make ''${enableParallelChecking:+-j''${NIX_BUILD_CORES}} $makeFlags libbcachefs.a
|
||||||
}
|
cargo test --profile release -- --nocapture
|
||||||
);
|
'';
|
||||||
|
}
|
||||||
|
);
|
||||||
|
in
|
||||||
|
(import ./checks { pkgs = pkgs.extend overlay; }) // { inherit cargo-clippy cargo-test; };
|
||||||
|
|
||||||
devShells.default = pkgs.mkShell {
|
devShells.default = pkgs.mkShell {
|
||||||
inputsFrom = [
|
inputsFrom = [
|
||||||
|
Loading…
Reference in New Issue
Block a user