class SessionTestCase(stubs.XenAPITestBaseNoDB):
+ @mock.patch.object(session.XenAPISession, '_get_platform_version')
@mock.patch.object(session.XenAPISession, '_create_session')
@mock.patch.object(session.XenAPISession, '_get_product_version_and_brand')
@mock.patch.object(session.XenAPISession, '_verify_plugin_version')
def test_session_passes_version(self, mock_verify, mock_version,
- create_session):
+ create_session, mock_platform_version):
sess = mock.Mock()
create_session.return_value = sess
mock_version.return_value = ('version', 'brand')
-
+ mock_platform_version.return_value = (2, 1, 0)
session.XenAPISession('http://someserver', 'username', 'password')
expected_version = '%s %s %s' % (version.vendor_string(),
expected_version,
'OpenStack')
+ @mock.patch.object(session.XenAPISession, '_get_platform_version')
@mock.patch('eventlet.timeout.Timeout')
@mock.patch.object(session.XenAPISession, '_create_session')
@mock.patch.object(session.XenAPISession, '_get_product_version_and_brand')
@mock.patch.object(session.XenAPISession, '_verify_plugin_version')
def test_session_login_with_timeout(self, mock_verify, mock_version,
- create_session, mock_timeout):
+ create_session, mock_timeout,
+ mock_platform_version):
self.flags(connection_concurrent=2, group='xenserver')
sess = mock.Mock()
create_session.return_value = sess
mock_version.return_value = ('version', 'brand')
+ mock_platform_version.return_value = (2, 1, 0)
session.XenAPISession('http://someserver', 'username', 'password')
self.assertEqual(2, sess.login_with_password.call_count)
self.assertEqual(2, mock_timeout.call_count)
+ @mock.patch.object(session.XenAPISession, '_get_platform_version')
@mock.patch('eventlet.timeout.Timeout')
@mock.patch.object(session.XenAPISession, '_create_session')
@mock.patch.object(session.XenAPISession, '_get_product_version_and_brand')
@mock.patch.object(session.XenAPISession, '_get_host_ref')
def test_session_raises_exception(self, mock_ref, mock_uuid,
mock_verify, mock_version,
- create_session, mock_timeout):
+ create_session, mock_timeout,
+ mock_platform_version):
import XenAPI
self.flags(connection_concurrent=2, group='xenserver')
sess = mock.Mock()
sess.login_with_password.side_effect = [
XenAPI.Failure(['HOST_IS_SLAVE', 'master']), None, None]
mock_version.return_value = ('version', 'brand')
+ mock_platform_version.return_value = (2, 1, 0)
session.XenAPISession('http://slave', 'username', 'password')
self.assertEqual(3, sess.login_with_password.call_count)
self.assertEqual(3, mock_timeout.call_count)
+ @mock.patch.object(session.XenAPISession, 'call_plugin')
+ @mock.patch.object(session.XenAPISession, '_get_software_version')
+ @mock.patch.object(session.XenAPISession, '_verify_plugin_version')
+ @mock.patch.object(session.XenAPISession, '_create_session')
+ def test_relax_xsm_sr_check_true(self, mock_create_session,
+ mock_verify_plugin_version,
+ mock_get_software_version,
+ mock_call_plugin):
+ sess = mock.Mock()
+ mock_create_session.return_value = sess
+ mock_get_software_version.return_value = {'product_version': '6.5.0',
+ 'product_brand': 'XenServer',
+ 'platform_version': '1.9.0'}
+ # mark relax-xsm-sr-check=True in /etc/xapi.conf
+ mock_call_plugin.return_value = "True"
+ xenapi_sess = session.XenAPISession(
+ 'http://someserver', 'username', 'password')
+ self.assertTrue(xenapi_sess.is_xsm_sr_check_relaxed())
+
+ @mock.patch.object(session.XenAPISession, 'call_plugin')
+ @mock.patch.object(session.XenAPISession, '_get_software_version')
+ @mock.patch.object(session.XenAPISession, '_verify_plugin_version')
+ @mock.patch.object(session.XenAPISession, '_create_session')
+ def test_relax_xsm_sr_check_XS65_missing(self, mock_create_session,
+ mock_verify_plugin_version,
+ mock_get_software_version,
+ mock_call_plugin):
+ sess = mock.Mock()
+ mock_create_session.return_value = sess
+ mock_get_software_version.return_value = {'product_version': '6.5.0',
+ 'product_brand': 'XenServer',
+ 'platform_version': '1.9.0'}
+ # mark no relax-xsm-sr-check setting in /etc/xapi.conf
+ mock_call_plugin.return_value = ""
+ xenapi_sess = session.XenAPISession(
+ 'http://someserver', 'username', 'password')
+ self.assertFalse(xenapi_sess.is_xsm_sr_check_relaxed())
+
+ @mock.patch.object(session.XenAPISession, 'call_plugin')
+ @mock.patch.object(session.XenAPISession, '_get_software_version')
+ @mock.patch.object(session.XenAPISession, '_verify_plugin_version')
+ @mock.patch.object(session.XenAPISession, '_create_session')
+ def test_relax_xsm_sr_check_XS7_missing(self, mock_create_session,
+ mock_verify_plugin_version,
+ mock_get_software_version,
+ mock_call_plugin):
+ sess = mock.Mock()
+ mock_create_session.return_value = sess
+ mock_get_software_version.return_value = {'product_version': '7.0.0',
+ 'product_brand': 'XenServer',
+ 'platform_version': '2.1.0'}
+ # mark no relax-xsm-sr-check in /etc/xapi.conf
+ mock_call_plugin.return_value = ""
+ xenapi_sess = session.XenAPISession(
+ 'http://someserver', 'username', 'password')
+ self.assertTrue(xenapi_sess.is_xsm_sr_check_relaxed())
+
class ApplySessionHelpersTestCase(stubs.XenAPITestBaseNoDB):
def setUp(self):
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)
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)
yield conn
finally:
conn.close()
+
+ 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