mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 10:11:27 +01:00
bitkeeper revision 1.1159.1.166 (41515bbcO3i2KEUTPMBadmjOSG5Sfw)
Add some restart events and make migrate/save events consistent with other domain events.
This commit is contained in:
1 parent
c2c9f7989d
commit
e9bdcef227
2 files changed
+40
-19
No files matched your search
@@ -203,7 +203,7 @@ class XendDomain:
|
||||
if info.name:
|
||||
self.domain_by_name[info.name] = info
|
||||
self.sync_domain(info.id)
|
||||
if notify: eserver.inject('xend.domain.created', [info.name, info.id])
|
||||
if notify: eserver.inject('xend.domain.create', [info.name, info.id])
|
||||
|
||||
def _delete_domain(self, id, notify=1):
|
||||
"""Remove a domain from the tables.
|
||||
@@ -374,6 +374,8 @@ class XendDomain:
|
||||
self._add_domain(dominfo)
|
||||
return dominfo
|
||||
log.info("Restarting domain: id=%s name=%s", dominfo.id, dominfo.name)
|
||||
eserver.inject("xend.domain.restart",
|
||||
[dominfo.name, dominfo.id, "begin"])
|
||||
deferred = dominfo.restart()
|
||||
deferred.addCallback(cbok)
|
||||
return deferred
|
||||
@@ -502,6 +504,8 @@ class XendDomain:
|
||||
self.restarts_by_name[dominfo.name] = dominfo
|
||||
self.restarts_by_id[dominfo.id] = dominfo
|
||||
log.info('Scheduling restart for domain: name=%s id=%s', dominfo.name, dominfo.id)
|
||||
eserver.inject("xend.domain.restart",
|
||||
[dominfo.name, dominfo.id, "schedule"])
|
||||
self.domain_restarts_schedule()
|
||||
|
||||
def domain_restart_cancel(self, id):
|
||||
@@ -512,6 +516,8 @@ class XendDomain:
|
||||
dominfo = self.restarts_by_id.get(id) or self.restarts_by_name.get(id)
|
||||
if dominfo:
|
||||
log.info('Cancelling restart for domain: name=%s id=%s', dominfo.name, dominfo.id)
|
||||
eserver.inject("xend.domain.restart",
|
||||
[dominfo.name, dominfo.id, "cancel"])
|
||||
dominfo.restart_cancel()
|
||||
del self.restarts_by_id[dominfo.id]
|
||||
del self.restarts_by_name[dominfo.name]
|
||||
@@ -530,16 +536,23 @@ class XendDomain:
|
||||
try:
|
||||
def cbok(dominfo):
|
||||
log.info('Restarted domain name=%s id=%s', dominfo.name, dominfo.id)
|
||||
eserver.inject("xend.domain.restart",
|
||||
[dominfo.name, dominfo.id, "success"])
|
||||
self.domain_unpause(dominfo.id)
|
||||
def cberr(err):
|
||||
log.exception("Delayed exception restarting domain: name=%s id=%s",
|
||||
dominfo.name, dominfo.id)
|
||||
eserver.inject("xend.domain.restart",
|
||||
[dominfo.name, dominfo.id, "fail"])
|
||||
|
||||
deferred = self.domain_restart(dominfo)
|
||||
deferred.addCallback(cbok)
|
||||
deferred.addErrback(cberr)
|
||||
except:
|
||||
log.exception("Exception restarting domain: name=%s id=%s",
|
||||
dominfo.name, dominfo.id)
|
||||
eserver.inject("xend.domain.restart",
|
||||
[dominfo.name, dominfo.id, "fail"])
|
||||
if self.domain_restarts_exist():
|
||||
# Run again later if any restarts remain.
|
||||
self.refresh_schedule(delay=5)
|
||||
@@ -587,7 +600,7 @@ class XendDomain:
|
||||
# Don't forget to cancel restart for it.
|
||||
dominfo = self.domain_lookup(id)
|
||||
xmigrate = XendMigrate.instance()
|
||||
val = xmigrate.migrate_begin(dominfo.id, dst, live=live)
|
||||
val = xmigrate.migrate_begin(dominfo, dst, live=live)
|
||||
return val
|
||||
|
||||
def domain_save(self, id, dst, progress=0):
|
||||
@@ -600,7 +613,7 @@ class XendDomain:
|
||||
"""
|
||||
dominfo = self.domain_lookup(id)
|
||||
xmigrate = XendMigrate.instance()
|
||||
return xmigrate.save_begin(dominfo.id, dst)
|
||||
return xmigrate.save_begin(dominfo, dst)
|
||||
|
||||
def domain_pincpu(self, id, cpu):
|
||||
"""Pin a domain to a cpu.
|
||||
|
||||
@@ -260,12 +260,13 @@ class XendMigrateInfo(XfrdInfo):
|
||||
"""Representation of a migrate in-progress and its interaction with xfrd.
|
||||
"""
|
||||
|
||||
def __init__(self, xid, dom, host, port, live):
|
||||
def __init__(self, xid, dominfo, host, port, live):
|
||||
XfrdInfo.__init__(self)
|
||||
self.xid = xid
|
||||
self.dominfo = dominfo
|
||||
self.state = 'begin'
|
||||
self.src_host = socket.gethostname()
|
||||
self.src_dom = dom
|
||||
self.src_dom = dominfo.id
|
||||
self.dst_host = host
|
||||
self.dst_port = port
|
||||
self.dst_dom = None
|
||||
@@ -291,7 +292,9 @@ class XendMigrateInfo(XfrdInfo):
|
||||
xfrd.loseConnection()
|
||||
return
|
||||
log.info('Migrate BEGIN: ' + str(self.sxpr()))
|
||||
eserver.inject('xend.migrate.begin', self.sxpr())
|
||||
eserver.inject('xend.domain.migrate',
|
||||
[ self.dominfo.name, self.dominfo.id,
|
||||
"begin", self.sxpr() ])
|
||||
xfrd.request(['xfr.migrate',
|
||||
self.src_dom,
|
||||
vmconfig,
|
||||
@@ -312,22 +315,24 @@ class XendMigrateInfo(XfrdInfo):
|
||||
XfrdInfo.connectionLost(self, reason)
|
||||
if self.state =='ok':
|
||||
log.info('Migrate OK: ' + str(self.sxpr()))
|
||||
eserver.inject('xend.migrate.ok', self.sxpr())
|
||||
else:
|
||||
self.state = 'error'
|
||||
self.error(XendError("migrate failed"))
|
||||
log.info('Migrate ERROR: ' + str(self.sxpr()))
|
||||
eserver.inject('xend.migrate.error', self.sxpr())
|
||||
eserver.inject('xend.domain.migrate',
|
||||
[ self.dominfo.name, self.dominfo.id,
|
||||
self.state, self.sxpr() ])
|
||||
|
||||
class XendSaveInfo(XfrdInfo):
|
||||
"""Representation of a save in-progress and its interaction with xfrd.
|
||||
"""
|
||||
|
||||
def __init__(self, xid, dom, file):
|
||||
def __init__(self, xid, dominfo, file):
|
||||
XfrdInfo.__init__(self)
|
||||
self.xid = xid
|
||||
self.dominfo = dominfo
|
||||
self.state = 'begin'
|
||||
self.src_dom = dom
|
||||
self.src_dom = dominfo.id
|
||||
self.file = file
|
||||
self.start = 0
|
||||
|
||||
@@ -347,7 +352,9 @@ class XendSaveInfo(XfrdInfo):
|
||||
return
|
||||
print '***request> begin'
|
||||
log.info('Save BEGIN: ' + str(self.sxpr()))
|
||||
eserver.inject('xend.save.begin', self.sxpr())
|
||||
eserver.inject('xend.domain.save',
|
||||
[self.dominfo.name, self.dominfo.id,
|
||||
"begin", self.sxpr()])
|
||||
xfrd.request(['xfr.save', self.src_dom, vmconfig, self.file ])
|
||||
|
||||
def xfr_save_ok(self, xfrd, val):
|
||||
@@ -361,12 +368,13 @@ class XendSaveInfo(XfrdInfo):
|
||||
XfrdInfo.connectionLost(self, reason)
|
||||
if self.state =='ok':
|
||||
log.info('Save OK: ' + str(self.sxpr()))
|
||||
eserver.inject('xend.save.ok', self.sxpr())
|
||||
else:
|
||||
self.state = 'error'
|
||||
self.error(XendError("save failed"))
|
||||
log.info('Save ERROR: ' + str(self.sxpr()))
|
||||
eserver.inject('xend.save.error', self.sxpr())
|
||||
eserver.inject('xend.domain.save',
|
||||
[ self.dominfo.name, self.dominfo.id,
|
||||
self.state, self.sxpr() ])
|
||||
|
||||
|
||||
class XendMigrate:
|
||||
@@ -441,27 +449,27 @@ class XendMigrate:
|
||||
reactor.connectTCP('localhost', XFRD_PORT, xcf)
|
||||
return info.deferred
|
||||
|
||||
def migrate_begin(self, dom, host, port=XFRD_PORT, live=0):
|
||||
def migrate_begin(self, dominfo, host, port=XFRD_PORT, live=0):
|
||||
"""Begin to migrate a domain to another host.
|
||||
|
||||
@param dom: domain
|
||||
@param dominfo: domain info
|
||||
@param host: destination host
|
||||
@param port: destination port
|
||||
@return: deferred
|
||||
"""
|
||||
xid = self.nextid()
|
||||
info = XendMigrateInfo(xid, dom, host, port, live)
|
||||
info = XendMigrateInfo(xid, dominfo, host, port, live)
|
||||
return self.session_begin(info)
|
||||
|
||||
def save_begin(self, dom, file):
|
||||
def save_begin(self, dominfo, file):
|
||||
"""Begin saving a domain to file.
|
||||
|
||||
@param dom: domain
|
||||
@param dominfo: domain info
|
||||
@param file: destination file
|
||||
@return: deferred
|
||||
"""
|
||||
xid = self.nextid()
|
||||
info = XendSaveInfo(xid, dom, file)
|
||||
info = XendSaveInfo(xid, dominfo, file)
|
||||
return self.session_begin(info)
|
||||
|
||||
def instance():
|
||||
|
||||