mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 10:11:27 +01:00
Fix the handling of the transient flag.
Signed-off-by: Ewan Mellor <ewan@xensource.com>
This commit is contained in:
1 parent
828004d171
commit
1d005ae159
2 files changed
+52
-26
No files matched your search
@@ -34,7 +34,7 @@ import xen.lowlevel.xc
|
||||
|
||||
from xen.xend import XendOptions, XendCheckpoint, XendDomainInfo
|
||||
from xen.xend.PrettyPrint import prettyprint
|
||||
from xen.xend.XendConfig import XendConfig
|
||||
from xen.xend import XendConfig
|
||||
from xen.xend.XendError import XendError, XendInvalidDomain, VmError
|
||||
from xen.xend.XendError import VMBadState
|
||||
from xen.xend.XendLogging import log
|
||||
@@ -191,6 +191,10 @@ class XendDomain:
|
||||
self._managed_domain_register(new_dom)
|
||||
else:
|
||||
self._managed_domain_register(running_dom)
|
||||
for key in XendConfig.XENAPI_CFG_TYPES.keys():
|
||||
if key not in XendConfig.LEGACY_XENSTORE_VM_PARAMS and \
|
||||
key in dom:
|
||||
running_dom.info[key] = dom[key]
|
||||
except Exception:
|
||||
log.exception("Failed to create reference to managed "
|
||||
"domain: %s" % dom_name)
|
||||
@@ -316,7 +320,7 @@ class XendDomain:
|
||||
for dom_uuid in dom_uuids:
|
||||
try:
|
||||
cfg_file = self._managed_config_path(dom_uuid)
|
||||
cfg = XendConfig(filename = cfg_file)
|
||||
cfg = XendConfig.XendConfig(filename = cfg_file)
|
||||
if cfg.get('uuid') != dom_uuid:
|
||||
# something is wrong with the SXP
|
||||
log.error("UUID mismatch in stored configuration: %s" %
|
||||
@@ -414,7 +418,7 @@ class XendDomain:
|
||||
running_domids = [d['domid'] for d in running if d['dying'] != 1]
|
||||
for domid, dom in self.domains.items():
|
||||
if domid not in running_domids and domid != DOM0_ID:
|
||||
self.remove_domain(dom, domid)
|
||||
self._remove_domain(dom, domid)
|
||||
|
||||
|
||||
def add_domain(self, info):
|
||||
@@ -433,6 +437,16 @@ class XendDomain:
|
||||
self._managed_domain_register(info)
|
||||
|
||||
def remove_domain(self, info, domid = None):
|
||||
"""Remove the domain from the list of running domains, taking the
|
||||
domains_lock first.
|
||||
"""
|
||||
self.domains_lock.acquire()
|
||||
try:
|
||||
self._remove_domain(info, domid)
|
||||
finally:
|
||||
self.domains_lock.release()
|
||||
|
||||
def _remove_domain(self, info, domid = None):
|
||||
"""Remove the domain from the list of running domains
|
||||
|
||||
@requires: Expects to be protected by the domains_lock.
|
||||
@@ -683,7 +697,7 @@ class XendDomain:
|
||||
self.domains_lock.acquire()
|
||||
try:
|
||||
try:
|
||||
xeninfo = XendConfig(xapi = xenapi_vm)
|
||||
xeninfo = XendConfig.XendConfig(xapi = xenapi_vm)
|
||||
dominfo = XendDomainInfo.createDormant(xeninfo)
|
||||
log.debug("Creating new managed domain: %s: %s" %
|
||||
(dominfo.getName(), dominfo.get_uuid()))
|
||||
@@ -906,7 +920,7 @@ class XendDomain:
|
||||
self.domains_lock.acquire()
|
||||
try:
|
||||
try:
|
||||
domconfig = XendConfig(sxp_obj = config)
|
||||
domconfig = XendConfig.XendConfig(sxp_obj = config)
|
||||
dominfo = XendDomainInfo.createDormant(domconfig)
|
||||
log.debug("Creating new managed domain: %s" %
|
||||
dominfo.getName())
|
||||
@@ -971,18 +985,34 @@ class XendDomain:
|
||||
raise VMBadState("Domain is still running",
|
||||
POWER_STATE_NAMES[DOM_STATE_HALTED],
|
||||
POWER_STATE_NAMES[dominfo.state])
|
||||
|
||||
log.info("Domain %s (%s) deleted." %
|
||||
(dominfo.getName(), dominfo.info.get('uuid')))
|
||||
|
||||
self._managed_domain_unregister(dominfo)
|
||||
self.remove_domain(dominfo)
|
||||
XendDevices.destroy_device_state(dominfo)
|
||||
|
||||
self._domain_delete_by_info(dominfo)
|
||||
except Exception, ex:
|
||||
raise XendError(str(ex))
|
||||
finally:
|
||||
self.domains_lock.release()
|
||||
|
||||
|
||||
|
||||
def domain_delete_by_dominfo(self, dominfo):
|
||||
"""Only for use by XendDomainInfo.
|
||||
"""
|
||||
self.domains_lock.acquire()
|
||||
try:
|
||||
self._domain_delete_by_info(dominfo)
|
||||
finally:
|
||||
self.domains_lock.release()
|
||||
|
||||
|
||||
def _domain_delete_by_info(self, dominfo):
|
||||
"""Expects to be protected by domains_lock.
|
||||
"""
|
||||
log.info("Domain %s (%s) deleted." %
|
||||
(dominfo.getName(), dominfo.info.get('uuid')))
|
||||
|
||||
self._managed_domain_unregister(dominfo)
|
||||
self._remove_domain(dominfo)
|
||||
XendDevices.destroy_device_state(dominfo)
|
||||
|
||||
|
||||
def domain_configure(self, config):
|
||||
"""Configure an existing domain.
|
||||
|
||||
@@ -660,7 +660,6 @@ class XendDomainInfo:
|
||||
vm_config = dict(zip(augment_entries, vm_config))
|
||||
|
||||
for arg in augment_entries:
|
||||
xapicfg = arg
|
||||
val = vm_config[arg]
|
||||
if val != None:
|
||||
if arg in XendConfig.LEGACY_CFG_TO_XENAPI_CFG:
|
||||
@@ -1651,6 +1650,12 @@ class XendDomainInfo:
|
||||
|
||||
self._cleanup_phantom_devs(paths)
|
||||
|
||||
if "transient" in self.info["other_config"] \
|
||||
and bool(self.info["other_config"]["transient"]):
|
||||
from xen.xend import XendDomain
|
||||
XendDomain.instance().domain_delete_by_dominfo(self)
|
||||
|
||||
|
||||
def destroyDomain(self):
|
||||
log.debug("XendDomainInfo.destroyDomain(%s)", str(self.domid))
|
||||
|
||||
@@ -1662,26 +1667,17 @@ class XendDomainInfo:
|
||||
self.domid = None
|
||||
for state in DOM_STATES_OLD:
|
||||
self.info[state] = 0
|
||||
self._stateSet(DOM_STATE_HALTED)
|
||||
except:
|
||||
log.exception("XendDomainInfo.destroy: xc.domain_destroy failed.")
|
||||
|
||||
from xen.xend import XendDomain
|
||||
|
||||
if "transient" in self.info["other_config"]\
|
||||
and bool(self.info["other_config"]["transient"]):
|
||||
xendDomainInstance = XendDomain.instance()
|
||||
|
||||
xendDomainInstance.domains_lock.acquire()
|
||||
xendDomainInstance._refresh(refresh_shutdown = False)
|
||||
xendDomainInstance.domains_lock.release()
|
||||
|
||||
xendDomainInstance.domain_delete(self.info["name_label"])
|
||||
else:
|
||||
XendDomain.instance().remove_domain(self)
|
||||
XendDomain.instance().remove_domain(self)
|
||||
|
||||
self.cleanupDomain()
|
||||
self._cleanup_phantom_devs(paths)
|
||||
|
||||
|
||||
def resumeDomain(self):
|
||||
log.debug("XendDomainInfo.resumeDomain(%s)", str(self.domid))
|
||||
|
||||
|
||||