diff --git a/nova/virt/xenapi/client/session.py b/nova/virt/xenapi/client/session.py index 70e9bec..80bf235 100644 --- a/nova/virt/xenapi/client/session.py +++ b/nova/virt/xenapi/client/session.py @@ -102,8 +102,9 @@ class XenAPISession(object): self.host_ref = self._get_host_ref() self.product_version, self.product_brand = \ self._get_product_version_and_brand() - self._verify_plugin_version() + self.platform_version = self._get_platform_version() + self._cached_xsm_sr_relaxed = None apply_session_helpers(self) @@ -177,6 +178,15 @@ class XenAPISession(object): return product_version, product_brand + def _get_platform_version(self): + """Return a tuple of (major, minor, rev) for the host version""" + software_version = self._get_software_version() + platform_version_str = software_version.get('platform_version', + '0.0.0') + platform_version = versionutils.convert_version_to_tuple( + platform_version_str) + return platform_version + def _get_software_version(self): return self.call_xenapi('host.get_software_version', self.host_ref) @@ -328,3 +338,19 @@ class XenAPISession(object): """ return self.call_xenapi('%s.get_all_records' % record_type).items() + + def is_xsm_sr_check_relaxed(self): + if self._cached_xsm_sr_relaxed is None: + config_value = self.call_plugin('config_file', 'get_val', + key='relax-xsm-sr-check') + if not config_value: + version_str = '.'.join(str(v) for v in self.platform_version) + if versionutils.is_compatible('2.1.0', version_str, + same_major=False): + self._cached_xsm_sr_relaxed = True + else: + self._cached_xsm_sr_relaxed = False + else: + self._cached_xsm_sr_relaxed = config_value.lower() == 'true' + + return self._cached_xsm_sr_relaxed diff --git a/nova/virt/xenapi/vmops.py b/nova/virt/xenapi/vmops.py index 51d9627..1c93eac 100644 --- a/nova/virt/xenapi/vmops.py +++ b/nova/virt/xenapi/vmops.py @@ -2257,7 +2257,7 @@ class VMOps(object): if len(self._get_iscsi_srs(ctxt, instance_ref)) > 0: # XAPI must support the relaxed SR check for live migrating with # iSCSI VBDs - if not self._is_xsm_sr_check_relaxed(): + if not self._session.is_xsm_sr_check_relaxed(): raise exception.MigrationError(reason=_('XAPI supporting ' 'relax-xsm-sr-check=true required'))