def process(self): (opts, args) = getopts() chkopts(opts) self.up_progress(10) kvc = KaresansuiVirtConnection() # #1 libvirt process try: # inactive_pool = kvc.list_inactive_storage_pool() inactive_pool = [] active_pool = kvc.list_active_storage_pool() pools = inactive_pool + active_pool pools.sort() export = [] for pool_name in pools: pool = kvc.search_kvn_storage_pools(pool_name) path = pool[0].get_info()["target"]["path"] if os.path.exists(path): for _afile in glob.glob("%s/*/info.dat" % (path,)): e_param = ExportConfigParam() e_param.load_xml_config(_afile) if e_param.get_uuid() != opts.uuid: continue e_name = e_param.get_domain() _dir = os.path.dirname(_afile) param = ConfigParam(e_name) path = "%s/%s.xml" % (_dir, e_name) if os.path.isfile(path) is False: raise KssCommandException("Export corrupt data.(file not found) - path=%s" % path) param.load_xml_config(path) if e_name != param.get_domain_name(): raise KssCommandException( "Export corrupt data.(The name does not match) - info=%s, xml=%s" % (e_name, param.get_name()) ) _dir = os.path.dirname(_afile) export.append({"dir": _dir, "pool": pool_name, "uuid": e_param.get_uuid(), "name": e_name}) if len(export) < 1: # refresh pool. conn = KaresansuiVirtConnection(readonly=False) try: conn.refresh_pools() finally: conn.close() raise KssCommandException("libvirt data did not exist. - uuid=%s" % opts.uuid) else: export = export[0] finally: kvc.close() self.up_progress(30) # #2 physical process if os.path.isdir(export["dir"]) is False: raise KssCommandException( _("Failed to delete export data. - %s") % (_("Export data directory not found. [%s]") % (export["dir"])) ) uuid = os.path.basename(export["dir"]) pool_dir = os.path.dirname(export["dir"]) if not is_uuid(export["uuid"]): raise KssCommandException( _("Failed to delete export data. - %s") % (_("'%s' is not valid export data directory.") % (export["dir"])) ) shutil.rmtree(export["dir"]) for _afile in glob.glob("%s*img" % (export["dir"])): os.remove(_afile) self.up_progress(30) # refresh pool. conn = KaresansuiVirtConnection(readonly=False) try: try: conn.refresh_pools() finally: conn.close() except: pass self.logger.info("Deleted export data. - uuid=%s" % (opts.uuid)) print >>sys.stdout, _("Deleted export data. - uuid=%s") % (opts.uuid) return True
def process(self): (opts, args) = getopts() chkopts(opts) self.up_progress(10) conn = KaresansuiVirtConnection(readonly=False) try: progresscb = None if opts.verbose: try: from karesansui.lib.progress import ProgressMeter progresscb = ProgressMeter(command_object=self) except: pass else: try: from karesansui.lib.progress import ProgressMeter progresscb = ProgressMeter(command_object=self,quiet=True) except: pass try: #inactive_pool = conn.list_inactive_storage_pool() inactive_pool = [] active_pool = conn.list_active_storage_pool() pools = inactive_pool + active_pool if not pools: raise KssCommandException("Storage pool does not exist, or has been stopped.") pools.sort() export = [] for pool_name in pools: pool = conn.search_kvn_storage_pools(pool_name) path = pool[0].get_info()["target"]["path"] if os.path.exists(path): for _afile in glob.glob("%s/*/info.dat" % (path,)): e_param = ExportConfigParam() e_param.load_xml_config(_afile) if e_param.get_uuid() != opts.exportuuid: continue export.append({"dir" : os.path.dirname(_afile), "uuid" : opts.exportuuid, }) if len(export) != 1: raise KssCommandException("There are differences in the export data and real data. - uuid=%s" % opts.exportuuid) else: export = export[0] if os.path.isdir(export["dir"]) is False: raise KssCommandException("There is no real data. - dir=%s" % export["dir"]) conn.import_guest(export["dir"], uuid=opts.destuuid, progresscb=progresscb) self.up_progress(40) self.logger.info('Import guest completed. - export=%s, dest=%s' % (opts.exportuuid, opts.destuuid)) print >>sys.stdout, _('Import guest completed. - export=%s, dest=%s' % (opts.exportuuid, opts.destuuid)) return True except KaresansuiVirtException, e: raise KssCommandException('Failed to import guest. - [%s]' \ % (''.join(str(e.args)))) finally: conn.close()
def _DELETE(self, *param, **params): host_id = self.chk_hostby1(param) if host_id is None: return web.notfound() # valid self.view.uuid = param[1] kvc = KaresansuiVirtConnection() try: # Storage Pool #inactive_pool = kvc.list_inactive_storage_pool() inactive_pool = [] active_pool = kvc.list_active_storage_pool() pools = inactive_pool + active_pool pools.sort() export = [] for pool_name in pools: pool = kvc.search_kvn_storage_pools(pool_name) path = pool[0].get_info()["target"]["path"] if os.path.exists(path): for _afile in glob.glob("%s/*/info.dat" % (path,)): e_param = ExportConfigParam() e_param.load_xml_config(_afile) if e_param.get_uuid() != self.view.uuid: continue e_name = e_param.get_domain() _dir = os.path.dirname(_afile) param = ConfigParam(e_name) path = "%s/%s.xml" % (_dir, e_name) if os.path.isfile(path) is False: self.logger.error('Export corrupt data.(file not found) - path=%s' % path) return web.internalerror() param.load_xml_config(path) if e_name != param.get_domain_name(): self.logger.error('Export corrupt data.(The name does not match) - info=%s, xml=%s' \ % (e_name, param.get_name())) return web.internalerror() _dir = os.path.dirname(_afile) export.append({"dir" : _dir, "pool" : pool_name, "uuid" : e_param.get_uuid(), "name" : e_name, }) if len(export) != 1: self.logger.info("Export does not exist. - uuid=%s" % self.view.uuid) return web.badrequest() finally: kvc.close() export = export[0] if os.path.exists(export['dir']) is False or os.path.isdir(export['dir']) is False: self.logger.error('Export data is not valid. [%s]' % export_dir) return web.badrequest('Export data is not valid.') host = findbyhost1(self.orm, host_id) options = {} options['uuid'] = export["uuid"] _cmd = dict2command("%s/%s" % (karesansui.config['application.bin.dir'], \ VIRT_COMMAND_DELETE_EXPORT_DATA), options) # Job Registration _jobgroup = JobGroup('Delete Export Data', karesansui.sheconf['env.uniqkey']) _jobgroup.jobs.append(Job('Delete Export Data', 0, _cmd)) _machine2jobgroup = m2j_new(machine=host, jobgroup_id=-1, uniq_key=karesansui.sheconf['env.uniqkey'], created_user=self.me, modified_user=self.me, ) save_job_collaboration(self.orm, self.pysilhouette.orm, _machine2jobgroup, _jobgroup, ) self.logger.debug('(Delete export data) Job group id==%s', _jobgroup.id) url = '%s/job/%s.part' % (web.ctx.home, _jobgroup.id) self.logger.debug('Returning Location: %s' % url) return web.accepted()
def _GET(self, *param, **params): host_id = self.chk_hostby1(param) if host_id is None: return web.notfound() # valid self.view.uuid = param[1] kvc = KaresansuiVirtConnection() try: # libvirt connection scope --> # Storage Pool #inactive_pool = kvc.list_inactive_storage_pool() inactive_pool = [] active_pool = kvc.list_active_storage_pool() pools = inactive_pool + active_pool pools.sort() export = [] for pool_name in pools: pool = kvc.search_kvn_storage_pools(pool_name) path = pool[0].get_info()["target"]["path"] if os.path.exists(path): for _afile in glob.glob("%s/*/info.dat" % (path,)): e_param = ExportConfigParam() e_param.load_xml_config(_afile) if e_param.get_uuid() != self.view.uuid: continue e_name = e_param.get_domain() _dir = os.path.dirname(_afile) param = ConfigParam(e_name) path = "%s/%s.xml" % (_dir, e_name) if os.path.isfile(path) is False: self.logger.error('Export corrupt data.(file not found) - path=%s' % path) return web.internalerror() param.load_xml_config(path) if e_name != param.get_domain_name(): self.logger.error('Export corrupt data.(The name does not match) - info=%s, xml=%s' \ % (e_name, param.get_name())) return web.internalerror() _dir = os.path.dirname(_afile) title = e_param.get_title() if title != "": title = re.sub("[\r\n]","",title) if title == "": title = _('untitled') created = e_param.get_created() if created != "": created_str = time.strftime("%Y/%m/%d %H:%M:%S", \ time.localtime(float(created))) else: created_str = _("N/A") export.append({"info" : {"dir" : _dir, "pool" : pool_name, "uuid" : e_param.get_uuid(), "name" : e_name, "created" : int(created), "created_str" : created_str, "title" : title, }, "xml" : {"on_reboot" : param.get_behavior('on_reboot'), "on_poweroff" : param.get_behavior('on_poweroff'), "on_crash" : param.get_behavior('on_crash'), "boot_dev" : param.get_boot_dev(), #"bootloader" : param.get_bootloader(), #"commandline" : param.get_commandline(), #"current_snapshot" : param.get_current_snapshot(), 'disk' : param.get_disk(), "domain_name" : param.get_domain_name(), "domain_type" : param.get_domain_type(), "features_acpi" : param.get_features_acpi(), "features_apic" : param.get_features_apic(), "features_pae" : param.get_features_pae(), #"initrd" : param.get_initrd(), "interface" : param.get_interface(), #"kernel" : param.get_kernel(), "max_memory" : param.get_max_memory(), 'max_vcpus' : param.get_max_vcpus(), "max_vcpus_limit" : param.get_max_vcpus_limit(), "memory" : param.get_memory(), "uuid" : param.get_uuid(), "vcpus" : param.get_vcpus(), "vcpus_limit" : param.get_vcpus_limit(), "vnc_autoport" : param.get_vnc_autoport(), "keymap" : param.get_vnc_keymap(), "vnc_listen" : param.get_vnc_listen(), "vnc_passwd" : param.get_vnc_passwd(), "vnc_port" : param.get_vnc_port(), }, "pool" : pool[0].get_info(), }) if len(export) != 1: self.logger.info("Export does not exist. - uuid=%s" % self.view.uuid) return web.badrequest() # .json if self.is_json() is True: self.view.export = json_dumps(export[0]) else: self.view.export = export return True finally: kvc.close()
def _DELETE(self, *param, **params): host_id = self.chk_hostby1(param) if host_id is None: return web.notfound() # valid self.view.uuid = param[1] kvc = KaresansuiVirtConnection() try: # Storage Pool #inactive_pool = kvc.list_inactive_storage_pool() inactive_pool = [] active_pool = kvc.list_active_storage_pool() pools = inactive_pool + active_pool pools.sort() export = [] for pool_name in pools: pool = kvc.search_kvn_storage_pools(pool_name) path = pool[0].get_info()["target"]["path"] if os.path.exists(path): for _afile in glob.glob("%s/*/info.dat" % (path, )): e_param = ExportConfigParam() e_param.load_xml_config(_afile) if e_param.get_uuid() != self.view.uuid: continue e_name = e_param.get_domain() _dir = os.path.dirname(_afile) param = ConfigParam(e_name) path = "%s/%s.xml" % (_dir, e_name) if os.path.isfile(path) is False: self.logger.error( 'Export corrupt data.(file not found) - path=%s' % path) return web.internalerror() param.load_xml_config(path) if e_name != param.get_domain_name(): self.logger.error('Export corrupt data.(The name does not match) - info=%s, xml=%s' \ % (e_name, param.get_name())) return web.internalerror() _dir = os.path.dirname(_afile) export.append({ "dir": _dir, "pool": pool_name, "uuid": e_param.get_uuid(), "name": e_name, }) if len(export) != 1: self.logger.info("Export does not exist. - uuid=%s" % self.view.uuid) return web.badrequest() finally: kvc.close() export = export[0] if os.path.exists(export['dir']) is False or os.path.isdir( export['dir']) is False: self.logger.error('Export data is not valid. [%s]' % export_dir) return web.badrequest('Export data is not valid.') host = findbyhost1(self.orm, host_id) options = {} options['uuid'] = export["uuid"] _cmd = dict2command("%s/%s" % (karesansui.config['application.bin.dir'], \ VIRT_COMMAND_DELETE_EXPORT_DATA), options) # Job Registration _jobgroup = JobGroup('Delete Export Data', karesansui.sheconf['env.uniqkey']) _jobgroup.jobs.append(Job('Delete Export Data', 0, _cmd)) _machine2jobgroup = m2j_new( machine=host, jobgroup_id=-1, uniq_key=karesansui.sheconf['env.uniqkey'], created_user=self.me, modified_user=self.me, ) save_job_collaboration( self.orm, self.pysilhouette.orm, _machine2jobgroup, _jobgroup, ) self.logger.debug('(Delete export data) Job group id==%s', _jobgroup.id) url = '%s/job/%s.part' % (web.ctx.home, _jobgroup.id) self.logger.debug('Returning Location: %s' % url) return web.accepted()
def _GET(self, *param, **params): host_id = self.chk_hostby1(param) if host_id is None: return web.notfound() # valid self.view.uuid = param[1] kvc = KaresansuiVirtConnection() try: # libvirt connection scope --> # Storage Pool #inactive_pool = kvc.list_inactive_storage_pool() inactive_pool = [] active_pool = kvc.list_active_storage_pool() pools = inactive_pool + active_pool pools.sort() export = [] for pool_name in pools: pool = kvc.search_kvn_storage_pools(pool_name) path = pool[0].get_info()["target"]["path"] if os.path.exists(path): for _afile in glob.glob("%s/*/info.dat" % (path, )): e_param = ExportConfigParam() e_param.load_xml_config(_afile) if e_param.get_uuid() != self.view.uuid: continue e_name = e_param.get_domain() _dir = os.path.dirname(_afile) param = ConfigParam(e_name) path = "%s/%s.xml" % (_dir, e_name) if os.path.isfile(path) is False: self.logger.error( 'Export corrupt data.(file not found) - path=%s' % path) return web.internalerror() param.load_xml_config(path) if e_name != param.get_domain_name(): self.logger.error('Export corrupt data.(The name does not match) - info=%s, xml=%s' \ % (e_name, param.get_name())) return web.internalerror() _dir = os.path.dirname(_afile) title = e_param.get_title() if title != "": title = re.sub("[\r\n]", "", title) if title == "": title = _('untitled') created = e_param.get_created() if created != "": created_str = time.strftime("%Y/%m/%d %H:%M:%S", \ time.localtime(float(created))) else: created_str = _("N/A") export.append({ "info": { "dir": _dir, "pool": pool_name, "uuid": e_param.get_uuid(), "name": e_name, "created": int(created), "created_str": created_str, "title": title, }, "xml": { "on_reboot": param.get_behavior('on_reboot'), "on_poweroff": param.get_behavior('on_poweroff'), "on_crash": param.get_behavior('on_crash'), "boot_dev": param.get_boot_dev(), #"bootloader" : param.get_bootloader(), #"commandline" : param.get_commandline(), #"current_snapshot" : param.get_current_snapshot(), 'disk': param.get_disk(), "domain_name": param.get_domain_name(), "domain_type": param.get_domain_type(), "features_acpi": param.get_features_acpi(), "features_apic": param.get_features_apic(), "features_pae": param.get_features_pae(), #"initrd" : param.get_initrd(), "interface": param.get_interface(), #"kernel" : param.get_kernel(), "max_memory": param.get_max_memory(), 'max_vcpus': param.get_max_vcpus(), "max_vcpus_limit": param.get_max_vcpus_limit(), "memory": param.get_memory(), "uuid": param.get_uuid(), "vcpus": param.get_vcpus(), "vcpus_limit": param.get_vcpus_limit(), "graphics_autoport": param.get_graphics_autoport(), "keymap": param.get_graphics_keymap(), "graphics_listen": param.get_graphics_listen(), "graphics_passwd": param.get_graphics_passwd(), "graphics_port": param.get_graphics_port(), }, "pool": pool[0].get_info(), }) if len(export) != 1: self.logger.info("Export does not exist. - uuid=%s" % self.view.uuid) return web.badrequest() # .json if self.is_json() is True: self.view.export = json_dumps(export[0]) else: self.view.export = export return True finally: kvc.close()
def _GET(self, *param, **params): host_id = self.chk_hostby1(param) if host_id is None: return web.notfound() model = findbyhost1(self.orm, host_id) uris = available_virt_uris() self.kvc = KaresansuiVirtConnection() try: # libvirt connection scope --> # Storage Pool #inactive_pool = self.kvc.list_inactive_storage_pool() inactive_pool = [] active_pool = self.kvc.list_active_storage_pool() pools = inactive_pool + active_pool pools.sort() if not pools: return web.badrequest('One can not start a storage pool.') # Output .input if self.is_mode_input() is True: self.view.pools = pools pools_info = {} pools_vols_info = {} pools_iscsi_blocks = {} already_vols = [] guests = [] guests += self.kvc.list_inactive_guest() guests += self.kvc.list_active_guest() for guest in guests: already_vol = self.kvc.get_storage_volume_bydomain(domain=guest, image_type=None, attr='path') if already_vol: already_vols += already_vol.keys() for pool in pools: pool_obj = self.kvc.search_kvn_storage_pools(pool)[0] if pool_obj.is_active() is True: pools_info[pool] = pool_obj.get_info() blocks = None if pools_info[pool]['type'] == 'iscsi': blocks = self.kvc.get_storage_volume_iscsi_block_bypool(pool) if blocks: pools_iscsi_blocks[pool] = [] vols_obj = pool_obj.search_kvn_storage_volumes(self.kvc) vols_info = {} for vol_obj in vols_obj: vol_name = vol_obj.get_storage_volume_name() vols_info[vol_name] = vol_obj.get_info() if blocks: if vol_name in blocks and vol_name not in already_vols: pools_iscsi_blocks[pool].append(vol_obj.get_info()) pools_vols_info[pool] = vols_info self.view.pools_info = pools_info self.view.pools_vols_info = pools_vols_info self.view.pools_iscsi_blocks = pools_iscsi_blocks bridge_prefix = { "XEN":"xenbr", "KVM":KVM_BRIDGE_PREFIX, } self.view.host_id = host_id self.view.DEFAULT_KEYMAP = DEFAULT_KEYMAP self.view.DISK_NON_QEMU_FORMAT = DISK_NON_QEMU_FORMAT self.view.DISK_QEMU_FORMAT = DISK_QEMU_FORMAT self.view.hypervisors = {} self.view.mac_address = {} self.view.keymaps = {} self.view.phydev = {} self.view.virnet = {} used_ports = {} for k,v in MACHINE_HYPERVISOR.iteritems(): if k in available_virt_mechs(): self.view.hypervisors[k] = v uri = uris[k] mem_info = self.kvc.get_mem_info() active_networks = self.kvc.list_active_network() used_graphics_ports = self.kvc.list_used_graphics_port() bus_types = self.kvc.bus_types self.view.bus_types = bus_types self.view.max_mem = mem_info['host_max_mem'] self.view.free_mem = mem_info['host_free_mem'] self.view.alloc_mem = mem_info['guest_alloc_mem'] self.view.mac_address[k] = generate_mac_address(k) self.view.keymaps[k] = eval("get_keymaps(%s_KEYMAP_DIR)" % k) # Physical device phydev = [] phydev_regex = re.compile(r"%s" % bridge_prefix[k]) for dev,dev_info in get_ifconfig_info().iteritems(): try: if phydev_regex.match(dev): phydev.append(dev) except: pass if len(phydev) == 0: phydev.append("%s0" % bridge_prefix[k]) phydev.sort() self.view.phydev[k] = phydev # Physical device # Virtual device self.view.virnet[k] = sorted(active_networks) used_ports[k] = used_graphics_ports exclude_ports = [] for k, _used_port in used_ports.iteritems(): exclude_ports = exclude_ports + _used_port exclude_ports = sorted(exclude_ports) exclude_ports = [p for p, q in zip(exclude_ports, exclude_ports[1:] + [None]) if p != q] self.view.graphics_port = next_number(GRAPHICS_PORT_MIN_NUMBER, PORT_MAX_NUMBER, exclude_ports) else: # .part models = findbyhost1guestall(self.orm, host_id) guests = [] if models: # Physical Guest Info self.view.hypervisors = {} for model in models: for k,v in MACHINE_HYPERVISOR.iteritems(): if k in available_virt_mechs(): self.view.hypervisors[k] = v uri = uris[k] if hasattr(self, "kvc") is not True: self.kvc = KaresansuiVirtConnection(uri) domname = self.kvc.uuid_to_domname(model.uniq_key) #if not domname: return web.conflict(web.ctx.path) _virt = self.kvc.search_kvg_guests(domname) if 0 < len(_virt): guests.append(MergeGuest(model, _virt[0])) else: guests.append(MergeGuest(model, None)) # Exported Guest Info exports = {} for pool_name in pools: files = [] pool = self.kvc.search_kvn_storage_pools(pool_name) path = pool[0].get_info()["target"]["path"] if os.path.exists(path): for _afile in glob.glob("%s/*/info.dat" % (path,)): param = ExportConfigParam() param.load_xml_config(_afile) _dir = os.path.dirname(_afile) uuid = param.get_uuid() name = param.get_domain() created = param.get_created() title = param.get_title() if title != "": title = re.sub("[\r\n]","",title) if title == "": title = _('untitled') if created != "": created_str = time.strftime("%Y/%m/%d %H:%M:%S", \ time.localtime(float(created))) else: created_str = _("N/A") files.append({"dir": _dir, "pool" : pool_name, #"b64dir" : base64_encode(_dir), "uuid" : uuid, "name" : name, "created" : int(created), "created_str" : created_str, "title" : title, "icon" : param.get_database()["icon"], }) exports[pool_name] = files # .json if self.is_json() is True: guests_json = [] for x in guests: guests_json.append(x.get_json(self.me.languages)) self.view.guests = json_dumps(guests_json) else: self.view.exports = exports self.view.guests = guests return True finally: #self.kvc.close() pass # libvirt connection scope --> Guest#_post()
def _POST(self, *param, **params): host_id = self.chk_hostby1(param) if host_id is None: return web.notfound() model = findbyhost1(self.orm, host_id) if not validates_guest_import(self): return web.badrequest(self.view.alert) uuid = self.input.uuid kvc = KaresansuiVirtConnection() try: # Storage Pool #inactive_pool = kvc.list_inactive_storage_pool() inactive_pool = [] active_pool = kvc.list_active_storage_pool() pools = inactive_pool + active_pool pools.sort() export = [] for pool_name in pools: pool = kvc.search_kvn_storage_pools(pool_name) path = pool[0].get_info()["target"]["path"] if os.path.exists(path): for _afile in glob.glob("%s/*/info.dat" % (path,)): e_param = ExportConfigParam() e_param.load_xml_config(_afile) if e_param.get_uuid() != uuid: continue e_name = e_param.get_domain() _dir = os.path.dirname(_afile) param = ConfigParam(e_name) path = "%s/%s.xml" % (_dir, e_name) if os.path.isfile(path) is False: self.logger.error('Export corrupt data.(file not found) - path=%s' % path) return web.internalerror() param.load_xml_config(path) if e_name != param.get_domain_name(): self.logger.error('Export corrupt data.(The name does not match) - info=%s, xml=%s' \ % (e_name, param.get_name())) return web.internalerror() _dir = os.path.dirname(_afile) title = e_param.get_title() if title != "": title = re.sub("[\r\n]","",title) if title == "": title = _('untitled') created = e_param.get_created() if created != "": created_str = time.strftime("%Y/%m/%d %H:%M:%S", \ time.localtime(float(created))) else: created_str = _("N/A") export.append({"info" : {"dir" : _dir, "pool" : pool_name, "uuid" : e_param.get_uuid(), "name" : e_param.get_domain(), "created" : int(created), "created_str" : created_str, "title" : title, "database" : {"name" : e_param.database["name"], "tags" : e_param.database["tags"], "attribute" : e_param.database["attribute"], "notebook" : {"title" : e_param.database["notebook"]["title"], "value" : e_param.database["notebook"]["value"], }, "uniq_key" : e_param.database["uniq_key"], "hypervisor" : e_param.database["hypervisor"], "icon" : e_param.database["icon"], }, }, "xml" : {"on_reboot" : param.get_behavior('on_reboot'), "on_poweroff" : param.get_behavior('on_poweroff'), "on_crash" : param.get_behavior('on_crash'), "boot_dev" : param.get_boot_dev(), #"bootloader" : param.get_bootloader(), #"commandline" : param.get_commandline(), #"current_snapshot" : param.get_current_snapshot(), 'disk' : param.get_disk(), "domain_name" : param.get_domain_name(), "domain_type" : param.get_domain_type(), "features_acpi" : param.get_features_acpi(), "features_apic" : param.get_features_apic(), "features_pae" : param.get_features_pae(), #"initrd" : param.get_initrd(), "interface" : param.get_interface(), #"kernel" : param.get_kernel(), "max_memory" : param.get_max_memory(), 'max_vcpus' : param.get_max_vcpus(), "max_vcpus_limit" : param.get_max_vcpus_limit(), "memory" : param.get_memory(), "uuid" : param.get_uuid(), "vcpus" : param.get_vcpus(), "vcpus_limit" : param.get_vcpus_limit(), "vnc_autoport" : param.get_vnc_autoport(), "keymap" : param.get_vnc_keymap(), "vnc_listen" : param.get_vnc_listen(), "vnc_passwd" : param.get_vnc_passwd(), "vnc_port" : param.get_vnc_port(), }, "pool" : pool[0].get_info(), }) if len(export) != 1: self.logger.info("Export does not exist. - uuid=%s" % self.view.uuid) return web.badrequest() else: export = export[0] finally: kvc.close() # Pool running? if export['pool']['is_active'] is False: return web.badrequest("The destination, the storage pool is not running.") dest_domname = export['xml']['domain_name'] dest_uniqkey = export['info']['database']['uniq_key'] # Same guest OS is already running. if m_findby1uniquekey(self.orm, dest_uniqkey) is not None: self.logger.info(_("guest '%s' already exists. (DB) - %s") % (dest_domname, dest_uniqkey)) return web.badrequest(_("guest '%s' already exists.") % dest_domname) dest_dir = "%s/%s" % (export['pool']['target']['path'], export['xml']['domain_name']) if os.path.exists(dest_dir) is True: self.logger.info(_("guest '%s' already exists. (FS) - %s") % (dest_domname, dest_dir)) return web.badrequest(_("guest '%s' already exists.") % dest_domname) # disk check try: src_disk = "%s/%s/images/%s.img" \ % (export["info"]["dir"], export["info"]["name"], export["info"]["name"]) if os.path.exists(src_disk): s_size = os.path.getsize(src_disk) / (1024 * 1024) # a unit 'MB' if chk_create_disk(export["info"]["dir"], s_size) is False: partition = get_partition_info(export["info"]["dir"], header=False) return web.badrequest( _("No space available to create disk image in '%s' partition.") \ % partition[5][0]) except: pass extra_uniq_key = string_from_uuid(generate_uuid()) options = {} options["exportuuid"] = export["info"]["uuid"] options["destuuid"] = extra_uniq_key options["quiet"] = None # Database Notebook try: _notebook = n_new( export["info"]["database"]["notebook"]["title"], export["info"]["database"]["notebook"]["value"], ) except: _notebook = None # Database Tag _tags = [] try: tag_array = comma_split(export["info"]["database"]["tags"]) tag_array = uniq_sort(tag_array) for x in tag_array: if t_count(self.orm, x) == 0: _tags.append(t_new(x)) else: _tags.append(t_name(self.orm, x)) except: _tags.append(t_new("")) parent = m_findby1(self.orm, host_id) dest_guest = m_new(created_user=self.me, modified_user=self.me, uniq_key=extra_uniq_key, name=export["info"]["database"]["name"], attribute=int(export["info"]["database"]["attribute"]), hypervisor=int(export["info"]["database"]["hypervisor"]), notebook=_notebook, tags=_tags, icon=export["info"]["database"]["icon"], is_deleted=False, parent=parent, ) ret = regist_guest(self, _guest=dest_guest, icon_filename=export["info"]["database"]["icon"], cmd=VIRT_COMMAND_IMPORT_GUEST, options=options, cmdname=['Import Guest', 'Import Guest'], rollback_options={"name" : export["xml"]["domain_name"]}, is_create=False ) if ret is True: return web.accepted() else: return False
def _GET(self, *param, **params): host_id = self.chk_hostby1(param) if host_id is None: return web.notfound() kvc = KaresansuiVirtConnection() try: # Storage Pool #inactive_pool = kvc.list_inactive_storage_pool() inactive_pool = [] active_pool = kvc.list_active_storage_pool() pools = inactive_pool + active_pool pools.sort() if self.is_mode_input() is True: # (*.input) if not validates_sid(self): return web.badrequest(self.view.alert) sid = self.input.sid model = findbyguest1(self.orm, sid) if not model: return web.badrequest() domname = kvc.uuid_to_domname(model.uniq_key) src_pools = kvc.get_storage_pool_name_bydomain(domname) if not src_pools: return web.badrequest( _("Source storage pool is not found.")) for src_pool in src_pools: src_pool_type = kvc.get_storage_pool_type(src_pool) if src_pool_type != 'dir': return web.badrequest( _("'%s' disk contains the image.") % src_pool_type) virt = kvc.search_kvg_guests(domname)[0] if virt.is_active() is True: return web.badrequest( _("Guest is running. Please stop and try again. name=%s" % domname)) self.view.domname = virt.get_domain_name() non_iscsi_pool = [] for pool in pools: if kvc.get_storage_pool_type(pool) != 'iscsi': non_iscsi_pool.append(pool) self.view.pools = non_iscsi_pool self.view.sid = sid return True # Exported Guest Info (*.json) exports = {} for pool_name in pools: files = [] pool = kvc.search_kvn_storage_pools(pool_name) path = pool[0].get_info()["target"]["path"] if os.path.exists(path): for _afile in glob.glob("%s/*/info.dat" % (path, )): param = ExportConfigParam() param.load_xml_config(_afile) _dir = os.path.dirname(_afile) uuid = param.get_uuid() name = param.get_domain() created = param.get_created() title = param.get_title() if title != "": title = re.sub("[\r\n]", "", title) if title == "": title = _('untitled') if created != "": created_str = time.strftime("%Y/%m/%d %H:%M:%S", \ time.localtime(float(created))) else: created_str = _("N/A") files.append({ "dir": _dir, "pool": pool_name, #"b64dir" : base64_encode(_dir), "uuid": uuid, "name": name, "created": int(created), "created_str": created_str, "title": title, }) exports[pool_name] = files # .json if self.is_json() is True: self.view.exports = json_dumps(exports) else: self.view.exports = exports return True finally: kvc.close()
def _GET(self, *param, **params): host_id = self.chk_hostby1(param) if host_id is None: return web.notfound() model = findbyhost1(self.orm, host_id) uris = available_virt_uris() #import pdb; pdb.set_trace() if model.attribute == MACHINE_ATTRIBUTE["URI"]: uri_guests = [] uri_guests_status = {} uri_guests_kvg = {} uri_guests_info = {} uri_guests_name = {} segs = uri_split(model.hostname) uri = uri_join(segs, without_auth=True) creds = '' if segs["user"] is not None: creds += segs["user"] if segs["passwd"] is not None: creds += ':' + segs["passwd"] # Output .part if self.is_mode_input() is not True: try: self.kvc = KaresansuiVirtConnectionAuth(uri, creds) host = MergeHost(self.kvc, model) for guest in host.guests: _virt = self.kvc.search_kvg_guests( guest.info["model"].name) if 0 < len(_virt): for _v in _virt: uuid = _v.get_info()["uuid"] uri_guests_info[uuid] = guest.info uri_guests_kvg[uuid] = _v uri_guests_name[uuid] = guest.info[ "model"].name.encode("utf8") for name in sorted(uri_guests_name.values(), key=str.lower): for uuid in dict_search(name, uri_guests_name): uri_guests.append( MergeGuest(uri_guests_info[uuid]["model"], uri_guests_kvg[uuid])) uri_guests_status[uuid] = uri_guests_info[uuid][ 'virt'].status() finally: self.kvc.close() # .json if self.is_json() is True: guests_json = [] for x in uri_guests: guests_json.append(x.get_json(self.me.languages)) self.view.uri_guests = json_dumps(guests_json) else: self.view.uri_guests = uri_guests self.view.uri_guests_status = uri_guests_status self.kvc = KaresansuiVirtConnection() try: # libvirt connection scope --> # Storage Pool #inactive_pool = self.kvc.list_inactive_storage_pool() inactive_pool = [] active_pool = self.kvc.list_active_storage_pool() pools = inactive_pool + active_pool pools.sort() if not pools: return web.badrequest('One can not start a storage pool.') # Output .input if self.is_mode_input() is True: self.view.pools = pools pools_info = {} pools_vols_info = {} pools_iscsi_blocks = {} already_vols = [] guests = [] guests += self.kvc.list_inactive_guest() guests += self.kvc.list_active_guest() for guest in guests: already_vol = self.kvc.get_storage_volume_bydomain( domain=guest, image_type=None, attr='path') if already_vol: already_vols += already_vol.keys() for pool in pools: pool_obj = self.kvc.search_kvn_storage_pools(pool)[0] if pool_obj.is_active() is True: pools_info[pool] = pool_obj.get_info() blocks = None if pools_info[pool]['type'] == 'iscsi': blocks = self.kvc.get_storage_volume_iscsi_block_bypool( pool) if blocks: pools_iscsi_blocks[pool] = [] vols_obj = pool_obj.search_kvn_storage_volumes( self.kvc) vols_info = {} for vol_obj in vols_obj: vol_name = vol_obj.get_storage_volume_name() vols_info[vol_name] = vol_obj.get_info() if blocks: if vol_name in blocks and vol_name not in already_vols: pools_iscsi_blocks[pool].append( vol_obj.get_info()) pools_vols_info[pool] = vols_info self.view.pools_info = pools_info self.view.pools_vols_info = pools_vols_info self.view.pools_iscsi_blocks = pools_iscsi_blocks bridge_prefix = { "XEN": "xenbr", "KVM": KVM_BRIDGE_PREFIX, } self.view.host_id = host_id self.view.DEFAULT_KEYMAP = DEFAULT_KEYMAP self.view.DISK_NON_QEMU_FORMAT = DISK_NON_QEMU_FORMAT self.view.DISK_QEMU_FORMAT = DISK_QEMU_FORMAT self.view.hypervisors = {} self.view.mac_address = {} self.view.keymaps = {} self.view.phydev = {} self.view.virnet = {} used_ports = {} for k, v in MACHINE_HYPERVISOR.iteritems(): if k in available_virt_mechs(): self.view.hypervisors[k] = v uri = uris[k] mem_info = self.kvc.get_mem_info() active_networks = self.kvc.list_active_network() used_graphics_ports = self.kvc.list_used_graphics_port( ) bus_types = self.kvc.bus_types self.view.bus_types = bus_types self.view.max_mem = mem_info['host_max_mem'] self.view.free_mem = mem_info['host_free_mem'] self.view.alloc_mem = mem_info['guest_alloc_mem'] self.view.mac_address[k] = generate_mac_address(k) self.view.keymaps[k] = eval( "get_keymaps(%s_KEYMAP_DIR)" % k) # Physical device phydev = [] phydev_regex = re.compile(r"%s" % bridge_prefix[k]) for dev, dev_info in get_ifconfig_info().iteritems(): try: if phydev_regex.match(dev): phydev.append(dev) except: pass if len(phydev) == 0: phydev.append("%s0" % bridge_prefix[k]) phydev.sort() self.view.phydev[k] = phydev # Physical device # Virtual device self.view.virnet[k] = sorted(active_networks) used_ports[k] = used_graphics_ports exclude_ports = [] for k, _used_port in used_ports.iteritems(): exclude_ports = exclude_ports + _used_port exclude_ports = sorted(exclude_ports) exclude_ports = [ p for p, q in zip(exclude_ports, exclude_ports[1:] + [None]) if p != q ] self.view.graphics_port = next_number(GRAPHICS_PORT_MIN_NUMBER, PORT_MAX_NUMBER, exclude_ports) else: # .part models = findbyhost1guestall(self.orm, host_id) guests = [] if models: # Physical Guest Info self.view.hypervisors = {} for model in models: for k, v in MACHINE_HYPERVISOR.iteritems(): if k in available_virt_mechs(): self.view.hypervisors[k] = v uri = uris[k] if hasattr(self, "kvc") is not True: self.kvc = KaresansuiVirtConnection(uri) domname = self.kvc.uuid_to_domname( model.uniq_key) #if not domname: return web.conflict(web.ctx.path) _virt = self.kvc.search_kvg_guests(domname) if 0 < len(_virt): guests.append(MergeGuest(model, _virt[0])) else: guests.append(MergeGuest(model, None)) # Exported Guest Info exports = {} for pool_name in pools: files = [] pool = self.kvc.search_kvn_storage_pools(pool_name) path = pool[0].get_info()["target"]["path"] if os.path.exists(path): for _afile in glob.glob("%s/*/info.dat" % (path, )): param = ExportConfigParam() param.load_xml_config(_afile) _dir = os.path.dirname(_afile) uuid = param.get_uuid() name = param.get_domain() created = param.get_created() title = param.get_title() if title != "": title = re.sub("[\r\n]", "", title) if title == "": title = _('untitled') if created != "": created_str = time.strftime("%Y/%m/%d %H:%M:%S", \ time.localtime(float(created))) else: created_str = _("N/A") files.append({ "dir": _dir, "pool": pool_name, #"b64dir" : base64_encode(_dir), "uuid": uuid, "name": name, "created": int(created), "created_str": created_str, "title": title, "icon": param.get_database()["icon"], }) exports[pool_name] = files # .json if self.is_json() is True: guests_json = [] for x in guests: guests_json.append(x.get_json(self.me.languages)) self.view.guests = json_dumps(guests_json) else: self.view.exports = exports self.view.guests = guests return True except: pass finally: #self.kvc.close() pass # libvirt connection scope --> Guest#_post()
def _POST(self, *param, **params): host_id = self.chk_hostby1(param) if host_id is None: return web.notfound() model = findbyhost1(self.orm, host_id) if not validates_guest_import(self): return web.badrequest(self.view.alert) uuid = self.input.uuid kvc = KaresansuiVirtConnection() try: # Storage Pool #inactive_pool = kvc.list_inactive_storage_pool() inactive_pool = [] active_pool = kvc.list_active_storage_pool() pools = inactive_pool + active_pool pools.sort() export = [] for pool_name in pools: pool = kvc.search_kvn_storage_pools(pool_name) path = pool[0].get_info()["target"]["path"] if os.path.exists(path): for _afile in glob.glob("%s/*/info.dat" % (path, )): e_param = ExportConfigParam() e_param.load_xml_config(_afile) if e_param.get_uuid() != uuid: continue e_name = e_param.get_domain() _dir = os.path.dirname(_afile) param = ConfigParam(e_name) path = "%s/%s.xml" % (_dir, e_name) if os.path.isfile(path) is False: self.logger.error( 'Export corrupt data.(file not found) - path=%s' % path) return web.internalerror() param.load_xml_config(path) if e_name != param.get_domain_name(): self.logger.error('Export corrupt data.(The name does not match) - info=%s, xml=%s' \ % (e_name, param.get_name())) return web.internalerror() _dir = os.path.dirname(_afile) title = e_param.get_title() if title != "": title = re.sub("[\r\n]", "", title) if title == "": title = _('untitled') created = e_param.get_created() if created != "": created_str = time.strftime("%Y/%m/%d %H:%M:%S", \ time.localtime(float(created))) else: created_str = _("N/A") export.append({ "info": { "dir": _dir, "pool": pool_name, "uuid": e_param.get_uuid(), "name": e_param.get_domain(), "created": int(created), "created_str": created_str, "title": title, "database": { "name": e_param.database["name"], "tags": e_param.database["tags"], "attribute": e_param.database["attribute"], "notebook": { "title": e_param.database["notebook"]["title"], "value": e_param.database["notebook"]["value"], }, "uniq_key": e_param.database["uniq_key"], "hypervisor": e_param.database["hypervisor"], "icon": e_param.database["icon"], }, }, "xml": { "on_reboot": param.get_behavior('on_reboot'), "on_poweroff": param.get_behavior('on_poweroff'), "on_crash": param.get_behavior('on_crash'), "boot_dev": param.get_boot_dev(), #"bootloader" : param.get_bootloader(), #"commandline" : param.get_commandline(), #"current_snapshot" : param.get_current_snapshot(), 'disk': param.get_disk(), "domain_name": param.get_domain_name(), "domain_type": param.get_domain_type(), "features_acpi": param.get_features_acpi(), "features_apic": param.get_features_apic(), "features_pae": param.get_features_pae(), #"initrd" : param.get_initrd(), "interface": param.get_interface(), #"kernel" : param.get_kernel(), "max_memory": param.get_max_memory(), 'max_vcpus': param.get_max_vcpus(), "max_vcpus_limit": param.get_max_vcpus_limit(), "memory": param.get_memory(), "uuid": param.get_uuid(), "vcpus": param.get_vcpus(), "vcpus_limit": param.get_vcpus_limit(), "graphics_autoport": param.get_graphics_autoport(), "keymap": param.get_graphics_keymap(), "graphics_listen": param.get_graphics_listen(), "graphics_passwd": param.get_graphics_passwd(), "graphics_port": param.get_graphics_port(), }, "pool": pool[0].get_info(), }) if len(export) != 1: self.logger.info("Export does not exist. - uuid=%s" % self.view.uuid) return web.badrequest() else: export = export[0] finally: kvc.close() # Pool running? if export['pool']['is_active'] is False: return web.badrequest( "The destination, the storage pool is not running.") dest_domname = export['xml']['domain_name'] dest_uniqkey = export['info']['database']['uniq_key'] # Same guest OS is already running. if m_findby1uniquekey(self.orm, dest_uniqkey) is not None: self.logger.info( _("guest '%s' already exists. (DB) - %s") % (dest_domname, dest_uniqkey)) return web.badrequest( _("guest '%s' already exists.") % dest_domname) dest_dir = "%s/%s" % (export['pool']['target']['path'], export['xml']['domain_name']) if os.path.exists(dest_dir) is True: self.logger.info( _("guest '%s' already exists. (FS) - %s") % (dest_domname, dest_dir)) return web.badrequest( _("guest '%s' already exists.") % dest_domname) # disk check try: src_disk = "%s/%s/images/%s.img" \ % (export["info"]["dir"], export["info"]["name"], export["info"]["name"]) if os.path.exists(src_disk): s_size = os.path.getsize(src_disk) / (1024 * 1024 ) # a unit 'MB' if chk_create_disk(export["info"]["dir"], s_size) is False: partition = get_partition_info(export["info"]["dir"], header=False) return web.badrequest( _("No space available to create disk image in '%s' partition.") \ % partition[5][0]) except: pass extra_uniq_key = string_from_uuid(generate_uuid()) options = {} options["exportuuid"] = export["info"]["uuid"] options["destuuid"] = extra_uniq_key options["quiet"] = None # Database Notebook try: _notebook = n_new( export["info"]["database"]["notebook"]["title"], export["info"]["database"]["notebook"]["value"], ) except: _notebook = None # Database Tag _tags = [] try: tag_array = comma_split(export["info"]["database"]["tags"]) tag_array = uniq_sort(tag_array) for x in tag_array: if t_count(self.orm, x) == 0: _tags.append(t_new(x)) else: _tags.append(t_name(self.orm, x)) except: _tags.append(t_new("")) parent = m_findby1(self.orm, host_id) dest_guest = m_new( created_user=self.me, modified_user=self.me, uniq_key=extra_uniq_key, name=export["info"]["database"]["name"], attribute=int(export["info"]["database"]["attribute"]), hypervisor=int(export["info"]["database"]["hypervisor"]), notebook=_notebook, tags=_tags, icon=export["info"]["database"]["icon"], is_deleted=False, parent=parent, ) ret = regist_guest( self, _guest=dest_guest, icon_filename=export["info"]["database"]["icon"], cmd=VIRT_COMMAND_IMPORT_GUEST, options=options, cmdname=['Import Guest', 'Import Guest'], rollback_options={"name": export["xml"]["domain_name"]}, is_create=False) if ret is True: return web.accepted() else: return False
def _GET(self, *param, **params): host_id = self.chk_hostby1(param) if host_id is None: return web.notfound() kvc = KaresansuiVirtConnection() try: # Storage Pool #inactive_pool = kvc.list_inactive_storage_pool() inactive_pool = [] active_pool = kvc.list_active_storage_pool() pools = inactive_pool + active_pool pools.sort() if self.is_mode_input() is True: # (*.input) if not validates_sid(self): return web.badrequest(self.view.alert) sid = self.input.sid model = findbyguest1(self.orm, sid) if not model: return web.badrequest() domname = kvc.uuid_to_domname(model.uniq_key) src_pools = kvc.get_storage_pool_name_bydomain(domname) if not src_pools: return web.badrequest(_("Source storage pool is not found.")) for src_pool in src_pools : src_pool_type = kvc.get_storage_pool_type(src_pool) if src_pool_type != 'dir': return web.badrequest(_("'%s' disk contains the image.") % src_pool_type) virt = kvc.search_kvg_guests(domname)[0] if virt.is_active() is True: return web.badrequest(_("Guest is running. Please stop and try again. name=%s" % domname)) self.view.domname = virt.get_domain_name() non_iscsi_pool = [] for pool in pools: if kvc.get_storage_pool_type(pool) != 'iscsi': non_iscsi_pool.append(pool) self.view.pools = non_iscsi_pool self.view.sid = sid return True # Exported Guest Info (*.json) exports = {} for pool_name in pools: files = [] pool = kvc.search_kvn_storage_pools(pool_name) path = pool[0].get_info()["target"]["path"] if os.path.exists(path): for _afile in glob.glob("%s/*/info.dat" % (path,)): param = ExportConfigParam() param.load_xml_config(_afile) _dir = os.path.dirname(_afile) uuid = param.get_uuid() name = param.get_domain() created = param.get_created() title = param.get_title() if title != "": title = re.sub("[\r\n]","",title) if title == "": title = _('untitled') if created != "": created_str = time.strftime("%Y/%m/%d %H:%M:%S", \ time.localtime(float(created))) else: created_str = _("N/A") files.append({"dir": _dir, "pool" : pool_name, #"b64dir" : base64_encode(_dir), "uuid" : uuid, "name" : name, "created" : int(created), "created_str" : created_str, "title" : title, }) exports[pool_name] = files # .json if self.is_json() is True: self.view.exports = json_dumps(exports) else: self.view.exports = exports return True finally: kvc.close()
def process(self): (opts, args) = getopts() chkopts(opts) self.up_progress(10) kvc = KaresansuiVirtConnection() # #1 libvirt process try: #inactive_pool = kvc.list_inactive_storage_pool() inactive_pool = [] active_pool = kvc.list_active_storage_pool() pools = inactive_pool + active_pool pools.sort() export = [] for pool_name in pools: pool = kvc.search_kvn_storage_pools(pool_name) path = pool[0].get_info()["target"]["path"] if os.path.exists(path): for _afile in glob.glob("%s/*/info.dat" % (path,)): e_param = ExportConfigParam() e_param.load_xml_config(_afile) if e_param.get_uuid() != opts.uuid: continue e_name = e_param.get_domain() _dir = os.path.dirname(_afile) param = ConfigParam(e_name) path = "%s/%s.xml" % (_dir, e_name) if os.path.isfile(path) is False: raise KssCommandException( 'Export corrupt data.(file not found) - path=%s' % path) param.load_xml_config(path) if e_name != param.get_domain_name(): raise KssCommandException( 'Export corrupt data.(The name does not match) - info=%s, xml=%s' \ % (e_name, param.get_name())) _dir = os.path.dirname(_afile) export.append({"dir" : _dir, "pool" : pool_name, "uuid" : e_param.get_uuid(), "name" : e_name, }) if len(export) < 1: # refresh pool. conn = KaresansuiVirtConnection(readonly=False) try: conn.refresh_pools() finally: conn.close() raise KssCommandException('libvirt data did not exist. - uuid=%s' % opts.uuid) else: export = export[0] finally: kvc.close() self.up_progress(30) # #2 physical process if os.path.isdir(export['dir']) is False: raise KssCommandException(_("Failed to delete export data. - %s") % (_("Export data directory not found. [%s]") % (export['dir']))) uuid = os.path.basename(export['dir']) pool_dir = os.path.dirname(export['dir']) if not is_uuid(export['uuid']): raise KssCommandException(_("Failed to delete export data. - %s") % (_("'%s' is not valid export data directory.") % (export['dir']))) shutil.rmtree(export['dir']) for _afile in glob.glob("%s*img" % (export['dir'])): os.remove(_afile) self.up_progress(30) # refresh pool. conn = KaresansuiVirtConnection(readonly=False) try: try: conn.refresh_pools() finally: conn.close() except: pass self.logger.info('Deleted export data. - uuid=%s' % (opts.uuid)) print >>sys.stdout, _('Deleted export data. - uuid=%s') % (opts.uuid) return True