def create_template_from_volume(self, req): cmd = jsonobject.loads(req[http.REQUEST_BODY]) rsp = AgentRsp() volume_abs_path = translate_absolute_path_from_install_path( cmd.volumePath) install_abs_path = translate_absolute_path_from_install_path( cmd.installPath) if cmd.sharedVolume: lvm.do_active_lv(volume_abs_path, lvm.LvmlockdLockType.SHARE, True) with lvm.RecursiveOperateLv(volume_abs_path, shared=cmd.sharedVolume, skip_deactivate_tag=IMAGE_TAG): virtual_size = linux.qcow2_virtualsize(volume_abs_path) if not lvm.lv_exists(install_abs_path): lvm.create_lv_from_absolute_path( install_abs_path, virtual_size, "%s::%s::%s" % (VOLUME_TAG, cmd.hostUuid, time.time())) with lvm.OperateLv(install_abs_path, shared=False, delete_when_exception=True): linux.create_template(volume_abs_path, install_abs_path) logger.debug( 'successfully created template[%s] from volume[%s]' % (cmd.installPath, cmd.volumePath)) if cmd.compareQcow2 is True: logger.debug("comparing qcow2 between %s and %s") bash.bash_errorout("time qemu-img compare %s %s" % (volume_abs_path, install_abs_path)) logger.debug("confirmed qcow2 %s and %s are identical" % (volume_abs_path, install_abs_path)) rsp.totalCapacity, rsp.availableCapacity = lvm.get_vg_size(cmd.vgUuid) return jsonobject.dumps(rsp)
def offline_merge_snapshots(self, req): cmd = jsonobject.loads(req[http.REQUEST_BODY]) rsp = OfflineMergeSnapshotRsp() src_abs_path = translate_absolute_path_from_install_path(cmd.srcPath) dst_abs_path = translate_absolute_path_from_install_path(cmd.destPath) with lvm.RecursiveOperateLv(src_abs_path, shared=True): virtual_size = linux.qcow2_virtualsize(src_abs_path) if not lvm.lv_exists(dst_abs_path): lvm.create_lv_from_absolute_path(dst_abs_path, virtual_size, "%s::%s::%s" % (VOLUME_TAG, cmd.hostUuid, time.time())) with lvm.RecursiveOperateLv(dst_abs_path, shared=False): if not cmd.fullRebase: linux.qcow2_rebase(src_abs_path, dst_abs_path) else: tmp_lv = 'tmp_%s' % uuidhelper.uuid() tmp_abs_path = os.path.join(os.path.dirname(dst_abs_path), tmp_lv) tmp_abs_path = os.path.join(os.path.dirname(dst_abs_path), tmp_lv) logger.debug("creating temp lv %s" % tmp_abs_path) lvm.create_lv_from_absolute_path(tmp_abs_path, virtual_size, "%s::%s::%s" % (VOLUME_TAG, cmd.hostUuid, time.time())) with lvm.OperateLv(tmp_abs_path, shared=False, delete_when_exception=True): linux.create_template(dst_abs_path, tmp_abs_path) lvm.lv_rename(tmp_abs_path, dst_abs_path, overwrite=True) rsp.totalCapacity, rsp.availableCapacity = lvm.get_vg_size(cmd.vgUuid) return jsonobject.dumps(rsp)
def offline_merge_snapshots(self, req): cmd = jsonobject.loads(req[http.REQUEST_BODY]) rsp = OfflineMergeSnapshotRsp() src_abs_path = translate_absolute_path_from_install_path(cmd.srcPath) dst_abs_path = translate_absolute_path_from_install_path(cmd.destPath) with lvm.RecursiveOperateLv(src_abs_path, shared=True): virtual_size = linux.qcow2_virtualsize(src_abs_path) if not lvm.lv_exists(dst_abs_path): lvm.create_lv_from_absolute_path(dst_abs_path, virtual_size, "%s::%s::%s" % (VOLUME_TAG, cmd.hostUuid, time.time())) with lvm.RecursiveOperateLv(dst_abs_path, shared=False): if not cmd.fullRebase: linux.qcow2_rebase(src_abs_path, dst_abs_path) else: tmp_lv = 'tmp_%s' % uuidhelper.uuid() tmp_abs_path = os.path.join(os.path.dirname(dst_abs_path), tmp_lv) logger.debug("creating temp lv %s" % tmp_abs_path) lvm.create_lv_from_absolute_path(tmp_abs_path, virtual_size, "%s::%s::%s" % (VOLUME_TAG, cmd.hostUuid, time.time())) with lvm.OperateLv(tmp_abs_path, shared=False, delete_when_exception=True): linux.create_template(dst_abs_path, tmp_abs_path) lvm.lv_rename(tmp_abs_path, dst_abs_path, overwrite=True) rsp.totalCapacity, rsp.availableCapacity = lvm.get_vg_size(cmd.vgUuid) return jsonobject.dumps(rsp)
def rebase_and_merge_snapshot(self, req): cmd = jsonobject.loads(req[http.REQUEST_BODY]) snapshots = cmd.snapshotInstallPaths count = len(snapshots) for i in range(count): if i + 1 < count: target = snapshots[i] backing_file = snapshots[i + 1] linux.qcow2_rebase_no_check(backing_file, target) latest = snapshots[0] rsp = RebaseAndMergeSnapshotsResponse() workspace_dir = os.path.dirname(cmd.workspaceInstallPath) if not os.path.exists(workspace_dir): os.makedirs(workspace_dir) try: linux.create_template(latest, cmd.workspaceInstallPath) rsp.size, rsp.actualSize = cmd.workspaceInstallPath self._set_capacity_to_response(cmd.uuid, rsp) except linux.LinuxError as e: logger.warn(linux.get_exception_stacktrace()) rsp.error = str(e) rsp.success = False return jsonobject.dumps(rsp)
def rebase_and_merge_snapshot(self, req): cmd = jsonobject.loads(req[http.REQUEST_BODY]) snapshots = cmd.snapshotInstallPaths count = len(snapshots) for i in range(count): if i+1 < count: target = snapshots[i] backing_file = snapshots[i+1] linux.qcow2_rebase_no_check(backing_file, target) latest = snapshots[0] rsp = RebaseAndMergeSnapshotsResponse() workspace_dir = os.path.dirname(cmd.workspaceInstallPath) if not os.path.exists(workspace_dir): os.makedirs(workspace_dir) try: linux.create_template(latest, cmd.workspaceInstallPath) rsp.size, rsp.actualSize = cmd.workspaceInstallPath self._set_capacity_to_response(cmd.uuid, rsp) except linux.LinuxError as e: logger.warn(linux.get_exception_stacktrace()) rsp.error = str(e) rsp.success = False return jsonobject.dumps(rsp)
def create_template_from_volume(self, req): cmd = jsonobject.loads(req[http.REQUEST_BODY]) rsp = AgentRsp() volume_abs_path = translate_absolute_path_from_install_path(cmd.volumePath) install_abs_path = translate_absolute_path_from_install_path(cmd.installPath) if cmd.sharedVolume: lvm.do_active_lv(volume_abs_path, lvm.LvmlockdLockType.SHARE, True) with lvm.RecursiveOperateLv(volume_abs_path, shared=cmd.sharedVolume, skip_deactivate_tags=[IMAGE_TAG]): virtual_size = linux.qcow2_virtualsize(volume_abs_path) total_size = 0 for qcow2 in linux.qcow2_get_file_chain(volume_abs_path): total_size += int(lvm.get_lv_size(qcow2)) if total_size > virtual_size: total_size = virtual_size if not lvm.lv_exists(install_abs_path): lvm.create_lv_from_absolute_path(install_abs_path, total_size, "%s::%s::%s" % (VOLUME_TAG, cmd.hostUuid, time.time())) with lvm.OperateLv(install_abs_path, shared=False, delete_when_exception=True): linux.create_template(volume_abs_path, install_abs_path) logger.debug('successfully created template[%s] from volume[%s]' % (cmd.installPath, cmd.volumePath)) if cmd.compareQcow2 is True: logger.debug("comparing qcow2 between %s and %s") bash.bash_errorout("time qemu-img compare %s %s" % (volume_abs_path, install_abs_path)) logger.debug("confirmed qcow2 %s and %s are identical" % (volume_abs_path, install_abs_path)) rsp.totalCapacity, rsp.availableCapacity = lvm.get_vg_size(cmd.vgUuid) return jsonobject.dumps(rsp)
def create_template_from_volume(self, req): cmd = jsonobject.loads(req[http.REQUEST_BODY]) rsp = AgentRsp() dirname = os.path.dirname(cmd.installPath) if not os.path.exists(dirname): os.makedirs(dirname, 0755) linux.create_template(cmd.volumePath, cmd.installPath) logger.debug('successfully created template[%s] from volume[%s]' % (cmd.installPath, cmd.volumePath)) rsp.totalCapacity, rsp.availableCapacity = self._get_disk_capacity(cmd.mountPoint) return jsonobject.dumps(rsp)
def createtemplate(self, req): cmd = jsonobject.loads(req[http.REQUEST_BODY]) rsp = AliyunNasResponse() dirname = os.path.dirname(cmd.installPath) if not os.path.exists(dirname): os.makedirs(dirname, 0755) linux.create_template(cmd.volumePath, cmd.installPath) logger.debug('successfully created template[%s] from volume[%s]' % (cmd.installPath, cmd.volumePath)) rsp.totalCapacity, rsp.availableCapacity = self._get_disk_capacity(cmd.uuid) return jsonobject.dumps(rsp)
def offline_merge_snapshots(self, req): cmd = jsonobject.loads(req[http.REQUEST_BODY]) rsp = AgentRsp() if not cmd.fullRebase: linux.qcow2_rebase(cmd.srcPath, cmd.destPath) else: tmp = os.path.join(os.path.dirname(cmd.destPath), '%s.qcow2' % uuidhelper.uuid()) linux.create_template(cmd.destPath, tmp) shell.call("mv %s %s" % (tmp, cmd.destPath)) rsp.totalCapacity, rsp.availableCapacity = self._get_disk_capacity(cmd.mountPoint) return jsonobject.dumps(rsp)
def merge_snapshot_to_volume(self, req): cmd = jsonobject.loads(req[http.REQUEST_BODY]) rsp = OfflineMergeSnapshotRsp() if not cmd.fullRebase: linux.qcow2_rebase(cmd.srcPath, cmd.destPath) else: tmp = os.path.join(os.path.dirname(cmd.destPath), '%s.qcow2' % uuidhelper.uuid()) linux.create_template(cmd.destPath, tmp) shell.call("mv %s %s" % (tmp, cmd.destPath)) self._set_capacity_to_response(cmd.uuid, rsp) return jsonobject.dumps(rsp)
def offlinemerge(self, req): cmd = jsonobject.loads(req[http.REQUEST_BODY]) rsp = AliyunNasResponse() if not cmd.fullRebase: linux.qcow2_rebase(cmd.srcPath, cmd.destPath) else: tmp = os.path.join(os.path.dirname(cmd.destPath), '%s.qcow2' % uuidhelper.uuid()) linux.create_template(cmd.destPath, tmp) shell.call("mv %s %s" % (tmp, cmd.destPath)) rsp.totalCapacity, rsp.availableCapacity = self._get_disk_capacity(cmd.uuid) return jsonobject.dumps(rsp)
def merge_snapshot(self, req): cmd = jsonobject.loads(req[http.REQUEST_BODY]) rsp = MergeSnapshotRsp() workspace_dir = os.path.dirname(cmd.workspaceInstallPath) if not os.path.exists(workspace_dir): os.makedirs(workspace_dir) linux.create_template(cmd.snapshotInstallPath, cmd.workspaceInstallPath) rsp.size, rsp.actualSize = linux.qcow2_size_and_actual_size(cmd.workspaceInstallPath) rsp.totalCapacity, rsp.availableCapacity = self._get_disk_capacity(cmd.mountPoint) return jsonobject.dumps(rsp)
def mergesnapshot(self, req): cmd = jsonobject.loads(req[http.REQUEST_BODY]) rsp = MergeSnapshotRsp() workspace_dir = os.path.dirname(cmd.workspaceInstallPath) if not os.path.exists(workspace_dir): os.makedirs(workspace_dir) linux.create_template(cmd.snapshotInstallPath, cmd.workspaceInstallPath) rsp.size, rsp.actualSize = linux.qcow2_size_and_actual_size(cmd.workspaceInstallPath) rsp.totalCapacity, rsp.availableCapacity = self._get_disk_capacity(cmd.uuid) return jsonobject.dumps(rsp)
def create_template_from_root_volume(self, req): cmd = jsonobject.loads(req[http.REQUEST_BODY]) rsp = CreateTemplateFromRootVolumeRsp() try: dirname = os.path.dirname(cmd.installPath) if not os.path.exists(dirname): os.makedirs(dirname, 0755) linux.create_template(cmd.rootVolumePath, cmd.installPath) except linux.LinuxError as e: logger.warn(linux.get_exception_stacktrace()) rsp.error = 'unable to create image to root@%s:%s from root volume[%s], %s' % (cmd.sftpBackupStorageHostName, cmd.installPath, cmd.rootVolumePath, str(e)) rsp.success = False self._set_capacity_to_response(cmd.uuid, rsp) logger.debug('successfully created template[%s] from root volume[%s]' % (cmd.installPath, cmd.rootVolumePath)) return jsonobject.dumps(rsp)
def merge_snapshot(self, req): cmd = jsonobject.loads(req[http.REQUEST_BODY]) rsp = MergeSnapshotResponse() workspace_dir = os.path.dirname(cmd.workspaceInstallPath) if not os.path.exists(workspace_dir): os.makedirs(workspace_dir) try: linux.create_template(cmd.snapshotInstallPath, cmd.workspaceInstallPath) rsp.size, rsp.actualSize = linux.qcow2_size_and_actual_size(cmd.workspaceInstallPath) self._set_capacity_to_response(cmd.uuid, rsp) except linux.LinuxError as e: logger.warn(linux.get_exception_stacktrace()) rsp.error = str(e) rsp.success = False return jsonobject.dumps(rsp)
def merge_snapshot(self, req): cmd = jsonobject.loads(req[http.REQUEST_BODY]) rsp = MergeSnapshotRsp() snapshot_abs_path = translate_absolute_path_from_install_path(cmd.snapshotInstallPath) workspace_abs_path = translate_absolute_path_from_install_path(cmd.workspaceInstallPath) with lvm.RecursiveOperateLv(snapshot_abs_path, shared=True): virtual_size = linux.qcow2_virtualsize(snapshot_abs_path) if not lvm.lv_exists(workspace_abs_path): lvm.create_lv_from_absolute_path(workspace_abs_path, virtual_size, "%s::%s::%s" % (VOLUME_TAG, cmd.hostUuid, time.time())) with lvm.OperateLv(workspace_abs_path, shared=False, delete_when_exception=True): linux.create_template(snapshot_abs_path, workspace_abs_path) rsp.size, rsp.actualSize = linux.qcow2_size_and_actual_size(workspace_abs_path) rsp.totalCapacity, rsp.availableCapacity = lvm.get_vg_size(cmd.vgUuid) rsp.actualSize = rsp.size return jsonobject.dumps(rsp)
def create_template_from_volume(self, req): cmd = jsonobject.loads(req[http.REQUEST_BODY]) rsp = AgentResponse() dirname = os.path.dirname(cmd.installPath) if not os.path.exists(dirname): os.makedirs(dirname, 0755) @rollback.rollbackable def _0(): linux.rm_file_force(cmd.insallPath) _0() t_shell = traceable_shell.get_shell(cmd) linux.create_template(cmd.volumePath, cmd.installPath, shell=t_shell) logger.debug('successfully created template[%s] from volume[%s]' % (cmd.installPath, cmd.volumePath)) rsp.totalCapacity, rsp.availableCapacity = self._get_disk_capacity( cmd.storagePath) return jsonobject.dumps(rsp)
def offline_merge_snapshots(self, req): cmd = jsonobject.loads(req[http.REQUEST_BODY]) rsp = OfflineMergeSnapshotRsp() src_abs_path = translate_absolute_path_from_install_path(cmd.srcPath) dst_abs_path = translate_absolute_path_from_install_path(cmd.destPath) with lvm.RecursiveOperateLv(src_abs_path, shared=True): virtual_size = linux.qcow2_virtualsize(src_abs_path) if not lvm.lv_exists(dst_abs_path): lvm.create_lv_from_absolute_path( dst_abs_path, virtual_size, "%s::%s::%s" % (VOLUME_TAG, cmd.hostUuid, time.time())) with lvm.RecursiveOperateLv(dst_abs_path, shared=False): if not cmd.fullRebase: linux.qcow2_rebase(src_abs_path, dst_abs_path) else: # TODO(weiw): add tmp disk and then rename is better linux.create_template(src_abs_path, dst_abs_path) rsp.totalCapacity, rsp.availableCapacity = lvm.get_vg_size(cmd.vgUuid) return jsonobject.dumps(rsp)
def merge_and_rebase_snapshot(self, req): cmd = jsonobject.loads(req[http.REQUEST_BODY]) snapshots = cmd.snapshotInstallPaths count = len(snapshots) for i in range(count): if i+1 < count: target = snapshots[i] backing_file = snapshots[i+1] linux.qcow2_rebase_no_check(backing_file, target) latest = snapshots[0] rsp = RebaseAndMergeSnapshotsRsp() workspace_dir = os.path.dirname(cmd.workspaceInstallPath) if not os.path.exists(workspace_dir): os.makedirs(workspace_dir) linux.create_template(latest, cmd.workspaceInstallPath) rsp.size, rsp.actualSize = linux.qcow2_size_and_actual_size(cmd.workspaceInstallPath) rsp.totalCapacity, rsp.availableCapacity = self._get_disk_capacity(cmd.storagePath) return jsonobject.dumps(rsp)
def create_template_from_volume(self, req): cmd = jsonobject.loads(req[http.REQUEST_BODY]) rsp = AgentRsp() volume_abs_path = translate_absolute_path_from_install_path( cmd.volumePath) install_abs_path = translate_absolute_path_from_install_path( cmd.installPath) with lvm.RecursiveOperateLv(volume_abs_path, shared=False): virtual_size = linux.qcow2_virtualsize(volume_abs_path) if not lvm.lv_exists(install_abs_path): lvm.create_lv_from_absolute_path( install_abs_path, virtual_size, "%s::%s::%s" % (VOLUME_TAG, cmd.hostUuid, time.time())) with lvm.OperateLv(install_abs_path, shared=False, delete_when_exception=True): linux.create_template(volume_abs_path, install_abs_path) logger.debug('successfully created template[%s] from volume[%s]' % (cmd.installPath, cmd.volumePath)) rsp.totalCapacity, rsp.availableCapacity = lvm.get_vg_size(cmd.vgUuid) return jsonobject.dumps(rsp)
def merge_and_rebase_snapshot(self, req): cmd = jsonobject.loads(req[http.REQUEST_BODY]) snapshots = cmd.snapshotInstallPaths count = len(snapshots) for i in range(count): if i + 1 < count: target = snapshots[i] backing_file = snapshots[i + 1] linux.qcow2_rebase_no_check(backing_file, target) latest = snapshots[0] rsp = RebaseAndMergeSnapshotsRsp() workspace_dir = os.path.dirname(cmd.workspaceInstallPath) if not os.path.exists(workspace_dir): os.makedirs(workspace_dir) linux.create_template(latest, cmd.workspaceInstallPath) rsp.size, rsp.actualSize = linux.qcow2_size_and_actual_size( cmd.workspaceInstallPath) rsp.totalCapacity, rsp.availableCapacity = self._get_disk_capacity( cmd.storagePath) return jsonobject.dumps(rsp)