aboutsummaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
Diffstat (limited to 'tools')
-rw-r--r--tools/xenmgr/lib/XendDomain.py32
-rw-r--r--tools/xenmgr/lib/server/SrvConsoleServer.py1
-rw-r--r--tools/xenmgr/lib/server/SrvDomain.py4
-rwxr-xr-xtools/xenmgr/lib/server/blkif.py33
-rwxr-xr-xtools/xenmgr/lib/server/controller.py2
-rwxr-xr-xtools/xenmgr/lib/server/netif.py21
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',