Bug#673443: Please add option to use btrfs snapshots instead of LVM snapshots [patch]

2016-02-10 Thread Stephan Sürken
Hi Katsuhiko,

On Mi, 2015-12-16 at 00:18 -1000, Katsuhiko Nishimra wrote:
> 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?

just a short heads up: Thanks for the patch -- it looked fine to me on a
short glance, and I will eventually test and include it.

However, as this will change the SQL scheme, this should go to the 1.2.x
development tree -- not sure when exactly I find time to actually kick
this off ;).

Thanks!

S



Bug#673443: Please add option to use btrfs snapshots instead of LVM snapshots [patch]

2015-12-16 Thread Katsuhiko Nishimra
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