def get_fs_type(self): if self.exists(): self.fs_type = vps_common.get_fs_type(self.dev) return self.fs_type elif self.trash_exists(): self.fs_type = vps_common.get_fs_type(self.trash_dev) return self.fs_type elif self.fs_type: return self.fs_type else: raise Exception("not exist")
def sync_partition(self, dev, partition_name=None, speed=None, log_file=None): """ when you sync a snapshot lv to remote, you'll need to specify partition_name """ arr = dev.split("/") if arr[0] == "" and arr[1] == 'dev' and len(arr) == 4: mount_point, size_g, _partition_name = self._load_lvm(dev) else: mount_point, size_g, _partition_name = self._load_image(dev) if not partition_name: partition_name = _partition_name try: fs_type = vps_common.get_fs_type(dev) self.connect(timeout=size_g / 2 + 12) remote_mount_point = self.rpc.call( "alloc_partition", partition_name, size_g, fs_type) self.logger.info("remote(%s) mounted" % (remote_mount_point)) ret, err = self.rsync(mount_point, remote_mount_point, speed=speed, log_file=log_file) if ret == 0: print "rsync ok" self.logger.info("rsync %s to %s ok" % (dev, self.server_ip)) else: print "rsync failed", err self.logger.info("rsync %s to %s error, ret=%s, err=%s" % (dev, self.server_ip, ret, err)) raise Exception('rsync failed') time.sleep(3) self.rpc.call("umount", remote_mount_point, _retry=1) # possible after a long time socket is closed by server print "remote umounted %s" % (partition_name) self.logger.info("remote(%s) umounted" % (remote_mount_point)) finally: # probably not work when keyboard cancel vps_common.umount_tmp(mount_point) self.close()
def sync_partition(self, dev, partition_name=None, speed=None, log_file=None): """ when you sync a snapshot lv to remote, you'll need to specify partition_name """ arr = dev.split("/") if arr[0] == "" and arr[1] == 'dev' and len(arr) == 4: mount_point, size_g, _partition_name = self._load_lvm(dev) else: mount_point, size_g, _partition_name = self._load_image(dev) if not partition_name: partition_name = _partition_name try: fs_type = vps_common.get_fs_type(dev) self.connect(timeout=size_g / 2 + 12) remote_mount_point = self.rpc.call("alloc_partition", partition_name, size_g, fs_type) self.logger.info("remote(%s) mounted" % (remote_mount_point)) ret, err = self.rsync(mount_point, remote_mount_point, speed=speed, log_file=log_file) if ret == 0: print "rsync ok" self.logger.info("rsync %s to %s ok" % (dev, self.server_ip)) else: print "rsync failed", err self.logger.info("rsync %s to %s error, ret=%s, err=%s" % (dev, self.server_ip, ret, err)) raise Exception('rsync failed') time.sleep(3) self.rpc.call( "umount", remote_mount_point, _retry=1 ) # possible after a long time socket is closed by server print "remote umounted %s" % (partition_name) self.logger.info("remote(%s) umounted" % (remote_mount_point)) finally: # probably not work when keyboard cancel vps_common.umount_tmp(mount_point) self.close()
def pack_vps_fs_tarball(img_path, tarball_dir_or_path, is_image=False): """ if tarball_dir_or_path is a directory, will generate filename like XXX_fs_FSTYPE.tar.gz """ tarball_dir = None tarball_path = None if os.path.isdir(tarball_dir_or_path): tarball_dir = tarball_dir_or_path else: if os.path.exists(tarball_dir_or_path): raise Exception("file %s exists" % (tarball_dir_or_path)) tarball_path = tarball_dir_or_path tarball_dir = os.path.dirname(tarball_path) if not os.path.isdir(tarball_dir): raise Exception("directory %s not exists" % (tarball_dir)) if not tarball_path and tarball_dir: fs_type = vps_common.get_fs_type(img_path) tarball_name = "%s_fs_%s.tar.gz" % ( os.path.basename(img_path), fs_type) tarball_path = os.path.join(tarball_dir, tarball_name) if os.path.exists(tarball_path): raise Exception("file %s already exists" % (tarball_path)) if img_path.find("/dev") == 0: mount_point = vps_common.mount_partition_tmp( img_path, readonly=not is_image) else: mount_point = vps_common.mount_loop_tmp( img_path, readonly=not is_image) if is_image: clean_up_img(mount_point) cwd = os.getcwd() os.chdir(mount_point) try: call_cmd("tar zcf %s ." % (tarball_path)) finally: os.chdir(cwd) vps_common.umount_tmp(mount_point) return tarball_path