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

[Xen-changelog] [xen-unstable] Fix device reordering that occurs when the config gets read into dictionaries.



# HG changeset patch
# User Ewan Mellor <ewan@xxxxxxxxxxxxx>
# Date 1169657321 0
# Node ID 959e79bfe91313effd162f02ad331e35c0e1a1b7
# Parent  30af6cfdb05c6e56b3024e8be4abb3a10fc41297
Fix device reordering that occurs when the config gets read into dictionaries.

Signed-off-by: Ewan Mellor <ewan@xxxxxxxxxxxxx>
---
 tools/python/xen/xend/XendConfig.py            |   42 ++++++++++---------
 tools/python/xen/xend/XendDomainInfo.py        |    6 +-
 tools/python/xen/xend/image.py                 |   55 +++++++++++++------------
 tools/python/xen/xend/tests/test_XendConfig.py |   42 +++++++++++++++++++
 4 files changed, 97 insertions(+), 48 deletions(-)

diff -r 30af6cfdb05c -r 959e79bfe913 tools/python/xen/xend/XendConfig.py
--- a/tools/python/xen/xend/XendConfig.py       Wed Jan 24 16:33:19 2007 +0000
+++ b/tools/python/xen/xend/XendConfig.py       Wed Jan 24 16:48:41 2007 +0000
@@ -654,19 +654,11 @@ class XendConfig(dict):
 
         # set device references in the configuration
         self['devices'] = cfg.get('devices', {})
-        
-        self['console_refs'] = []
-        self['vif_refs'] = []
-        self['vbd_refs'] = []
-        self['vtpm_refs'] = []
-        for dev_uuid, (dev_type, dev_info) in self['devices'].items():
-            if dev_type == 'vif':
-                self['vif_refs'].append(dev_uuid)
-            elif dev_type in ('vbd','tap'):
-                self['vbd_refs'].append(dev_uuid)
-            elif dev_type in ('vtpm',):
-                self['vtpm_refs'].append(dev_uuid)
-        
+        self['console_refs'] = cfg.get('console_refs', [])
+        self['vif_refs'] = cfg.get('vif_refs', [])
+        self['vbd_refs'] = cfg.get('vbd_refs', [])
+        self['vtpm_refs'] = cfg.get('vtpm_refs', [])
+
 
     def _sxp_to_xapi_unsupported(self, sxp_cfg):
         """Read in an SXP configuration object and populate
@@ -989,8 +981,8 @@ class XendConfig(dict):
                 
                 dev_uuid = cfg_xenapi.get('uuid', uuid.createString())
                 dev_info['uuid'] = dev_uuid
-                self['devices'][dev_uuid] = (dev_type, dev_info)
-                self['vif_refs'].append(dev_uuid)
+                target['devices'][dev_uuid] = (dev_type, dev_info)
+                target['vif_refs'].append(dev_uuid)
                 return dev_uuid
             
             elif dev_type in ('vbd', 'tap'):
@@ -1013,8 +1005,8 @@ class XendConfig(dict):
 
                 dev_uuid = cfg_xenapi.get('uuid', uuid.createString())
                 dev_info['uuid'] = dev_uuid
-                self['devices'][dev_uuid] = (dev_type, dev_info)
-                self['vbd_refs'].append(dev_uuid)                
+                target['devices'][dev_uuid] = (dev_type, dev_info)
+                target['vbd_refs'].append(dev_uuid)                
                 return dev_uuid
 
             elif dev_type == 'vtpm':
@@ -1023,8 +1015,8 @@ class XendConfig(dict):
 
                 dev_uuid = cfg_xenapi.get('uuid', uuid.createString())
                 dev_info['uuid'] = dev_uuid
-                self['devices'][dev_uuid] = (dev_type, dev_info)
-                self['vtpm_refs'].append(dev_uuid)
+                target['devices'][dev_uuid] = (dev_type, dev_info)
+                target['vtpm_refs'].append(dev_uuid)
                 return dev_uuid
 
         return ''
@@ -1073,6 +1065,14 @@ class XendConfig(dict):
 
         return sxpr
 
+    def ordered_device_refs(self):
+        result = (self['console_refs'] +
+                  self['vbd_refs'] +
+                  self['vif_refs'] +
+                  self['vtpm_refs'])
+        result.extend([u for u in self['devices'].keys() if u not in result])
+        return result
+
     def all_devices_sxpr(self):
         """Returns the SXPR for all devices in the current configuration."""
         sxprs = []
@@ -1081,7 +1081,9 @@ class XendConfig(dict):
         if 'devices' not in self:
             return sxprs
         
-        for dev_type, dev_info in self['devices'].values():
+        ordered_refs = self.ordered_device_refs()
+        for dev_uuid in ordered_refs:
+            dev_type, dev_info = self['devices'][dev_uuid]
             if dev_type == 'pci': # special case for pci devices
                 sxpr = [['uuid', dev_info['uuid']]]
                 for pci_dev_info in dev_info['devs']:
diff -r 30af6cfdb05c -r 959e79bfe913 tools/python/xen/xend/XendDomainInfo.py
--- a/tools/python/xen/xend/XendDomainInfo.py   Wed Jan 24 16:33:19 2007 +0000
+++ b/tools/python/xen/xend/XendDomainInfo.py   Wed Jan 24 16:48:41 2007 +0000
@@ -1216,8 +1216,10 @@ class XendDomainInfo:
 
         @raise: VmError for invalid devices
         """
-        for (devclass, config) in self.info.get('devices', {}).values():
-            if devclass in XendDevices.valid_devices():            
+        ordered_refs = self.info.ordered_device_refs()
+        for dev_uuid in ordered_refs:
+            devclass, config = self.info['devices'][dev_uuid]
+            if devclass in XendDevices.valid_devices():
                 log.info("createDevice: %s : %s" % (devclass, 
scrub_password(config)))
                 dev_uuid = config.get('uuid')
                 devid = self._createDevice(devclass, config)
diff -r 30af6cfdb05c -r 959e79bfe913 tools/python/xen/xend/image.py
--- a/tools/python/xen/xend/image.py    Wed Jan 24 16:33:19 2007 +0000
+++ b/tools/python/xen/xend/image.py    Wed Jan 24 16:48:41 2007 +0000
@@ -325,7 +325,7 @@ class HVMImageHandler(ImageHandler):
             raise VmError("HVM guest support is unavailable: is VT/AMD-V "
                           "supported by your CPU and enabled in your BIOS?")
 
-        self.dmargs = self.parseDeviceModelArgs(imageConfig, deviceConfig)
+        self.dmargs = self.parseDeviceModelArgs(vmConfig)
         self.device_model = imageConfig['hvm'].get('device_model')
         if not self.device_model:
             raise VmError("hvm: missing device model")
@@ -375,11 +375,11 @@ class HVMImageHandler(ImageHandler):
 
     # Return a list of cmd line args to the device models based on the
     # xm config file
-    def parseDeviceModelArgs(self, imageConfig, deviceConfig):
+    def parseDeviceModelArgs(self, vmConfig):
         dmargs = [ 'boot', 'fda', 'fdb', 'soundhw',
                    'localtime', 'serial', 'stdvga', 'isa',
                    'acpi', 'usb', 'usbdevice', 'keymap' ]
-        hvmDeviceConfig = imageConfig['hvm']['devices']
+        hvmDeviceConfig = vmConfig['image']['hvm']['devices']
 
         ret = ['-vcpus', str(self.vm.getVCpuCount())]
 
@@ -410,29 +410,32 @@ class HVMImageHandler(ImageHandler):
         ret = ret + ["-domain-name", str(self.vm.info['name_label'])]
         nics = 0
         
-        for devuuid, (devtype, devinfo) in deviceConfig.items():
-            if devtype == 'vbd':
-                uname = devinfo.get('uname')
-                if uname is not None and 'file:' in uname:
-                    (_, vbdparam) = string.split(uname, ':', 1)
-                    if not os.path.isfile(vbdparam):
-                        raise VmError('Disk image does not exist: %s' %
-                                      vbdparam)
-            if devtype == 'vif':
-                dtype = devinfo.get('type', 'ioemu')
-                if dtype != 'ioemu':
-                    continue
-                nics += 1
-                mac = devinfo.get('mac')
-                if mac == None:
-                    mac = randomMAC()
-                bridge = devinfo.get('bridge', 'xenbr0')
-                model = devinfo.get('model', 'rtl8139')
-                ret.append("-net")
-                ret.append("nic,vlan=%d,macaddr=%s,model=%s" %
-                           (nics, mac, model))
-                ret.append("-net")
-                ret.append("tap,vlan=%d,bridge=%s" % (nics, bridge))
+        for devuuid in vmConfig['vbd_refs']:
+            devinfo = vmConfig['devices'][devuuid][1]
+            uname = devinfo.get('uname')
+            if uname is not None and 'file:' in uname:
+                (_, vbdparam) = string.split(uname, ':', 1)
+                if not os.path.isfile(vbdparam):
+                    raise VmError('Disk image does not exist: %s' %
+                                  vbdparam)
+
+        for devuuid in vmConfig['vif_refs']:
+            devinfo = vmConfig['devices'][devuuid][1]
+            dtype = devinfo.get('type', 'ioemu')
+            if dtype != 'ioemu':
+                continue
+            nics += 1
+            mac = devinfo.get('mac')
+            if mac is None:
+                mac = randomMAC()
+            bridge = devinfo.get('bridge', 'xenbr0')
+            model = devinfo.get('model', 'rtl8139')
+            ret.append("-net")
+            ret.append("nic,vlan=%d,macaddr=%s,model=%s" %
+                       (nics, mac, model))
+            ret.append("-net")
+            ret.append("tap,vlan=%d,bridge=%s" % (nics, bridge))
+
         return ret
 
     def configVNC(self, imageConfig):
diff -r 30af6cfdb05c -r 959e79bfe913 
tools/python/xen/xend/tests/test_XendConfig.py
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/python/xen/xend/tests/test_XendConfig.py    Wed Jan 24 16:48:41 
2007 +0000
@@ -0,0 +1,42 @@
+import unittest
+
+import xen.xend.XendConfig as XendConfig
+
+
+class test_XendConfig(unittest.TestCase):
+
+    def testParseFromSXP(self):
+        cfg = XendConfig.XendConfig(
+            sxp_obj = (
+            ['vm',
+             ['bootloader_args', '-q --default_args="root=/dev/sda1 ro" 
--extra_args="quiet" /images/VM1.sda'],
+                       ['bootloader', '/usr/bin/pygrub'],
+             ['device', ['vif', ['mac', '00:16:3E:4C:D1:00'], ['script', 
'vif-bridge'], ['bridge', 'xenbr0']]],
+             ['device', ['vif', ['mac', '00:16:3E:48:56:26'], ['script', 
'vif-bridge'], ['bridge', 'vbridge0']]],
+             ['device', ['vbd', ['uname', 'phy:/images/VM1.sda'], ['dev', 
'sda'], ['mode', 'w']]],
+             ['device', ['vbd', ['uname', 'phy:/images/VM1.sdb'], ['dev', 
'sdb'], ['mode', 'w']]],
+             ['memory', '256'], ['name', 'VM1'], ['on_crash', 'restart'],
+             ['uuid', '10927a76-fe27-49b2-8f57-2970b7bbed6c'], ['vcpus', '1']
+             ]))
+
+        self.assertEqual(cfg['uuid'], '10927a76-fe27-49b2-8f57-2970b7bbed6c')
+        self.assertEqual(cfg['name_label'], 'VM1')
+        self.assertEqual(cfg['memory_static_max'], 256)
+
+        ordered_refs = cfg.ordered_device_refs()
+        self.assertEqual(cfg['devices'][ordered_refs[0]][0], 'vbd')
+        self.assertEqual(cfg['devices'][ordered_refs[1]][0], 'vbd')
+        self.assertEqual(cfg['devices'][ordered_refs[2]][0], 'vif')
+        self.assertEqual(cfg['devices'][ordered_refs[3]][0], 'vif')
+        self.assertEqual(cfg['devices'][ordered_refs[0]][1]['uname'],
+                         'phy:/images/VM1.sda')
+        self.assertEqual(cfg['devices'][ordered_refs[1]][1]['uname'],
+                         'phy:/images/VM1.sdb')
+        self.assertEqual(cfg['devices'][ordered_refs[2]][1]['mac'],
+                         '00:16:3E:4C:D1:00')
+        self.assertEqual(cfg['devices'][ordered_refs[3]][1]['mac'],
+                         '00:16:3E:48:56:26')
+
+
+def test_suite():
+    return unittest.makeSuite(test_XendConfig)

_______________________________________________
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®.