def reinstall_os(self, vps_id, _xv=None, os_id=None, vps_image=None): meta_path = self._meta_path(vps_id, is_trash=False) xv = None if os.path.exists(meta_path): xv = self._load_vps_meta(meta_path) if os_id: xv.os_id = os_id elif _xv: xv.os_id = _xv.os_id self._update_vif_setting(xv, _xv) else: raise Exception("missing os_id") elif _xv: xv = _xv if os_id: xv.os_id = os_id raise Exception("missing vps metadata") _vps_image, os_type, os_version = os_image.find_os_image(xv.os_id) if not vps_image: vps_image = _vps_image if not vps_image: raise Exception( "no template image configured for os_type=%s, os_id=%s" % (os_type, xv.os_id)) if not os.path.exists(vps_image): raise Exception("image %s not exists" % (vps_image)) # fs_type is tied to the image fs_type = vps_common.get_fs_from_tarball_name(vps_image) if not fs_type: fs_type = conf.DEFAULT_FS_TYPE assert xv.has_all_attr if xv.stop(): self.loginfo(xv, "stopped") else: xv.destroy() self.loginfo(xv, "force destroy") time.sleep(3) root_store_trash, root_store = xv.renew_storage( xv.root_store.xen_dev, 5) xv.root_store.create(fs_type) self.loginfo(xv, "create new root") # we have to know fs_type for fstab generation for xen_dev, disk in xv.data_disks.iteritems(): if xen_dev == xv.root_store.xen_dev: continue if disk.exists(): pass else: disk.create(fs_type) vps_mountpoint_bak = root_store_trash.mount_trash_temp() try: vps_mountpoint = xv.root_store.mount_tmp() self.loginfo(xv, "mounted vps image %s" % (str(xv.root_store))) try: xv.root_store.destroy_limit() if re.match(r'.*\.img$', vps_image): vps_common.sync_img(vps_mountpoint, vps_image) else: vps_common.unpack_tarball(vps_mountpoint, vps_image) self.loginfo(xv, "synced vps os to %s" % (str(xv.root_store))) for sync_dir in ['home', 'root']: dir_org = os.path.join(vps_mountpoint_bak, sync_dir) dir_now = os.path.join(vps_mountpoint, sync_dir) if os.path.exists(dir_org): call_cmd("rsync -a --exclude='.bash*' '%s/' '%s/'" % (dir_org, dir_now)) self.loginfo(xv, "sync dir /%s to new os" % (sync_dir)) self.loginfo(xv, "begin to init os") if _xv: xv.root_pw = _xv.root_pw os_init.os_init(xv, vps_mountpoint, os_type, os_version, is_new=True, to_init_passwd=True, to_init_fstab=True) else: # if no user data provided from backend os_init.os_init(xv, vps_mountpoint, os_type, os_version, is_new=True, to_init_passwd=False, to_init_fstab=True,) os_init.migrate_users( xv, vps_mountpoint, vps_mountpoint_bak) self.loginfo(xv, "done init os") xv.root_store.create_limit() finally: vps_common.umount_tmp(vps_mountpoint) finally: vps_common.umount_tmp(vps_mountpoint_bak) self.create_xen_config(xv) self._boot_and_test(xv, is_new=False) self.loginfo(xv, "done vps reinstall")
def reinstall_os(self, vps_id, _xv=None, os_id=None, vps_image=None): meta_path = self._meta_path(vps_id, is_trash=False) xv = None if os.path.exists(meta_path): xv = self._load_vps_meta(meta_path) if os_id: xv.os_id = os_id elif _xv: xv.os_id = _xv.os_id self._update_vif_setting(xv, _xv) else: raise Exception("missing os_id") elif _xv: xv = _xv if os_id: xv.os_id = os_id raise Exception("missing vps metadata") _vps_image, os_type, os_version = os_image.find_os_image(xv.os_id) if not vps_image: vps_image = _vps_image if not vps_image: raise Exception( "no template image configured for os_type=%s, os_id=%s" % (os_type, xv.os_id)) if not os.path.exists(vps_image): raise Exception("image %s not exists" % (vps_image)) # fs_type is tied to the image fs_type = vps_common.get_fs_from_tarball_name(vps_image) if not fs_type: fs_type = conf.DEFAULT_FS_TYPE assert xv.has_all_attr if xv.stop(): self.loginfo(xv, "stopped") else: xv.destroy() self.loginfo(xv, "force destroy") time.sleep(3) root_store_trash, root_store = xv.renew_storage( xv.root_store.xen_dev, 5) xv.root_store.create(fs_type) self.loginfo(xv, "create new root") # we have to know fs_type for fstab generation for xen_dev, disk in xv.data_disks.iteritems(): if xen_dev == xv.root_store.xen_dev: continue if disk.exists(): pass else: disk.create(fs_type) vps_mountpoint_bak = root_store_trash.mount_trash_temp() try: vps_mountpoint = xv.root_store.mount_tmp() self.loginfo(xv, "mounted vps image %s" % (str(xv.root_store))) try: xv.root_store.destroy_limit() if re.match(r'.*\.img$', vps_image): vps_common.sync_img(vps_mountpoint, vps_image) else: vps_common.unpack_tarball(vps_mountpoint, vps_image) self.loginfo(xv, "synced vps os to %s" % (str(xv.root_store))) for sync_dir in ['home', 'root']: dir_org = os.path.join(vps_mountpoint_bak, sync_dir) dir_now = os.path.join(vps_mountpoint, sync_dir) if os.path.exists(dir_org): call_cmd("rsync -a --exclude='.bash*' '%s/' '%s/'" % (dir_org, dir_now)) self.loginfo(xv, "sync dir /%s to new os" % (sync_dir)) self.loginfo(xv, "begin to init os") if _xv: xv.root_pw = _xv.root_pw os_init.os_init(xv, vps_mountpoint, os_type, os_version, is_new=True, to_init_passwd=True, to_init_fstab=True) else: # if no user data provided from backend os_init.os_init( xv, vps_mountpoint, os_type, os_version, is_new=True, to_init_passwd=False, to_init_fstab=True, ) os_init.migrate_users(xv, vps_mountpoint, vps_mountpoint_bak) self.loginfo(xv, "done init os") xv.root_store.create_limit() finally: vps_common.umount_tmp(vps_mountpoint) finally: vps_common.umount_tmp(vps_mountpoint_bak) self.create_xen_config(xv) self._boot_and_test(xv, is_new=False) self.loginfo(xv, "done vps reinstall")
def reinstall_os (self, vps_id, _vps=None, os_id=None, vps_image=None): meta_path = self._meta_path (vps_id, is_trash=False) if os.path.exists (meta_path): vps = self._load_vps_meta (meta_path) if _vps: vps.os_id = _vps.os_id elif os_id: vps.os_id = os_id else: raise Exception ("missing os_id") elif _vps: vps = _vps else: raise Exception ("missing vps metadata") _vps_image, os_type, os_version = os_image.find_os_image (vps.os_id) if not vps_image: vps_image = _vps_image if not vps_image: raise Exception ("no template image configured for os_type=%s, os_id=%s" % (os_type, vps.os_id)) if not os.path.exists (vps_image): raise Exception ("image %s not exists" % (vps_image)) #fs_type is tied to the image fs_type = vps_common.get_fs_from_tarball_name (vps_image) if not fs_type: fs_type = conf.DEFAULT_FS_TYPE assert vps.has_all_attr if vps.stop (): self.loginfo (vps, "stopped") else: vps.destroy () self.loginfo (vps, "force destroy") root_store_trash = vps.root_store vps.renew_root_storage (5) vps.root_store.create (fs_type) self.loginfo (vps, "create new root") vps_mountpoint_bak = root_store_trash.mount_trash_temp () try: vps_mountpoint = vps.root_store.mount_tmp () self.loginfo (vps, "mounted vps image %s" % (str(vps.root_store))) try: if re.match (r'.*\.img$', vps_image): vps_common.sync_img (vps_mountpoint, vps_image) else: vps_common.unpack_tarball (vps_mountpoint, vps_image) self.loginfo (vps, "synced vps os to %s" % (str(vps.root_store))) for sync_dir in ['home', 'root']: dir_org = os.path.join (vps_mountpoint_bak, sync_dir) dir_now = os.path.join (vps_mountpoint, sync_dir) if os.path.exists (dir_org): call_cmd ("rsync -a --exclude='.bash*' '%s/' '%s/'" % (dir_org, dir_now)) self.loginfo (vps, "sync dir /%s to new os" % (sync_dir)) self.loginfo (vps, "begin to init os") os_init.os_init (vps, vps_mountpoint, os_type, os_version, to_init_passwd=False) os_init.migrate_users (vps, vps_mountpoint, vps_mountpoint_bak) self.loginfo (vps, "done init os") finally: vps_common.umount_tmp (vps_mountpoint) finally: vps_common.umount_tmp (vps_mountpoint_bak) self.save_vps_meta (vps) self._boot_and_test (vps, is_new=False) self.loginfo (vps, "done vps reinstall")
def reinstall_os(self, vps_id, _vps=None, os_id=None, vps_image=None): meta_path = self._meta_path(vps_id, is_trash=False) if os.path.exists(meta_path): vps = self._load_vps_meta(meta_path) if _vps: vps.os_id = _vps.os_id elif os_id: vps.os_id = os_id else: raise Exception("missing os_id") elif _vps: vps = _vps else: raise Exception("missing vps metadata") _vps_image, os_type, os_version = os_image.find_os_image(vps.os_id) if not vps_image: vps_image = _vps_image if not vps_image: raise Exception( "no template image configured for os_type=%s, os_id=%s" % (os_type, vps.os_id)) if not os.path.exists(vps_image): raise Exception("image %s not exists" % (vps_image)) #fs_type is tied to the image fs_type = vps_common.get_fs_from_tarball_name(vps_image) if not fs_type: fs_type = conf.DEFAULT_FS_TYPE assert vps.has_all_attr if vps.stop(): self.loginfo(vps, "stopped") else: vps.destroy() self.loginfo(vps, "force destroy") root_store_trash = vps.root_store vps.renew_root_storage(5) vps.root_store.create(fs_type) self.loginfo(vps, "create new root") vps_mountpoint_bak = root_store_trash.mount_trash_temp() try: vps_mountpoint = vps.root_store.mount_tmp() self.loginfo(vps, "mounted vps image %s" % (str(vps.root_store))) try: if re.match(r'.*\.img$', vps_image): vps_common.sync_img(vps_mountpoint, vps_image) else: vps_common.unpack_tarball(vps_mountpoint, vps_image) self.loginfo(vps, "synced vps os to %s" % (str(vps.root_store))) for sync_dir in ['home', 'root']: dir_org = os.path.join(vps_mountpoint_bak, sync_dir) dir_now = os.path.join(vps_mountpoint, sync_dir) if os.path.exists(dir_org): call_cmd("rsync -a --exclude='.bash*' '%s/' '%s/'" % (dir_org, dir_now)) self.loginfo(vps, "sync dir /%s to new os" % (sync_dir)) self.loginfo(vps, "begin to init os") os_init.os_init(vps, vps_mountpoint, os_type, os_version, to_init_passwd=False) os_init.migrate_users(vps, vps_mountpoint, vps_mountpoint_bak) self.loginfo(vps, "done init os") finally: vps_common.umount_tmp(vps_mountpoint) finally: vps_common.umount_tmp(vps_mountpoint_bak) self.save_vps_meta(vps) self._boot_and_test(vps, is_new=False) self.loginfo(vps, "done vps reinstall")