# HG changeset patch
# User kfraser@xxxxxxxxxxxxxxxxxxxxx
# Date 1170865375 0
# Node ID ed9dba8e2c6797a58f447a5857f178d85010e601
# Parent b83a81b99f20a34bad73b3114391b832fa41edf3
Improve hotplug script error reporting via xenstore.
Use this to detect and report up-front in vif-bridge script whether
the bridge device exists or not.
Signed-off-by: Daniel P. Berrange <berrange@xxxxxxxxxx>
---
tools/examples/vif-bridge | 7 ++++
tools/examples/xen-hotplug-common.sh | 5 ++-
tools/python/xen/xend/server/DevController.py | 39 +++++++++++++-------------
3 files changed, 30 insertions(+), 21 deletions(-)
diff -r b83a81b99f20 -r ed9dba8e2c67 tools/examples/vif-bridge
--- a/tools/examples/vif-bridge Wed Feb 07 16:20:28 2007 +0000
+++ b/tools/examples/vif-bridge Wed Feb 07 16:22:55 2007 +0000
@@ -46,6 +46,13 @@ then
fi
fi
+RET=0
+ip link show $bridge 1>/dev/null 2>&1 || RET=1
+if [ "$RET" -eq 1 ]
+then
+ fatal "Could not find bridge device $bridge"
+fi
+
case "$command" in
online)
setup_bridge_port "$vif"
diff -r b83a81b99f20 -r ed9dba8e2c67 tools/examples/xen-hotplug-common.sh
--- a/tools/examples/xen-hotplug-common.sh Wed Feb 07 16:20:28 2007 +0000
+++ b/tools/examples/xen-hotplug-common.sh Wed Feb 07 16:22:55 2007 +0000
@@ -28,14 +28,15 @@ unset $(set | grep ^LC_ | cut -d= -f1)
unset $(set | grep ^LC_ | cut -d= -f1)
fatal() {
- xenstore_write "$XENBUS_PATH"/hotplug-status error
+ xenstore_write "$XENBUS_PATH/hotplug-error" "$*" \
+ "$XENBUS_PATH/hotplug-status" error
log err "$@"
exit 1
}
success() {
# Tell DevController that backend is "connected"
- xenstore_write "$XENBUS_PATH"/hotplug-status connected
+ xenstore_write "$XENBUS_PATH/hotplug-status" connected
}
do_or_die() {
diff -r b83a81b99f20 -r ed9dba8e2c67
tools/python/xen/xend/server/DevController.py
--- a/tools/python/xen/xend/server/DevController.py Wed Feb 07 16:20:28
2007 +0000
+++ b/tools/python/xen/xend/server/DevController.py Wed Feb 07 16:22:55
2007 +0000
@@ -153,9 +153,9 @@ class DevController:
log.debug("Waiting for %s.", devid)
if not self.hotplug:
- return
-
- status = self.waitForBackend(devid)
+ return
+
+ (status, err) = self.waitForBackend(devid)
if status == Timeout:
self.destroyDevice(devid, False)
@@ -165,25 +165,22 @@ class DevController:
elif status == Error:
self.destroyDevice(devid, False)
- raise VmError("Device %s (%s) could not be connected. "
- "Backend device not found." %
- (devid, self.deviceClass))
-
+ if err is None:
+ raise VmError("Device %s (%s) could not be connected. "
+ "Backend device not found." %
+ (devid, self.deviceClass))
+ else:
+ raise VmError("Device %s (%s) could not be connected. "
+ "%s" % (devid, self.deviceClass, err))
elif status == Missing:
# Don't try to destroy the device; it's already gone away.
raise VmError("Device %s (%s) could not be connected. "
"Device not found." % (devid, self.deviceClass))
elif status == Busy:
- err = None
- frontpath = self.frontendPath(devid)
- backpath = xstransact.Read(frontpath, "backend")
- if backpath:
- err = xstransact.Read(backpath, HOTPLUG_ERROR_NODE)
- if not err:
+ self.destroyDevice(devid, False)
+ if err is None:
err = "Busy."
-
- self.destroyDevice(devid, False)
raise VmError("Device %s (%s) could not be connected.\n%s" %
(devid, self.deviceClass, err))
@@ -478,17 +475,21 @@ class DevController:
frontpath = self.frontendPath(devid)
backpath = xstransact.Read(frontpath, "backend")
+
if backpath:
statusPath = backpath + '/' + HOTPLUG_STATUS_NODE
ev = Event()
result = { 'status': Timeout }
-
+
xswatch(statusPath, hotplugStatusCallback, ev, result)
ev.wait(DEVICE_CREATE_TIMEOUT)
- return result['status']
- else:
- return Missing
+
+ err = xstransact.Read(backpath, HOTPLUG_ERROR_NODE)
+
+ return (result['status'], err)
+ else:
+ return (Missing, None)
def backendPath(self, backdom, devid):
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|