summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSam Thursfield <sam.thursfield@codethink.co.uk>2014-06-10 17:18:37 (GMT)
committerSam Thursfield <sam.thursfield@codethink.co.uk>2014-06-11 16:22:25 (GMT)
commit3e4edca024ae5ea0ff5516a7ae2402fae1108b83 (patch)
treedb9bc6f93753ea6270463bded05a0a704bbfa180
parent2ca28887442c733f2f7a39aa7a844b51643ecb29 (diff)
downloadmorph-3e4edca024ae5ea0ff5516a7ae2402fae1108b83.tar.gz
Check for presence of btrfs before trying to use it
If btrfs is not present in the kernel we end up with strange output like this: Error creating disk image2014-06-10 16:00:40 [devel-system-x86_64-generic][my-raw-disk-image][rawdisk.write]Failure to create disk image at /src/tmp/testdev.img ERROR: Command failed: mount -o loop /src/tmp/testdev.img /src/tmp/deployments/tmpQ7wXO1/tmp4lVDcu/tmpvHSzDE mount: mounting /dev/loop0 on /src/tmp/deployments/tmpQ7wXO1/tmp4lVDcu/tmpvHSzDE failed: Device or resource busy To avoid this confusing error, Morph should explicitly check first.
-rwxr-xr-xmorphlib/exts/kvm.check2
-rwxr-xr-xmorphlib/exts/openstack.check2
-rwxr-xr-xmorphlib/exts/rawdisk.check31
-rwxr-xr-xmorphlib/exts/virtualbox-ssh.check2
-rw-r--r--morphlib/writeexts.py13
5 files changed, 49 insertions, 1 deletions
diff --git a/morphlib/exts/kvm.check b/morphlib/exts/kvm.check
index 957d089..1bb4007 100755
--- a/morphlib/exts/kvm.check
+++ b/morphlib/exts/kvm.check
@@ -31,6 +31,8 @@ class KvmPlusSshCheckExtension(morphlib.writeexts.WriteExtension):
if len(args) != 1:
raise cliapp.AppException('Wrong number of command line args')
+ self.require_btrfs_in_deployment_host_kernel()
+
upgrade = self.get_environment_boolean('UPGRADE')
if upgrade:
raise cliapp.AppException(
diff --git a/morphlib/exts/openstack.check b/morphlib/exts/openstack.check
index a9a8fe1..b517301 100755
--- a/morphlib/exts/openstack.check
+++ b/morphlib/exts/openstack.check
@@ -26,6 +26,8 @@ class OpenStackCheckExtension(morphlib.writeexts.WriteExtension):
if len(args) != 1:
raise cliapp.AppException('Wrong number of command line args')
+ self.require_btrfs_in_deployment_host_kernel()
+
upgrade = self.get_environment_boolean('UPGRADE')
if upgrade:
raise cliapp.AppException(
diff --git a/morphlib/exts/rawdisk.check b/morphlib/exts/rawdisk.check
new file mode 100755
index 0000000..6a656ee
--- /dev/null
+++ b/morphlib/exts/rawdisk.check
@@ -0,0 +1,31 @@
+#!/usr/bin/python
+# Copyright (C) 2014 Codethink Limited
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+'''Preparatory checks for Morph 'rawdisk' write extension'''
+
+import cliapp
+
+import morphlib.writeexts
+
+
+class RawdiskCheckExtension(morphlib.writeexts.WriteExtension):
+ def process_args(self, args):
+ if len(args) != 1:
+ raise cliapp.AppException('Wrong number of command line args')
+
+ self.require_btrfs_in_deployment_host_kernel()
+
+RawdiskCheckExtension().run()
diff --git a/morphlib/exts/virtualbox-ssh.check b/morphlib/exts/virtualbox-ssh.check
index 1aeb899..57d54db 100755
--- a/morphlib/exts/virtualbox-ssh.check
+++ b/morphlib/exts/virtualbox-ssh.check
@@ -26,6 +26,8 @@ class VirtualBoxPlusSshCheckExtension(morphlib.writeexts.WriteExtension):
if len(args) != 1:
raise cliapp.AppException('Wrong number of command line args')
+ self.require_btrfs_in_deployment_host_kernel()
+
upgrade = self.get_environment_boolean('UPGRADE')
if upgrade:
raise cliapp.AppException(
diff --git a/morphlib/writeexts.py b/morphlib/writeexts.py
index d6f23e0..74587bd 100644
--- a/morphlib/writeexts.py
+++ b/morphlib/writeexts.py
@@ -104,7 +104,18 @@ class WriteExtension(cliapp.Application):
self.output.write('%s\n' % (kwargs['msg'] % kwargs))
self.output.flush()
-
+
+ def check_for_btrfs_in_deployment_host_kernel(self):
+ with open('/proc/filesystems') as f:
+ text = f.read()
+ return '\tbtrfs\n' in text
+
+ def require_btrfs_in_deployment_host_kernel(self):
+ if not self.check_for_btrfs_in_deployment_host_kernel():
+ raise cliapp.AppException(
+ 'Error: Btrfs is required for this deployment, but was not '
+ 'detected in the kernel of the machine that is running Morph.')
+
def create_local_system(self, temp_root, raw_disk):
'''Create a raw system image locally.'''
size = self.get_disk_size()