Skip to content

Commit

Permalink
btrfs: show snapshots of a subvolume in the subvolume details page
Browse files Browse the repository at this point in the history
Register crossrefs for snapshots so they show under snapshots in the
detail page of a subvolume.
  • Loading branch information
jelly committed Jun 3, 2024
1 parent d2d5e73 commit 866349f
Show file tree
Hide file tree
Showing 2 changed files with 57 additions and 2 deletions.
26 changes: 24 additions & 2 deletions pkg/storaged/btrfs/subvolume.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -20,11 +20,12 @@
import cockpit from "cockpit";
import React from "react";

import { CardBody } from "@patternfly/react-core/dist/esm/components/Card/index.js";
import { Card, CardBody, CardHeader, CardTitle } from "@patternfly/react-core/dist/esm/components/Card/index.js";
import { DescriptionList } from "@patternfly/react-core/dist/esm/components/DescriptionList/index.js";

import {
StorageCard, StorageDescription, ChildrenTable, new_card, new_page, navigate_away_from_card
PageTable, StorageCard, StorageDescription, ChildrenTable,
new_card, new_page, navigate_away_from_card, register_crossref, get_crossrefs,
} from "../pages.jsx";
import { StorageUsageBar } from "../storage-controls.jsx";
import {
Expand Down Expand Up @@ -395,6 +396,14 @@ function make_btrfs_subvolume_page(parent, volume, subvol, path_prefix, subvols)
props: { subvol, mount_point, mismount_warning, block, fstab_config, forced_options },
actions,
});

if (subvol.id !== 5 && subvol.parent_uuid !== null)
register_crossref({
key: subvol.parent_uuid,
card,
size: mounted && <StorageUsageBar stats={use} short />,
});

const page = new_page(parent, card);
for (const sv of subvols) {
if (sv.parent && (sv.parent === subvol.id || sv.parent === subvol.fake_id)) {
Expand All @@ -404,6 +413,7 @@ function make_btrfs_subvolume_page(parent, volume, subvol, path_prefix, subvols)
}

const BtrfsSubvolumeCard = ({ card, subvol, mismount_warning, block, fstab_config, forced_options }) => {
const crossrefs = get_crossrefs(subvol.uuid);
return (
<StorageCard card={card} alert={mismount_warning &&
<MismountAlert warning={mismount_warning}
Expand All @@ -425,5 +435,17 @@ const BtrfsSubvolumeCard = ({ card, subvol, mismount_warning, block, fstab_confi
aria-label={_("btrfs subvolumes")}
page={card.page} />
</CardBody>
{crossrefs &&
<Card data-test-card-title="Snapshots">
<CardHeader>
<CardTitle component="h2">{_("Snapshots")}</CardTitle>
</CardHeader>
<CardBody className="contains-list">
<PageTable emptyCaption={_("No snapshots found")}
aria-label={_("snapshot")}
crossrefs={crossrefs} />
</CardBody>
</Card>
}
</StorageCard>);
};
33 changes: 33 additions & 0 deletions test/verify/check-storage-btrfs
Original file line number Diff line number Diff line change
Expand Up @@ -592,6 +592,39 @@ class TestStorageBtrfs(storagelib.StorageCase):
b.wait_text(self.card_row_col("btrfs filesystem", row_name="home", col_index=3), "/mnt/home (not mounted)")
b.wait_text(self.card_row_col("btrfs filesystem", row_name="backups", col_index=3), "/mnt/backups (not mounted)")

def testSnapshot(self):
m = self.machine
b = self.browser

disk = self.add_ram_disk(size=128)
mount_point = "/run/butter"

snapshot_dir = f"{mount_point}/snapshots"
subdir = f"{mount_point}/subdir"

m.execute(f"""
mkfs.btrfs -L butter {disk}
mkdir -p {mount_point}
mount {disk} {mount_point}
echo '{disk} {mount_point} auto defaults 0 0' >> /etc/fstab
# Debian-testing/ubuntu-2204 btrfs-progrs version does not support creating multiple subvolumes at once
btrfs subvolume create {subdir}
btrfs subvolume create {snapshot_dir}
btrfs subvolume create {subdir}/foo
btrfs subvolume snapshot {subdir} {snapshot_dir}/snap-1
btrfs subvolume snapshot {mount_point} {snapshot_dir}/snap-2
""")

self.login_and_go("/storage")

self.click_card_row("Storage", name=os.path.basename(subdir))
b.wait_text(self.card_desc("btrfs subvolume", "Name"), "subdir")
b.wait_visible(self.card_row("Snapshots", name="snap-1"))

# Normal subvolume does not show under snapshots
b.wait_visible(self.card_row("btrfs subvolume", name="foo"))
b.wait_not_present(self.card_row("Snapshots", name="foo"))


if __name__ == '__main__':
testlib.test_main()

0 comments on commit 866349f

Please sign in to comment.