diff options
Diffstat (limited to 'tools')
-rw-r--r-- | tools/xenmgr/lib/XendDomain.py | 32 | ||||
-rw-r--r-- | tools/xenmgr/lib/server/SrvConsoleServer.py | 1 | ||||
-rw-r--r-- | tools/xenmgr/lib/server/SrvDomain.py | 4 | ||||
-rwxr-xr-x | tools/xenmgr/lib/server/blkif.py | 33 | ||||
-rwxr-xr-x | tools/xenmgr/lib/server/controller.py | 2 | ||||
-rwxr-xr-x | tools/xenmgr/lib/server/netif.py | 21 |
6 files changed, 80 insertions, 13 deletions
diff --git a/tools/xenmgr/lib/XendDomain.py b/tools/xenmgr/lib/XendDomain.py index 106af33b61..5c31079b2e 100644 --- a/tools/xenmgr/lib/XendDomain.py +++ b/tools/xenmgr/lib/XendDomain.py @@ -42,8 +42,13 @@ class XendDomain: if xroot.get_rebooted(): print 'XendDomain> rebooted: removing all domain info' self.rm_all() + eserver.subscribe('xend.virq', self.onVirq) self.initial_refresh() + def onVirq(self, event, val): + print 'XendDomain> virq', val + self.reap() + def rm_all(self): """Remove all domain info. Used after reboot. """ @@ -136,13 +141,33 @@ class XendDomain: def _delete_domain(self, id, notify=1): if id in self.domain: - self.domain[id].died() if notify: eserver.inject('xend.domain.died', id) del self.domain[id] if id in self.domain_db: del self.domain_db[id] self.db.delete(id) + def reap(self): + print 'reap>' + domlist = xc.domain_getinfo() + casualties = [] + for d in domlist: + print 'dom', d + dead = 0 + dead = dead or (d['crashed'] or d['shutdown']) + dead = dead or (d['dying'] and + not(d['running'] or d['paused'] or d['blocked'])) + if dead: + casualties.append(d) + for d in casualties: + id = str(d['dom']) + print 'died> id=', id, d + dominfo = self.domain.get(id) + if not dominfo: continue + dominfo.died() + self.domain_destroy(id, refresh=0) + print 'reap<' + def refresh(self): """Refresh domain list from Xen. """ @@ -169,6 +194,7 @@ class XendDomain: d.update(dominfo) else: self._delete_domain(d.id) + self.reap() def refresh_domain(self, id): dom = int(id) @@ -232,7 +258,7 @@ class XendDomain: self.refresh() return val - def domain_destroy(self, id): + def domain_destroy(self, id, refresh=1): """Terminate domain immediately. """ dom = int(id) @@ -240,7 +266,7 @@ class XendDomain: return 0 eserver.inject('xend.domain.destroy', id) val = xc.domain_destroy(dom=dom) - self.refresh() + if refresh: self.refresh() return val def domain_migrate(self, id, dst): diff --git a/tools/xenmgr/lib/server/SrvConsoleServer.py b/tools/xenmgr/lib/server/SrvConsoleServer.py index 94b7c8e6c8..f3316fef1c 100644 --- a/tools/xenmgr/lib/server/SrvConsoleServer.py +++ b/tools/xenmgr/lib/server/SrvConsoleServer.py @@ -415,6 +415,7 @@ class VirqClient: def virqReceived(self, virq): print 'VirqClient.virqReceived>', virq + eserver.inject('xend.virq', virq) def lostChannel(self, channel): print 'VirqClient.lostChannel>', channel diff --git a/tools/xenmgr/lib/server/SrvDomain.py b/tools/xenmgr/lib/server/SrvDomain.py index d8287e05ea..44d8f4cf6d 100644 --- a/tools/xenmgr/lib/server/SrvDomain.py +++ b/tools/xenmgr/lib/server/SrvDomain.py @@ -40,14 +40,14 @@ class SrvDomain(SrvDir): def op_save(self, op, req): fn = FormFn(self.xd.domain_save, [['dom', 'int'], - ['dst', 'str']]) + ['file', 'str']]) val = fn(req.args, {'dom': self.dom.id}) return val def op_restore(self, op, req): fn = FormFn(self.xd.domain_restore, [['dom', 'int'], - ['src', 'str']]) + ['file', 'str']]) val = fn(req.args, {'dom': self.dom.id}) return val diff --git a/tools/xenmgr/lib/server/blkif.py b/tools/xenmgr/lib/server/blkif.py index 92706316b1..f23a6d7fa4 100755 --- a/tools/xenmgr/lib/server/blkif.py +++ b/tools/xenmgr/lib/server/blkif.py @@ -1,5 +1,8 @@ from twisted.internet import defer +from xenmgr import sxp +from xenmgr import PrettyPrint + import channel import controller from messages import * @@ -140,11 +143,12 @@ class BlkDev(controller.Dev): return 'w' not in self.mode def sxpr(self): - print 'BlkDev>sxpr>', vars(self) - val = ['blkif', ['vdev', self.vdev], ['mode', self.mode] ] + val = ['blkdev', ['vdev', self.vdev], ['mode', self.mode] ] return val def destroy(self): + print 'BlkDev>destroy>', self.vdev + PrettyPrint.prettyprint(self.sxpr()) self.controller.send_be_vbd_destroy(self.vdev) class BlkifController(controller.Controller): @@ -166,9 +170,18 @@ class BlkifController(controller.Controller): self.recv_fe_interface_connect, } self.attached = 1 + self.evtchn = None self.registerChannel() #print 'BlkifController<', 'dom=', self.dom, 'idx=', self.idx + def sxpr(self): + val = ['blkif', ['dom', self.dom]] + if self.evtchn: + val.append(['evtchn', + self.evtchn['port1'], + self.evtchn['port2']]) + return val + def lostChannel(self): print 'BlkifController>lostChannel>', 'dom=', self.dom #self.destroyDevices() @@ -201,7 +214,9 @@ class BlkifController(controller.Controller): return d def destroy(self): + print 'BlkifController>destroy> dom=', self.dom self.destroyDevices() + self.send_be_destroy() def destroyDevices(self): for dev in self.getDevices(): @@ -229,7 +244,8 @@ class BlkifController(controller.Controller): return self.attached def reattached(self): - """All devices have been reattached after the back-end control domain has changed. + """All devices have been reattached after the back-end control + domain has changed. """ msg = packMsg('blkif_fe_interface_status_changed_t', { 'handle' : 0, @@ -246,6 +262,8 @@ class BlkifController(controller.Controller): def recv_fe_interface_connect(self, msg, req): val = unpackMsg('blkif_fe_interface_connect_t', msg) self.evtchn = channel.eventChannel(0, self.dom) + print 'recv_fe_interface_connect>' + PrettyPrint.prettyprint(self.sxpr()) msg = packMsg('blkif_be_connect_t', { 'domid' : self.dom, 'blkif_handle' : val['handle'], @@ -272,6 +290,13 @@ class BlkifController(controller.Controller): 'blkif_handle' : 0 }) self.factory.writeRequest(msg) + def send_be_destroy(self): + print '>BlkifController>send_be_destroy>', 'dom=', self.dom + msg = packMsg('blkif_be_destroy_t', + { 'domid' : self.dom, + 'blkif_handle' : 0 }) + self.factory.writeRequest(msg) + def send_be_vbd_create(self, vdev): dev = self.devices[vdev] msg = packMsg('blkif_be_vbd_create_t', @@ -293,6 +318,8 @@ class BlkifController(controller.Controller): self.factory.writeRequest(msg) def send_be_vbd_destroy(self, vdev): + print '>BlkifController>send_be_vbd_destroy>', 'dom=', self.dom, 'vdev=', vdev + PrettyPrint.prettyprint(self.sxpr()) dev = self.devices[vdev] msg = packMsg('blkif_be_vbd_destroy_t', { 'domid' : self.dom, diff --git a/tools/xenmgr/lib/server/controller.py b/tools/xenmgr/lib/server/controller.py index cb543fa57c..08afdfd634 100755 --- a/tools/xenmgr/lib/server/controller.py +++ b/tools/xenmgr/lib/server/controller.py @@ -132,7 +132,7 @@ class Controller(CtrlMsgRcvr): def close(self): self.deregisterChannel() - self.lostChannel(self) + self.lostChannel() def lostChannel(self): self.factory.instanceClosed(self) diff --git a/tools/xenmgr/lib/server/netif.py b/tools/xenmgr/lib/server/netif.py index d2a6a53860..f999aefcc5 100755 --- a/tools/xenmgr/lib/server/netif.py +++ b/tools/xenmgr/lib/server/netif.py @@ -2,6 +2,8 @@ import random from twisted.internet import defer +from xenmgr import sxp +from xenmgr import PrettyPrint from xenmgr import XendBridge import channel @@ -117,9 +119,13 @@ class NetDev(controller.Dev): def sxpr(self): vif = str(self.vif) mac = ':'.join(map(lambda x: "%x" % x, self.mac)) - val = ['netif', ['vif', vif], ['mac', mac]] + val = ['netdev', ['vif', vif], ['mac', mac]] if self.bridge: - val += ['bridge', self.bridge] + val.append(['bridge', self.bridge]) + if self.evtchn: + val.append(['evtchn', + self.evtchn['port1'], + self.evtchn['port2']]) return val def bridge_add(self, bridge): @@ -131,6 +137,8 @@ class NetDev(controller.Dev): self.bridge = None def destroy(self): + print 'NetDev>destroy>', 'vif=', self.vif + PrettyPrint.prettyprint(self.sxpr()) self.bridge_rem() self.controller.send_be_destroy(self.vif) @@ -155,7 +163,10 @@ class NetifController(controller.Controller): self.registerChannel() #print 'NetifController<', 'dom=', self.dom, 'idx=', self.idx - + def sxpr(self): + val = ['netif', ['dom', self.dom]] + return val + def randomMAC(self): # VIFs get a random MAC address with a "special" vendor id. # @@ -194,6 +205,7 @@ class NetifController(controller.Controller): return dev def destroy(self): + print 'NetifController>destroy>', 'dom=', self.dom self.destroyDevices() def destroyDevices(self): @@ -270,7 +282,8 @@ class NetifController(controller.Controller): self.factory.writeRequest(msg) def send_be_destroy(self, vif): - print 'send_be_destroy>', 'dom=', self.dom, 'vif=', vif + print 'NetifController>send_be_destroy>', 'dom=', self.dom, 'vif=', vif + PrettyPrint.prettyprint(self.sxpr()) dev = self.devices[vif] del self.devices[vif] msg = packMsg('netif_be_destroy_t', |