def _clone(self, id, name, clonefrom):
domain = self.connection.lookupByUUIDString(id)
domainconfig = domain.XMLDesc()
name = '%s_%s.qcow2' % (name, time.time())
destination_path = os.path.join(self.templatepath, name)
if domain.state()[0] in [
libvirt.VIR_DOMAIN_SHUTDOWN,
libvirt.VIR_DOMAIN_SHUTOFF,
libvirt.VIR_DOMAIN_CRASHED,
libvirt.VIR_DOMAIN_PAUSED] or not self._isRootVolume(
domain,
clonefrom):
if not self.isLocked(id):
lock = self._lockDomain(id)
if lock != LOCKCREATED:
raise Exception('Failed to create lock: %s' % str(lock))
else:
raise Exception("Can't perform this action on a locked domain")
q2 = Qcow2(clonefrom)
try:
q2.export(destination_path)
finally:
if self.isLocked(id):
self._unlockDomain(id)
else:
domain.undefine()
try:
domain.blockRebase(clonefrom, destination_path,
0, libvirt.VIR_DOMAIN_BLOCK_REBASE_COPY)
rebasedone = False
while not rebasedone:
rebasedone = self._block_job_info(domain, clonefrom)
domain.blockJobAbort(clonefrom, 0)
except BaseException:
self.connection.defineXML(domainconfig)
raise
self.connection.defineXML(domainconfig)
return destination_path
评论列表
文章目录