WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-changelog

[Xen-changelog] [xen-unstable] Fix device reordering that occurs when th

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] [xen-unstable] Fix device reordering that occurs when the config gets read into dictionaries.
From: Xen patchbot-unstable <patchbot-unstable@xxxxxxxxxxxxxxxxxxx>
Date: Thu, 25 Jan 2007 08:55:37 -0800
Delivery-date: Thu, 25 Jan 2007 09:50:44 -0800
Envelope-to: www-data@xxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-changelog-request@lists.xensource.com?subject=help>
List-id: BK change log <xen-changelog.lists.xensource.com>
List-post: <mailto:xen-changelog@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=unsubscribe>
Reply-to: xen-devel@xxxxxxxxxxxxxxxxxxx
Sender: xen-changelog-bounces@xxxxxxxxxxxxxxxxxxx
# 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

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-changelog] [xen-unstable] Fix device reordering that occurs when the config gets read into dictionaries., Xen patchbot-unstable <=