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',
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
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]
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
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))
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]])
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