def _run(self): self.log.info("Merging subchain %s", self.subchain) with guarded.context(self.subchain.locks): self.subchain.validate() with self.subchain.prepare(), self.subchain.volume_operation(): self.operation = qemuimg.commit( self.subchain.top_vol.getVolumePath(), topFormat=sc.fmt2str(self.subchain.top_vol.getFormat()), base=self.subchain.base_vol.getVolumePath()) with utils.closing(self.operation): self.operation.wait_for_completion()
def test_commit_progress(self): with namedTemporaryDir() as tmpdir: size = 1048576 base = os.path.join(tmpdir, "base.img") make_image(base, size, qemuimg.FORMAT.RAW, 0, "1.1") top = os.path.join(tmpdir, "top.img") make_image(top, size, qemuimg.FORMAT.QCOW2, 1, "1.1", base) op = qemuimg.commit(top, topFormat=qemuimg.FORMAT.QCOW2) op.wait_for_completion() self.assertEquals(100, op.progress)
def test_commit_progress(self): with namedTemporaryDir() as tmpdir: size = 1048576 base = os.path.join(tmpdir, "base.img") make_image(base, size, qemuimg.FORMAT.RAW, 0, "1.1") top = os.path.join(tmpdir, "top.img") make_image(top, size, qemuimg.FORMAT.QCOW2, 1, "1.1", base) op = qemuimg.commit(top, topFormat=qemuimg.FORMAT.QCOW2) with utils.closing(op): op.wait_for_completion() self.assertEqual(100, op.progress)
def _run(self): self.log.info("Merging subchain %s", self.subchain) with guarded.context(self.subchain.locks): self.subchain.validate() # Base volume must be ILLEGAL. Otherwise, VM could be run while # performing cold merge. base_legality = self.subchain.base_vol.getLegality() if base_legality == sc.LEGAL_VOL: raise se.UnexpectedVolumeState(self.subchain.base_id, sc.ILLEGAL_VOL, base_legality) with self.subchain.prepare(), self.subchain.volume_operation(): self.operation = qemuimg.commit( self.subchain.top_vol.getVolumePath(), topFormat=sc.fmt2str(self.subchain.top_vol.getFormat()), base=self.subchain.base_vol.getVolumePath()) with utils.closing(self.operation): self.operation.wait_for_completion()
def test_commit(self, qcow2_compat, base, top, use_base): size = 1048576 with namedTemporaryDir() as tmpdir: chain = [] parent = None # Create a chain of 4 volumes. for i in range(4): vol = os.path.join(tmpdir, "vol%d.img" % i) format = (qemuimg.FORMAT.RAW if i == 0 else qemuimg.FORMAT.QCOW2) make_image(vol, size, format, i, qcow2_compat, parent) orig_offset = qemuimg.check(vol)["offset"] if i > 0 else None chain.append((vol, orig_offset)) parent = vol base_vol = chain[base][0] top_vol = chain[top][0] op = qemuimg.commit(top_vol, topFormat=qemuimg.FORMAT.QCOW2, base=base_vol if use_base else None) with utils.closing(op): op.wait_for_completion() base_fmt = (qemuimg.FORMAT.RAW if base == 0 else qemuimg.FORMAT.QCOW2) for i in range(base, top + 1): offset = i * 1024 pattern = 0xf0 + i # The base volume must have the data from all the volumes # merged into it. qemu_pattern_verify(base_vol, base_fmt, offset=offset, len=1024, pattern=pattern) if i > base: # internal and top volumes should keep the data, we # may want to wipe this data when deleting the volumes # later. vol, orig_offset = chain[i] actual_offset = qemuimg.check(vol)["offset"] self.assertEqual(actual_offset, orig_offset)
def test_commit(self, qcow2_compat, base, top, use_base): size = 1048576 with namedTemporaryDir() as tmpdir: chain = [] parent = None # Create a chain of 4 volumes. for i in range(4): vol = os.path.join(tmpdir, "vol%d.img" % i) format = (qemuimg.FORMAT.RAW if i == 0 else qemuimg.FORMAT.QCOW2) make_image(vol, size, format, i, qcow2_compat, parent) blocks = os.stat(vol).st_blocks chain.append((vol, blocks)) parent = vol base_vol = chain[base][0] top_vol = chain[top][0] op = qemuimg.commit(top_vol, topFormat=qemuimg.FORMAT.QCOW2, base=base_vol if use_base else None) with utils.closing(op): op.wait_for_completion() for i in range(base, top + 1): offset = i * 1024 pattern = 0xf0 + i # The base volume must have the data from all the volumes # merged into it. format = (qemuimg.FORMAT.RAW if i == 0 else qemuimg.FORMAT.QCOW2) qemu_pattern_verify(base_vol, format, offset=offset, len=1024, pattern=pattern) if i > base: # internal and top volumes should keep the data, we # may want to wipe this data when deleting the volumes # later. vol, blocks = chain[i] self.assertEqual(os.stat(vol).st_blocks, blocks)