Skip to content

Commit

Permalink
Rebase the qcow2 when starting the VM if needed
Browse files Browse the repository at this point in the history
Ref #466
  • Loading branch information
julien-duponchelle committed Apr 5, 2016
1 parent 7422b31 commit 57394df
Show file tree
Hide file tree
Showing 3 changed files with 11 additions and 3 deletions.
2 changes: 1 addition & 1 deletion gns3server/modules/qemu/qcow2.py
Expand Up @@ -64,7 +64,7 @@ def _reload(self):

self.magic, self.version, self.backing_file_offset, self.backing_file_size = struct.unpack_from(struct_format, content)

if self.magic != 1363560955: # The first 4 bytes contain the characters 'Q', 'F', 'I' followed by 0xfb.
if self.magic != 1363560955: # The first 4 bytes contain the characters 'Q', 'F', 'I' followed by 0xfb.
raise Qcow2Error("Invalid magic for {}".format(self.path))

@property
Expand Down
9 changes: 9 additions & 0 deletions gns3server/modules/qemu/qemu_vm.py
Expand Up @@ -40,6 +40,7 @@
from ...schemas.qemu import QEMU_OBJECT_SCHEMA, QEMU_PLATFORMS
from ...utils.asyncio import monitor_process
from ...utils.images import md5sum
from .qcow2 import Qcow2, Qcow2Error

import logging
log = logging.getLogger(__name__)
Expand Down Expand Up @@ -1261,6 +1262,14 @@ def _disk_options(self):
log.info("{} returned with {}".format(qemu_img_path, retcode))
except (OSError, subprocess.SubprocessError) as e:
raise QemuError("Could not create {} disk image {}".format(disk_name, e))
else:
# The disk exists we check if the clone work
try:
qcow2 = Qcow2(disk)
yield from qcow2.rebase(qemu_img_path, disk_image)
except (Qcow2Error, OSError) as e:
raise QemuError("Could not use qcow2 disk image {} for {} {}".format(disk_image, disk_name, e))

else:
disk = disk_image
options.extend(["-drive", 'file={},if={},index={},media=disk'.format(disk, interface, disk_index)])
Expand Down
3 changes: 1 addition & 2 deletions tests/modules/qemu/test_qcow2.py
Expand Up @@ -20,7 +20,7 @@
import shutil
import asyncio

from gns3server.modules.qemu.qcow2 import Qcow2,Qcow2Error
from gns3server.modules.qemu.qcow2 import Qcow2, Qcow2Error


def qemu_img():
Expand Down Expand Up @@ -65,4 +65,3 @@ def test_rebase(tmpdir, loop):
assert qcow2.backing_file == "empty8G.qcow2"
loop.run_until_complete(asyncio.async(qcow2.rebase(qemu_img(), str(tmpdir / "empty16G.qcow2"))))
assert qcow2.backing_file == str(tmpdir / "empty16G.qcow2")

0 comments on commit 57394df

Please sign in to comment.