Tags: patch
Hi,
I've wrote a patch to implement this feature and am attaching it.
I haven't find any fault through test deployment,
but would you please review this closely?
I wish this helps.
>From decf70c5a4dd9731525db9e668c1ff611d9fe720 Mon Sep 17 00:00:00 2001
From: Katsuhiko Nishimra
Date: Thu, 9 Jul 2015 04:01:00 +0900
Subject: [PATCH] Btrfs chroot model class
---
debian/control | 2 +-
debian/mini-buildd-sudoers | 3 +++
mini_buildd/models/__init__.py | 1 +
mini_buildd/models/chroot.py | 46 +-
mini_buildd/templates/admin/index.html | 1 +
5 files changed, 51 insertions(+), 2 deletions(-)
diff --git a/debian/control b/debian/control
index dd3a997..5c57ca6 100644
--- a/debian/control
+++ b/debian/control
@@ -71,7 +71,7 @@ Depends: ${misc:Depends},
devscripts (>= 2.14.5~),
lintian
Recommends: python-apt
-Suggests: haveged, lvm2, qemu-user-static, binfmt-support
+Suggests: haveged, lvm2, qemu-user-static, binfmt-support, btrfs-tools
Breaks: mini-buildd-rep (<< 1.0.0~),
mini-buildd-bld (<< 1.0.0~)
Replaces: mini-buildd-rep,
diff --git a/debian/mini-buildd-sudoers b/debian/mini-buildd-sudoers
index 89d8ab2..4f337ab 100644
--- a/debian/mini-buildd-sudoers
+++ b/debian/mini-buildd-sudoers
@@ -14,3 +14,6 @@ mini-buildd ALL=NOPASSWD:/sbin/pvcreate,/sbin/pvremove,/sbin/vgcreate,/sbin/vgre
# LOOP: LoopLVMChroot
mini-buildd ALL=NOPASSWD:/sbin/losetup,/bin/dd
+
+# BTRFS: BtrfsSnapshotChroot
+mini-buildd ALL=NOPASSWD:/sbin/btrfs
diff --git a/mini_buildd/models/__init__.py b/mini_buildd/models/__init__.py
index bf17d26..0a4c7c5 100644
--- a/mini_buildd/models/__init__.py
+++ b/mini_buildd/models/__init__.py
@@ -39,6 +39,7 @@ def import_all():
chroot.FileChroot,
chroot.LVMChroot,
chroot.LoopLVMChroot,
+chroot.BtrfsSnapshotChroot,
daemon.Daemon,
subscription.Subscription]
diff --git a/mini_buildd/models/chroot.py b/mini_buildd/models/chroot.py
index 55f3de4..6807a37 100644
--- a/mini_buildd/models/chroot.py
+++ b/mini_buildd/models/chroot.py
@@ -114,7 +114,7 @@ chroots (with qemu-user-static installed).
f=self.mbd_get_backend().mbd_backend_flavor())
def mbd_get_backend(self):
-for cls, sub in {"filechroot": [], "dirchroot": [], "lvmchroot": ["looplvmchroot"]}.items():
+for cls, sub in {"filechroot": [], "dirchroot": [], "lvmchroot": ["looplvmchroot"], "btrfssnapshotchroot": []}.items():
if hasattr(self, cls):
c = getattr(self, cls)
for s in sub:
@@ -494,3 +494,47 @@ class LoopLVMChroot(LVMChroot):
(["/sbin/vgcreate", "--verbose", self.mbd_get_volume_group(), loop_device],
["/sbin/vgremove", "--verbose", "--force", self.mbd_get_volume_group()])] + super(LoopLVMChroot, self).mbd_get_pre_sequence()
+
+
+class BtrfsSnapshotChroot(Chroot):
+""" Btrfs Snapshot chroot backend. """
+class Meta(Chroot.Meta):
+pass
+
+class Admin(Chroot.Admin):
+fieldsets = Chroot.Admin.fieldsets # TODO: quota settings
+
+@classmethod
+def mbd_meta_add_base_sources(cls, msglog):
+cls._mbd_meta_add_base_sources(BtrfsSnapshotChroot, msglog)
+
+def mbd_backend_flavor(self):
+return "btrfs_snapshot"
+
+def mbd_get_chroot_dir(self):
+return os.path.join(self.mbd_get_path(), "source")
+
+def mbd_get_snapshot_dir(self):
+return os.path.join(self.mbd_get_path(), "snapshot")
+
+def mbd_get_schroot_conf(self):
+return """\
+type=btrfs-snapshot
+btrfs-source-subvolume={source}
+btrfs-snapshot-directory={snapshot}
+""".format(source=self.mbd_get_chroot_dir(),
+snapshot=self.mbd_get_snapshot_dir())
+
+def mbd_get_pre_sequence(self):
+return [
+(["/sbin/btrfs", "subvolume", "create", self.mbd_get_chroot_dir()],
+ ["/sbin/btrfs", "subvolume", "delete", self.mbd_get_chroot_dir()]),
+
+(["/bin/mount", "-v", "-o", "bind", self.mbd_get_chroot_dir(), self.mbd_get_tmp_dir()],
+ ["/bin/umount", "-v", "-o", "bind", self.mbd_get_tmp_dir()]),
+
+(["/bin/mkdir", "--verbose", self.mbd_get_snapshot_dir()],
+ ["/bin/rm", "--recursive", "--one-file-system", "--force", self.mbd_get_snapshot_dir()])]
+
+def mbd_get_post_sequence(self):
+return [(["/bin/umount", "-v", self.mbd_get_tmp_dir()], [])]
diff --git a/mini_buildd/templates/admin/index.html b/mini_buildd/templates/admin/index.html
index f04ccae..6b00754 100644
--- a/mini_buildd/templates/admin/index.html
+++ b/mini_buildd/templates/admin/index.html
@@ -44,6 +44,7 @@
{% include "admin/snippet_index_table_row.html" with model_name="File chroots" model_path="chroot.FileChroot" wiz0_function="add_base_sources" wiz0_name="Defaults" wiz0_title="Add default chroots for all active base