diff -r 9de888d39804 tools/python/xen/xend/XendConfig.py --- a/tools/python/xen/xend/XendConfig.py Thu Mar 13 15:09:50 2008 -0600 +++ b/tools/python/xen/xend/XendConfig.py Thu Mar 13 15:17:51 2008 -0600 @@ -123,14 +123,43 @@ XENAPI_CFG_TO_LEGACY_CFG = { LEGACY_CFG_TO_XENAPI_CFG = reverse_dict(XENAPI_CFG_TO_LEGACY_CFG) -# Platform configuration keys. -XENAPI_PLATFORM_CFG = [ 'acpi', 'apic', 'boot', 'device_model', 'loader', 'display', - 'fda', 'fdb', 'keymap', 'isa', 'localtime', 'monitor', - 'nographic', 'pae', 'rtc_timeoffset', 'serial', 'sdl', - 'soundhw','stdvga', 'usb', 'usbdevice', 'hpet', 'vnc', - 'vncconsole', 'vncdisplay', 'vnclisten', 'timer_mode', - 'vncpasswd', 'vncunused', 'xauthority', 'pci', 'vhpt', - 'guest_os_type', 'hap'] +# Platform configuration keys and their types. +XENAPI_PLATFORM_CFG_TYPES = { + 'acpi': int, + 'apic': int, + 'boot': str, + 'device_model': str, + 'loader': str, + 'display' : str, + 'fda': str, + 'fdb': str, + 'keymap': str, + 'isa' : int, + 'localtime': int, + 'monitor': int, + 'nographic': int, + 'pae' : int, + 'rtc_timeoffset': int, + 'serial': str, + 'sdl': int, + 'soundhw': str, + 'stdvga': int, + 'usb': int, + 'usbdevice': str, + 'hpet': int, + 'vnc': int, + 'vncconsole': int, + 'vncdisplay': int, + 'vnclisten': str, + 'timer_mode': int, + 'vncpasswd': str, + 'vncunused': int, + 'xauthority': str, + 'pci': str, + 'vhpt': int, + 'guest_os_type': str, + 'hap': int, +} # Xen API console 'other_config' keys. XENAPI_CONSOLE_OTHER_CFG = ['vncunused', 'vncdisplay', 'vnclisten', @@ -540,7 +569,7 @@ class XendConfig(dict): cfg['platform']['localtime'] = localtime # Compatibility hack -- can go soon. - for key in XENAPI_PLATFORM_CFG: + for key in XENAPI_PLATFORM_CFG_TYPES.keys(): val = sxp.child_value(sxp_cfg, "platform_" + key, None) if val is not None: self['platform'][key] = val @@ -719,7 +748,7 @@ class XendConfig(dict): self.update_with_image_sxp(image_sxp) # Convert Legacy HVM parameters to Xen API configuration - for key in XENAPI_PLATFORM_CFG: + for key in XENAPI_PLATFORM_CFG_TYPES.keys(): if key in cfg: self['platform'][key] = cfg[key] @@ -769,7 +798,7 @@ class XendConfig(dict): if image_type != 'hvm' and image_type != 'linux': self['platform']['image_type'] = image_type - for key in XENAPI_PLATFORM_CFG: + for key in XENAPI_PLATFORM_CFG_TYPES.keys(): val = sxp.child_value(image_sxp, key, None) if val is not None and val != '': self['platform'][key] = val @@ -853,6 +882,19 @@ class XendConfig(dict): self[key] = type_conv(val) else: self[key] = val + + # XenAPI defines platform as a string-string map. If platform + # configuration exists, convert values to appropriate type. + if 'platform' in xapi: + for key, val in xapi['platform'].items(): + type_conv = XENAPI_PLATFORM_CFG_TYPES.get(key) + if type_conv is None: + key = key.lower() + type_conv = XENAPI_PLATFORM_CFG_TYPES.get(key) + if callable(type_conv): + self['platform'][key] = type_conv(val) + else: + self['platform'][key] = val self['vcpus_params']['weight'] = \ int(self['vcpus_params'].get('weight', 256)) @@ -1531,7 +1573,7 @@ class XendConfig(dict): if self.has_key('PV_args') and self['PV_args']: image.append(['args', self['PV_args']]) - for key in XENAPI_PLATFORM_CFG: + for key in XENAPI_PLATFORM_CFG_TYPES.keys(): if key in self['platform']: image.append([key, self['platform'][key]]) @@ -1567,7 +1609,7 @@ class XendConfig(dict): self['PV_ramdisk'] = sxp.child_value(image_sxp, 'ramdisk','') self['PV_args'] = kernel_args - for key in XENAPI_PLATFORM_CFG: + for key in XENAPI_PLATFORM_CFG_TYPES.keys(): val = sxp.child_value(image_sxp, key, None) if val is not None and val != '': self['platform'][key] = val