def refresh(self, initialising = False): """Refresh domain list from Xen. Expects to be protected by the domains_lock. @param initialising True if this is the first refresh after starting Xend. This does not change this method's behaviour, except for logging. """ doms = self.xen_domains() for d in self.domains.values(): info = doms.get(d.getDomid()) if info: d.update(info) else: self._delete_domain(d.getDomid()) for d in doms: if d not in self.domains: if doms[d]['dying']: log.log(initialising and logging.ERROR or logging.DEBUG, 'Cannot recreate information for dying domain %d.' ' Xend will ignore this domain from now on.', doms[d]['dom']) elif d == PRIV_DOMAIN: log.fatal( "No record of privileged domain %d! Terminating.", d) sys.exit(1) else: try: self._add_domain( XendDomainInfo.recreate(doms[d], False)) except: log.exception( "Failed to recreate information for domain " "%d. Destroying it in the hope of " "recovery.", d) try: xc.domain_destroy(d) except: log.exception('Destruction of %d failed.', d)
def domain_destroy(self, domid): """Terminate domain immediately.""" dominfo = self.domain_lookup_by_name_or_id_nr(domid) if dominfo and dominfo.getDomid() == PRIV_DOMAIN: raise XendError("Cannot destroy privileged domain %s" % domid) if dominfo: val = dominfo.destroy() else: try: val = xc.domain_destroy(domid) except Exception, ex: raise XendError(str(ex))