diff options
author | Sam Thursfield <sam.thursfield@codethink.co.uk> | 2012-11-15 14:55:45 +0000 |
---|---|---|
committer | Sam Thursfield <sam.thursfield@codethink.co.uk> | 2012-11-15 16:57:36 +0000 |
commit | 5da1f9b9a94ef139729143aa2c1f649aa809b86b (patch) | |
tree | df297db013b94fc7e78524c9af739c93272aeb4e | |
parent | cc5913c56a2ae55eb6254e352592751e194b6cd9 (diff) | |
download | morph-5da1f9b9a94ef139729143aa2c1f649aa809b86b.tar.gz |
Cleanly handle out of disk space on target filesystem.
Includes new test.
-rw-r--r-- | morphlib/builder2.py | 8 | ||||
-rw-r--r-- | tests.as-root/target-disk-too-small.exit | 1 | ||||
-rwxr-xr-x | tests.as-root/target-disk-too-small.script | 51 | ||||
-rw-r--r-- | tests.as-root/target-disk-too-small.stderr | 1 |
4 files changed, 60 insertions, 1 deletions
diff --git a/morphlib/builder2.py b/morphlib/builder2.py index d8ed829a..674cbb17 100644 --- a/morphlib/builder2.py +++ b/morphlib/builder2.py @@ -15,6 +15,7 @@ import datetime +import errno import json import logging import os @@ -715,7 +716,12 @@ class DiskImageBuilder(SystemKindBuilder): # pragma: no cover error=True) self._unmount(mount_point) self._undo_device_mapping(image_name) - raise + if type(e) is IOError and e.errno==errno.ENOSPC: + raise cliapp.AppException( + 'Ran out of space on %s disk image. Please ' + 'increase the system\'s disk-size.' % rootfs_name) + else: + raise self._unmount(mount_point) self._undo_device_mapping(image_name) diff --git a/tests.as-root/target-disk-too-small.exit b/tests.as-root/target-disk-too-small.exit new file mode 100644 index 00000000..d00491fd --- /dev/null +++ b/tests.as-root/target-disk-too-small.exit @@ -0,0 +1 @@ +1 diff --git a/tests.as-root/target-disk-too-small.script b/tests.as-root/target-disk-too-small.script new file mode 100755 index 00000000..92a73a58 --- /dev/null +++ b/tests.as-root/target-disk-too-small.script @@ -0,0 +1,51 @@ +#!/bin/bash +# +# Copyright (C) 2011, 2012 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. + + +## Handle target disk image being too small for its contents. + +set -eu + +. "$SRCDIR/tests.as-root/lib" + +# Shrink linux-system to the minimum btrfs will allow. +cd "$DATADIR/morphs" +sed -e 's/"system-kind": "syslinux-disk"/"system-kind": "disk"/' \ + -e 's/"disk-size": "1G"/"disk-size": "512M"/' \ + -i linux-system.morph +git add linux-system.morph +git commit -q -m "Make linux-system as small as possible" + +# Grow hello-chunk to be absurdly large. +cd "$DATADIR/chunk-repo" +git checkout -q farrokh +cat <<'EOF' > hello.morph +{ + "name": "hello", + "kind": "chunk", + "build-system": "dummy", + "install-commands": [ + "dd if=/dev/zero of=\"$DESTDIR\"/huge-file seek=1048580 count=0" + ] +} +EOF +git add hello.morph +git commit -q -m "Make hello be very big" + +# Ignore stdout - Morph logs a timestamped error +"$SRCDIR/scripts/test-morph" build-morphology test:morphs master linux-system \ + > /dev/null diff --git a/tests.as-root/target-disk-too-small.stderr b/tests.as-root/target-disk-too-small.stderr new file mode 100644 index 00000000..487c72e2 --- /dev/null +++ b/tests.as-root/target-disk-too-small.stderr @@ -0,0 +1 @@ +ERROR: Ran out of space on linux-system-rootfs disk image. Please increase the system's disk-size. |