📄 xenddomain.py
字号:
self.domains_lock.acquire() try: for dom in self.domains.values() + self.managed_domains.values(): if dom.has_device(klass, dev_uuid): return dom return None finally: self.domains_lock.release() def get_dev_property_by_uuid(self, klass, dev_uuid, field): value = None self.domains_lock.acquire() try: try: dom = self.get_vm_with_dev_uuid(klass, dev_uuid) if dom: value = dom.get_dev_property(klass, dev_uuid, field) except ValueError, e: pass finally: self.domains_lock.release() return value def set_dev_property_by_uuid(self, klass, dev_uuid, field, value, old_val = None): rc = True self.domains_lock.acquire() try: try: dom = self.get_vm_with_dev_uuid(klass, dev_uuid) if dom: o_val = dom.get_dev_property(klass, dev_uuid, field) log.info("o_val=%s, old_val=%s" % (o_val, old_val)) if old_val and old_val != o_val: return False dom.set_dev_property(klass, dev_uuid, field, value) self.managed_config_save(dom) except ValueError, e: pass finally: self.domains_lock.release() return rc def is_valid_vm(self, vm_ref): return (self.get_vm_by_uuid(vm_ref) != None) def is_valid_dev(self, klass, dev_uuid): return (self.get_vm_with_dev_uuid(klass, dev_uuid) != None) def do_legacy_api_with_uuid(self, fn, vm_uuid, *args, **kwargs): dom = self.uuid_to_dom(vm_uuid) fn(dom, *args, **kwargs) def uuid_to_dom(self, vm_uuid): self.domains_lock.acquire() try: for domid, dom in self.domains.items(): if dom.get_uuid() == vm_uuid: return domid if vm_uuid in self.managed_domains: domid = self.managed_domains[vm_uuid].getDomid() if domid is None: return self.managed_domains[vm_uuid].getName() else: return domid raise XendInvalidDomain(vm_uuid) finally: self.domains_lock.release() def create_domain(self, xenapi_vm): self.domains_lock.acquire() try: try: xeninfo = XendConfig.XendConfig(xapi = xenapi_vm) dominfo = XendDomainInfo.createDormant(xeninfo) log.debug("Creating new managed domain: %s: %s" % (dominfo.getName(), dominfo.get_uuid())) self._managed_domain_register(dominfo) self.managed_config_save(dominfo) return dominfo.get_uuid() except XendError, e: raise except Exception, e: raise XendError(str(e)) finally: self.domains_lock.release() def rename_domain(self, dom, new_name): self.domains_lock.acquire() try: old_name = dom.getName() dom.setName(new_name) finally: self.domains_lock.release() # # End of Xen API # ---------------------------------------------------------------- # ------------------------------------------------------------ # Xen Legacy API def list(self, state = DOM_STATE_RUNNING): """Get list of domain objects. @param: the state in which the VMs should be -- one of the DOM_STATE_XYZ constants, or the corresponding name, or 'all'. @return: domains @rtype: list of XendDomainInfo """ if type(state) == int: state = POWER_STATE_NAMES[state] state = state.lower() self.domains_lock.acquire() try: self._refresh(refresh_shutdown = False) # active domains active_domains = self.domains.values() active_uuids = [d.get_uuid() for d in active_domains] # inactive domains inactive_domains = [] for dom_uuid, dom in self.managed_domains.items(): if dom_uuid not in active_uuids: inactive_domains.append(dom) if state == POWER_STATE_ALL: return active_domains + inactive_domains else: return filter(lambda x: POWER_STATE_NAMES[x._stateGet()].lower() == state, active_domains + inactive_domains) finally: self.domains_lock.release() def list_sorted(self, state = DOM_STATE_RUNNING): """Get list of domain objects, sorted by name. @param: the state in which the VMs should be -- one of the DOM_STATE_XYZ constants, or the corresponding name, or 'all'. @return: domain objects @rtype: list of XendDomainInfo """ doms = self.list(state) doms.sort(lambda x, y: cmp(x.getName(), y.getName())) return doms def list_names(self, state = DOM_STATE_RUNNING): """Get list of domain names. @param: the state in which the VMs should be -- one of the DOM_STATE_XYZ constants, or the corresponding name, or 'all'. @return: domain names @rtype: list of strings. """ return [d.getName() for d in self.list_sorted(state)] def domain_suspend(self, domname): """Suspends a domain that is persistently managed by Xend @param domname: Domain Name @type domname: string @rtype: None @raise XendError: Failure during checkpointing. """ try: dominfo = self.domain_lookup_nr(domname) if not dominfo: raise XendInvalidDomain(domname) if dominfo.getDomid() == DOM0_ID: raise XendError("Cannot suspend privileged domain %s" % domname) if dominfo._stateGet() != DOM_STATE_RUNNING: raise VMBadState("Domain is not running", POWER_STATE_NAMES[DOM_STATE_RUNNING], POWER_STATE_NAMES[dominfo._stateGet()]) dom_uuid = dominfo.get_uuid() if not os.path.exists(self._managed_config_path(dom_uuid)): raise XendError("Domain is not managed by Xend lifecycle " + "support.") path = self._managed_check_point_path(dom_uuid) oflags = os.O_WRONLY | os.O_CREAT | os.O_TRUNC if hasattr(os, "O_LARGEFILE"): oflags |= os.O_LARGEFILE fd = os.open(path, oflags) try: # For now we don't support 'live checkpoint' XendCheckpoint.save(fd, dominfo, False, False, path) finally: os.close(fd) except OSError, ex: raise XendError("can't write guest state file %s: %s" % (path, ex[1])) def domain_resume(self, domname, start_paused = False): """Resumes a domain that is persistently managed by Xend. @param domname: Domain Name @type domname: string @rtype: None @raise XendError: If failed to restore. """ self.domains_lock.acquire() try: try: fd = None dominfo = self.domain_lookup_nr(domname) if not dominfo: raise XendInvalidDomain(domname) if dominfo.getDomid() == DOM0_ID: raise XendError("Cannot resume privileged domain %s" % domname) if dominfo._stateGet() != XEN_API_VM_POWER_STATE_SUSPENDED: raise XendError("Cannot resume domain that is not suspended.") dominfo.setResume(True) dom_uuid = dominfo.get_uuid() chkpath = self._managed_check_point_path(dom_uuid) if not os.path.exists(chkpath): raise XendError("Domain was not suspended by Xend") # Restore that replaces the existing XendDomainInfo try: log.debug('Current DomainInfo state: %d' % dominfo._stateGet()) oflags = os.O_RDONLY if hasattr(os, "O_LARGEFILE"): oflags |= os.O_LARGEFILE fd = os.open(chkpath, oflags) XendCheckpoint.restore(self, fd, dominfo, paused = start_paused) os.unlink(chkpath) except OSError, ex: raise XendError("Failed to read stored checkpoint file") except IOError, ex: raise XendError("Failed to delete checkpoint file") except Exception, ex: log.exception("Exception occurred when resuming") raise XendError("Error occurred when resuming: %s" % str(ex)) finally: if fd is not None: os.close(fd) self.domains_lock.release() def domain_create(self, config): """Create a domain from a configuration. @param config: configuration @type config: SXP Object (list of lists) @rtype: XendDomainInfo """ self.domains_lock.acquire() try: self._refresh() dominfo = XendDomainInfo.create(config) return dominfo finally: self.domains_lock.release() def domain_create_from_dict(self, config_dict): """Create a domain from a configuration dictionary. @param config_dict: configuration @rtype: XendDomainInfo """ self.domains_lock.acquire() try: self._refresh() dominfo = XendDomainInfo.create_from_dict(config_dict) return dominfo finally: self.domains_lock.release() def domain_new(self, config): """Create a domain from a configuration but do not start it. @param config: configuration @type config: SXP Object (list of lists) @rtype: XendDomainInfo """ self.domains_lock.acquire() try: try: domconfig = XendConfig.XendConfig(sxp_obj = config) dominfo = XendDomainInfo.createDormant(domconfig) log.debug("Creating new managed domain: %s" % dominfo.getName()) self._managed_domain_register(dominfo) self.managed_config_save(dominfo) # no return value because it isn't meaningful for client except XendError, e: raise except Exception, e: raise XendError(str(e)) finally: self.domains_lock.release() def domain_start(self, domid, start_paused = True): """Start a managed domain @require: Domain must not be running. @param domid: Domain name or domain ID. @type domid: string or int @rtype: None @raise XendError: If domain is still running @rtype: None """ self.domains_lock.acquire() try: self._refresh() dominfo = self.domain_lookup_nr(domid) if not dominfo: raise XendInvalidDomain(str(domid)) if dominfo._stateGet() != DOM_STATE_HALTED:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -