[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] merge



# HG changeset patch
# User kaf24@xxxxxxxxxxxxxxxxxxxx
# Node ID 0aeb37de0e4ad74902f72c6423f32c1123b51769
# Parent  66dd96e90be4c2a66a98ed67ddd4ee8cec6bd599
# Parent  055efdd6b7c5ed07ac6903923634637793ff9106
merge

diff -r 66dd96e90be4 -r 0aeb37de0e4a tools/python/xen/xend/XendCheckpoint.py
--- a/tools/python/xen/xend/XendCheckpoint.py   Tue Nov  8 02:40:31 2005
+++ b/tools/python/xen/xend/XendCheckpoint.py   Tue Nov  8 10:44:48 2005
@@ -209,9 +209,9 @@
         raise XendError("%s failed" % string.join(cmd))
 
 
-def slurp(file):
+def slurp(infile):
     while 1:
-        line = file.readline()
+        line = infile.readline()
         if line == "":
             break
         else:
diff -r 66dd96e90be4 -r 0aeb37de0e4a tools/python/xen/xend/XendClient.py
--- a/tools/python/xen/xend/XendClient.py       Tue Nov  8 02:40:31 2005
+++ b/tools/python/xen/xend/XendClient.py       Tue Nov  8 10:44:48 2005
@@ -219,6 +219,10 @@
 
     def xend_domain(self, id):
         return self.xendGet(self.domainurl(id))
+
+    def xend_domain_wait_for_devices(self, id):
+        return self.xendPost(self.domainurl(id),
+                             {'op'      : 'wait_for_devices' })
 
     def xend_domain_unpause(self, id):
         return self.xendPost(self.domainurl(id),
diff -r 66dd96e90be4 -r 0aeb37de0e4a tools/python/xen/xend/XendDomainInfo.py
--- a/tools/python/xen/xend/XendDomainInfo.py   Tue Nov  8 02:40:31 2005
+++ b/tools/python/xen/xend/XendDomainInfo.py   Tue Nov  8 10:44:48 2005
@@ -89,6 +89,8 @@
 
 """Minimum time between domain restarts in seconds."""
 MINIMUM_RESTART_TIME = 20
+
+RESTART_IN_PROGRESS = 'xend/restart_in_progress'
 
 
 xc = xen.lowlevel.xc.new()
@@ -895,6 +897,14 @@
         return self.getDeviceController(deviceClass).createDevice(devconfig)
 
 
+    def waitForDevices_(self, deviceClass):
+        return self.getDeviceController(deviceClass).waitForDevices()
+
+
+    def waitForDevice(self, deviceClass, devid):
+        return self.getDeviceController(deviceClass).waitForDevice(devid)
+
+
     def reconfigureDevice(self, deviceClass, devid, devconfig):
         return self.getDeviceController(deviceClass).reconfigureDevice(
             devid, devconfig)
@@ -1230,6 +1240,15 @@
             self.image.createDeviceModel()
 
 
+    def waitForDevices(self):
+        """Wait for this domain's configured devices to connect.
+
+        @raise: VmError if any device fails to initialise.
+        """
+        for c in controllerClasses:
+            self.waitForDevices_(c)
+
+
     def device_create(self, dev_config):
         """Create a new device.
 
@@ -1237,6 +1256,7 @@
         """
         dev_type = sxp.name(dev_config)
         devid = self.createDevice(dev_type, dev_config)
+        self.waitForDevice(dev_type, devid)
 #        self.config.append(['device', dev.getConfig()])
         return self.getDeviceController(dev_type).sxpr(devid)
 
@@ -1269,14 +1289,14 @@
 
         config = self.sxpr()
 
-        if self.readVm('xend/restart_in_progress'):
+        if self.readVm(RESTART_IN_PROGRESS):
             log.error('Xend failed during restart of domain %d.  '
                       'Refusing to restart to avoid loops.',
                       self.domid)
             self.destroy()
             return
 
-        self.writeVm('xend/restart_in_progress', 'True')
+        self.writeVm(RESTART_IN_PROGRESS, 'True')
 
         now = time.time()
         rst = self.readVm('xend/previous_restart_time')
@@ -1298,26 +1318,28 @@
                 self.preserveForRestart()
             else:
                 self.destroyDomain()
-                
+
+            # new_dom's VM will be the same as this domain's VM, except where
+            # the rename flag has instructed us to call preserveForRestart.
+            # In that case, it is important that we remove the
+            # RESTART_IN_PROGRESS node from the new domain, not the old one,
+            # once the new one is available.
+
+            new_dom = None
             try:
                 xd = get_component('xen.xend.XendDomain')
                 new_dom = xd.domain_create(config)
-                try:
-                    new_dom.unpause()
-                except:
+                new_dom.unpause()
+                new_dom.removeVm(RESTART_IN_PROGRESS)
+            except:
+                if new_dom:
+                    new_dom.removeVm(RESTART_IN_PROGRESS)
                     new_dom.destroy()
-                    raise
-            except:
-                log.exception('Failed to restart domain %d.', self.domid)
-        finally:
-            # new_dom's VM will be the same as this domain's VM, except where
-            # the rename flag has instructed us to call preserveForRestart.
-            # In that case, it is important that we use new_dom.removeVm, not
-            # self.removeVm.
-            new_dom.removeVm('xend/restart_in_progress')
-            
-        # self.configure_bootloader()
-        #        self.exportToDB()
+                else:
+                    self.removeVm(RESTART_IN_PROGRESS)
+                raise
+        except:
+            log.exception('Failed to restart domain %d.', self.domid)
 
 
     def preserveForRestart(self):
diff -r 66dd96e90be4 -r 0aeb37de0e4a 
tools/python/xen/xend/server/DevController.py
--- a/tools/python/xen/xend/server/DevController.py     Tue Nov  8 02:40:31 2005
+++ b/tools/python/xen/xend/server/DevController.py     Tue Nov  8 10:44:48 2005
@@ -62,6 +62,18 @@
 
         self.writeDetails(config, devid, back, front)
 
+        return devid
+
+
+    def waitForDevices(self):
+        log.debug("Waiting for devices %s.", self.deviceClass)
+        
+        return map(self.waitForDevice, self.deviceIDs())
+
+
+    def waitForDevice(self, devid):
+        log.debug("Waiting for %s.", devid)
+        
         status, fn_ret = self.waitForBackend(devid)
         if status:
             self.destroyDevice(devid)
@@ -74,7 +86,6 @@
             raise VmError( ("Device %s (%s) could not be connected. "
                             "Backend device not found!") 
                             % (devid, self.deviceClass))
-        return devid
 
 
     def reconfigureDevice(self, devid, config):
@@ -122,10 +133,11 @@
         specified device.  This would be suitable for giving to {@link
         #createDevice} in order to recreate that device."""
 
-        backdomid = int(xstransact.Read(self.frontendPath(devid),
-                                        "backend-id"))
-
-        return [self.deviceClass, ['backend', backdomid]]
+        backdomid = xstransact.Read(self.frontendPath(devid), "backend-id")
+        if backdomid is None:
+            raise VmError("Device %s not connected" % devid)
+        
+        return [self.deviceClass, ['backend', int(backdomid)]]
 
 
     def sxprs(self):
@@ -200,7 +212,10 @@
     def readBackend(self, devid, *args):
         frontpath = self.frontendPath(devid)
         backpath = xstransact.Read(frontpath, "backend")
-        return xstransact.Read(backpath, *args)
+        if backpath:
+            return xstransact.Read(backpath, *args)
+        else:
+            raise VmError("Device %s not connected" % devid)
 
 
     def deviceIDs(self):
@@ -242,6 +257,8 @@
         frontpath = self.frontendPath(devid)
         backpath  = self.backendPath(backdom, devid)
         
+        xstransact.Remove(backpath, HOTPLUG_STATUS_NODE)
+
         frontDetails.update({
             'backend' : backpath,
             'backend-id' : "%i" % backdom.getDomid()
@@ -266,7 +283,10 @@
         ev = Event()
 
         def hotplugStatus():
-            status = self.readBackend(devid, HOTPLUG_STATUS_NODE)
+            try:
+                status = self.readBackend(devid, HOTPLUG_STATUS_NODE)
+            except VmError:
+                status = "died"
             if status is not None:
                 watch.xs.unwatch(backpath, watch)
                 hotplugStatus.value = status
@@ -276,14 +296,16 @@
         frontpath = self.frontendPath(devid)
         backpath = xstransact.Read(frontpath, "backend")
 
-        watch = xswatch(backpath, hotplugStatus)
-
-        ev.wait(DEVICE_CREATE_TIMEOUT)
-        if ev.isSet():
-            return (0, hotplugStatus.value)
+        if backpath:
+            watch = xswatch(backpath, hotplugStatus)
+
+            ev.wait(DEVICE_CREATE_TIMEOUT)
+            if ev.isSet():
+                return (0, hotplugStatus.value)
+            else:
+                return (-1, hotplugStatus.value)
         else:
-            return (-1, hotplugStatus.value)
-
+            return (-1, "missing")
 
 
     def backendPath(self, backdom, devid):
diff -r 66dd96e90be4 -r 0aeb37de0e4a tools/python/xen/xend/server/SrvDomain.py
--- a/tools/python/xen/xend/server/SrvDomain.py Tue Nov  8 02:40:31 2005
+++ b/tools/python/xen/xend/server/SrvDomain.py Tue Nov  8 10:44:48 2005
@@ -13,13 +13,13 @@
 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 #============================================================================
 # Copyright (C) 2004, 2005 Mike Wray <mike.wray@xxxxxx>
+# Copyright (C) 2005 Xensource Ltd
 #============================================================================
 
 from xen.web import http
 
 from xen.xend import sxp
 from xen.xend import XendDomain
-from xen.xend import PrettyPrint
 from xen.xend.Args import FormFn
 
 from xen.web.SrvDir import SrvDir
@@ -33,7 +33,7 @@
         self.dom = dom
         self.xd = XendDomain.instance()
 
-    def op_configure(self, op, req):
+    def op_configure(self, _, req):
         """Configure an existing domain.
         Configure is unusual in that it requires a domain id,
         not a domain name.
@@ -43,11 +43,11 @@
                      ['config', 'sxpr']])
         return fn(req.args, {'dom': self.dom.domid})
 
-    def op_unpause(self, op, req):
+    def op_unpause(self, _1, _2):
         val = self.xd.domain_unpause(self.dom.domid)
         return val
         
-    def op_pause(self, op, req):
+    def op_pause(self, _1, _2):
         val = self.xd.domain_pause(self.dom.domid)
         return val
 
@@ -55,15 +55,19 @@
         req.setResponseCode(http.ACCEPTED)
         req.setHeader("Location", "%s/.." % req.prePathURL())
 
-    def op_shutdown(self, op, req):
+    def op_shutdown(self, _, req):
         self.acceptCommand(req)
         return self.dom.shutdown(req.args['reason'][0])
 
-    def op_sysrq(self, op, req):
+    def op_sysrq(self, _, req):
         self.acceptCommand(req)
         return self.dom.send_sysrq(int(req.args['key'][0]))
 
-    def op_destroy(self, op, req):
+    def op_wait_for_devices(self, _, req):
+        self.acceptCommand(req)
+        return self.dom.waitForDevices()
+
+    def op_destroy(self, _, req):
         self.acceptCommand(req)
         return self.xd.domain_destroy(self.dom.domid)
 
@@ -71,13 +75,13 @@
         self.acceptCommand(req)
         return req.threadRequest(self.do_save, op, req)
 
-    def do_save(self, op, req):
+    def do_save(self, _, req):
         return self.xd.domain_save(self.dom.domid, req.args['file'][0])
 
     def op_migrate(self, op, req):
         return req.threadRequest(self.do_migrate, op, req)
     
-    def do_migrate(self, op, req):
+    def do_migrate(self, _, req):
         fn = FormFn(self.xd.domain_migrate,
                     [['dom',         'int'],
                      ['destination', 'str'],
@@ -85,7 +89,7 @@
                      ['resource',    'int']])
         return fn(req.args, {'dom': self.dom.domid})
 
-    def op_pincpu(self, op, req):
+    def op_pincpu(self, _, req):
         fn = FormFn(self.xd.domain_pincpu,
                     [['dom', 'int'],
                      ['vcpu', 'int'],
@@ -93,7 +97,7 @@
         val = fn(req.args, {'dom': self.dom.domid})
         return val
 
-    def op_cpu_bvt_set(self, op, req):
+    def op_cpu_bvt_set(self, _, req):
         fn = FormFn(self.xd.domain_cpu_bvt_set,
                     [['dom',       'int'],
                      ['mcuadv',    'int'],
@@ -105,14 +109,14 @@
         return val
     
     
-    def op_cpu_sedf_get(self, op, req):
+    def op_cpu_sedf_get(self, _, req):
         fn = FormFn(self.xd.domain_cpu_sedf_get,
                     [['dom', 'int']])
         val = fn(req.args, {'dom': self.dom.domid})
         return val
 
 
-    def op_cpu_sedf_set(self, op, req):
+    def op_cpu_sedf_set(self, _, req):
         fn = FormFn(self.xd.domain_cpu_sedf_set,
                     [['dom', 'int'],
                      ['period', 'int'],
@@ -123,7 +127,7 @@
         val = fn(req.args, {'dom': self.dom.domid})
         return val
 
-    def op_maxmem_set(self, op, req):
+    def op_maxmem_set(self, _, req):
         fn = FormFn(self.xd.domain_maxmem_set,
                     [['dom',    'int'],
                      ['memory', 'int']])
@@ -135,35 +139,35 @@
         return FormFn(fn, args)(req.args)
 
 
-    def op_mem_target_set(self, op, req):
+    def op_mem_target_set(self, _, req):
         return self.call(self.dom.setMemoryTarget,
                          [['target', 'int']],
                          req)
 
-    def op_devices(self, op, req):
+    def op_devices(self, _, req):
         return self.call(self.dom.getDeviceSxprs,
                          [['type', 'str']],
                          req)
 
-    def op_device_create(self, op, req):
+    def op_device_create(self, _, req):
         return self.call(self.dom.device_create,
                          [['config', 'sxpr']],
                          req)
 
-    def op_device_destroy(self, op, req):
+    def op_device_destroy(self, _, req):
         return self.call(self.dom.destroyDevice,
                          [['type', 'str'],
                           ['dev',  'str']],
                          req)
                 
-    def op_device_configure(self, op, req):
+    def op_device_configure(self, _, req):
         return self.call(self.dom.device_configure,
                          [['config', 'sxpr'],
                           ['dev',    'str']],
                          req)
 
 
-    def op_vif_limit_set(self, op, req):
+    def op_vif_limit_set(self, _, req):
         fn = FormFn(self.xd.domain_vif_limit_set,
                     [['dom',    'int'],
                      ['vif',    'int'],
@@ -172,7 +176,7 @@
         val = fn(req.args, {'dom': self.dom.domid})
         return val
 
-    def op_set_vcpus(self, op, req):
+    def op_set_vcpus(self, _, req):
         return self.call(self.dom.setVCpuCount,
                          [['vcpus', 'int']],
                          req)
diff -r 66dd96e90be4 -r 0aeb37de0e4a tools/python/xen/xend/server/params.py
--- a/tools/python/xen/xend/server/params.py    Tue Nov  8 02:40:31 2005
+++ b/tools/python/xen/xend/server/params.py    Tue Nov  8 10:44:48 2005
@@ -44,8 +44,3 @@
 XEND_USER          = 'root'
 XEND_DEBUG         = getenv("XEND_DEBUG",     0, conv=int)
 XEND_DAEMONIZE     = getenv("XEND_DAEMONIZE", not XEND_DEBUG, conv=int)
-
-XENSTORED_PID_FILE = '/var/run/xenstored.pid'
-XENSTORED_RUN_DIR  = '/var/run/xenstored'
-XENSTORED_LIB_DIR  = '/var/lib/xenstored'
-XENSTORED_DEBUG    = getenv("XENSTORED_DEBUG", 0, conv=int)
diff -r 66dd96e90be4 -r 0aeb37de0e4a tools/python/xen/xm/create.py
--- a/tools/python/xen/xm/create.py     Tue Nov  8 02:40:31 2005
+++ b/tools/python/xen/xm/create.py     Tue Nov  8 10:44:48 2005
@@ -815,6 +815,10 @@
 
     dom = sxp.child_value(dominfo, 'name')
 
+    if server.xend_domain_wait_for_devices(dom) < 0:
+        server.xend_domain_destroy(dom)
+        err("Device creation failed for domain %s" % dom)
+
     if not opts.vals.paused:
         if server.xend_domain_unpause(dom) < 0:
             server.xend_domain_destroy(dom)

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.