mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 18:50:05 +01:00
bitkeeper revision 1.1159.14.1 (4118b580s6wv9f_TYlNpiSrvoYj-qQ)
Merge http://xen.bkbits.net:8080/xeno-unstable.bk into gandalf.hpl.hp.com:/var/bk/xeno-unstable.bk
This commit is contained in:
commit
1e160fdb1c
3 files changed
+58
-15
No files matched your search
@@ -199,7 +199,7 @@ class XendDomain:
|
||||
self.domain_db[info.id] = info.sxpr()
|
||||
self.domain_by_name[info.name] = info
|
||||
self.sync_domain(info.id)
|
||||
if notify: eserver.inject('xend.domain.created', info.name)
|
||||
if notify: eserver.inject('xend.domain.created', [info.name, info.id])
|
||||
|
||||
def _delete_domain(self, id, notify=1):
|
||||
"""Remove a domain from the tables.
|
||||
@@ -209,7 +209,7 @@ class XendDomain:
|
||||
"""
|
||||
if id in self.domain_by_id:
|
||||
info = self.domain_by_id[id]
|
||||
if notify: eserver.inject('xend.domain.died', info.name)
|
||||
if notify: eserver.inject('xend.domain.died', [info.name, info.id])
|
||||
if info.name in self.domain_by_name:
|
||||
del self.domain_by_name[info.name]
|
||||
del self.domain_by_id[id]
|
||||
@@ -239,6 +239,9 @@ class XendDomain:
|
||||
reason = XendDomainInfo.shutdown_reason(d['shutdown_reason'])
|
||||
log.debug('XendDomain>reap> shutdown id=%s reason=%s', id, reason)
|
||||
if reason in ['suspend']:
|
||||
dominfo = self.domain_by_id.get(id)
|
||||
name = (dominfo and dominfo.name) or '??'
|
||||
eserver.inject('xend.domain.suspended', [name, id])
|
||||
continue
|
||||
if reason in ['poweroff', 'reboot']:
|
||||
self.domain_restart_schedule(id, reason)
|
||||
@@ -421,7 +424,7 @@ class XendDomain:
|
||||
@param id: domain id
|
||||
"""
|
||||
dominfo = self.domain_lookup(id)
|
||||
eserver.inject('xend.domain.unpause', dominfo.name)
|
||||
eserver.inject('xend.domain.unpause', [dominfo.name, dominfo.id])
|
||||
try:
|
||||
return xc.domain_unpause(dom=dominfo.dom)
|
||||
except Exception, ex:
|
||||
@@ -433,7 +436,7 @@ class XendDomain:
|
||||
@param id: domain id
|
||||
"""
|
||||
dominfo = self.domain_lookup(id)
|
||||
eserver.inject('xend.domain.pause', dominfo.name)
|
||||
eserver.inject('xend.domain.pause', [dominfo.name, dominfo.id])
|
||||
try:
|
||||
return xc.domain_pause(dom=dominfo.dom)
|
||||
except Exception, ex:
|
||||
@@ -455,7 +458,7 @@ class XendDomain:
|
||||
self.domain_restart_cancel(dominfo.id)
|
||||
else:
|
||||
self.domain_restart_schedule(dominfo.id, reason, force=1)
|
||||
eserver.inject('xend.domain.shutdown', [dominfo.name, reason])
|
||||
eserver.inject('xend.domain.shutdown', [dominfo.name, dominfo.id, reason])
|
||||
if reason == 'halt':
|
||||
reason = 'poweroff'
|
||||
val = xend.domain_shutdown(dominfo.id, reason)
|
||||
@@ -535,7 +538,7 @@ class XendDomain:
|
||||
"""
|
||||
dominfo = self.domain_lookup(id)
|
||||
log.info('Destroying domain: name=%s', dominfo.name)
|
||||
eserver.inject('xend.domain.destroy', dominfo.name)
|
||||
eserver.inject('xend.domain.destroy', [dominfo.name, dominfo.id])
|
||||
if dominfo:
|
||||
val = dominfo.destroy()
|
||||
else:
|
||||
|
||||
@@ -643,7 +643,11 @@ class XendDomainInfo:
|
||||
"""
|
||||
self.release_vifs()
|
||||
self.release_vbds()
|
||||
|
||||
self.devices = {}
|
||||
self.device_index = {}
|
||||
self.configs = []
|
||||
self.ipaddrs = []
|
||||
|
||||
def release_vifs(self):
|
||||
"""Release vm virtual network devices (vifs).
|
||||
@@ -851,7 +855,7 @@ class XendDomainInfo:
|
||||
|
||||
def restart_check(self):
|
||||
"""Check if domain restart is OK.
|
||||
To prevent restart loops, raise an error it is
|
||||
To prevent restart loops, raise an error if it is
|
||||
less than MINIMUM_RESTART_TIME seconds since the last restart.
|
||||
"""
|
||||
tnow = time.time()
|
||||
|
||||
@@ -107,6 +107,15 @@ class XfrdInfo:
|
||||
self.deferred.errback(err)
|
||||
|
||||
def dispatch(self, xfrd, val):
|
||||
|
||||
def cbok(v):
|
||||
if v is None: return
|
||||
sxp.show(v, out=xfrd.transport)
|
||||
|
||||
def cberr(err):
|
||||
v = ['xfr.err', errno.EINVAL]
|
||||
sxp.show(v, out=xfrd.transport)
|
||||
|
||||
op = sxp.name(val)
|
||||
op = op.replace('.', '_')
|
||||
if op.startswith('xfr_'):
|
||||
@@ -114,8 +123,11 @@ class XfrdInfo:
|
||||
else:
|
||||
fn = self.unknown
|
||||
val = fn(xfrd, val)
|
||||
if val is not None:
|
||||
sxp.show(val, out=xfrd.transport)
|
||||
if isinstance(val, defer.Deferred):
|
||||
val.addCallback(cbok)
|
||||
val.addErrback(cberr)
|
||||
else:
|
||||
cbok(val)
|
||||
|
||||
def unknown(self, xfrd, val):
|
||||
print 'unknown>', val
|
||||
@@ -164,11 +176,40 @@ class XfrdInfo:
|
||||
return ['xfr.err', val]
|
||||
|
||||
def xfr_vm_suspend(self, xfrd, val):
|
||||
"""Suspend a domain. Suspending takes time, so we return
|
||||
a Deferred that is called when the suspend completes.
|
||||
"""
|
||||
print 'xfr_vm_suspend>', val
|
||||
try:
|
||||
vmid = sxp.child0(val)
|
||||
d = defer.Deferred()
|
||||
# Subscribe to 'suspended' events so we can tell when the
|
||||
# suspend completes. Subscribe to 'died' events so we can tell if
|
||||
# the domain died.
|
||||
def onSuspended(e, v):
|
||||
print 'onSuspended>', e, v
|
||||
if v[1] != vmid: return
|
||||
subscribe(on=0)
|
||||
d.callback(v)
|
||||
|
||||
def onDied(e, v):
|
||||
print 'onDied>', e, v
|
||||
if v[1] != vmid: return
|
||||
subscribe(on=0)
|
||||
d.errback(XendError('Domain died'))
|
||||
|
||||
def subscribe(on=1):
|
||||
if on:
|
||||
action = eserver.subscribe
|
||||
else:
|
||||
action = eserver.unsubscribe
|
||||
action('xend.domain.suspended', onSuspended)
|
||||
action('xend.domain.died', onDied)
|
||||
|
||||
subscribe()
|
||||
val = self.xd.domain_shutdown(vmid, reason='suspend')
|
||||
self.suspended[vmid] = 1
|
||||
return d
|
||||
except:
|
||||
val = errno.EINVAL
|
||||
return ['xfr.err', val]
|
||||
@@ -216,8 +257,6 @@ class XendMigrateInfo(XfrdInfo):
|
||||
if not vmconfig:
|
||||
xfrd.loseConnection()
|
||||
return
|
||||
self.xd.domain_pause(self.src_dom)
|
||||
self.paused[self.src_dom] = 1
|
||||
xfrd.request(['xfr.migrate',
|
||||
self.src_dom,
|
||||
vmconfig,
|
||||
@@ -266,14 +305,11 @@ class XendSaveInfo(XfrdInfo):
|
||||
if not vmconfig:
|
||||
xfrd.loseConnection()
|
||||
return
|
||||
self.xd.domain_pause(self.src_dom)
|
||||
self.paused[self.src_dom] = 1
|
||||
xfrd.request(['xfr.save', self.src_dom, vmconfig, self.file ])
|
||||
|
||||
def xfr_save_ok(self, xfrd, val):
|
||||
dom = int(sxp.child0(val))
|
||||
self.state = 'ok'
|
||||
self.xd_domain_destroy(self.src_dom)
|
||||
self.xd.domain_destroy(self.src_dom)
|
||||
if not self.deferred.called:
|
||||
self.deferred.callback(self)
|
||||
|
||||
|
||||