Merge "xenapi: Add helper function and unit tests for client session"
This commit is contained in:
@@ -43,6 +43,44 @@ class SessionTestCase(stubs.XenAPITestBaseNoDB):
|
||||
expected_version,
|
||||
'OpenStack')
|
||||
|
||||
@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):
|
||||
self.flags(connection_concurrent=2, group='xenserver')
|
||||
sess = mock.Mock()
|
||||
create_session.return_value = sess
|
||||
mock_version.return_value = ('version', 'brand')
|
||||
|
||||
session.XenAPISession('url', 'username', 'password')
|
||||
self.assertEqual(2, sess.login_with_password.call_count)
|
||||
self.assertEqual(2, mock_timeout.call_count)
|
||||
|
||||
@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')
|
||||
@mock.patch.object(session.XenAPISession, '_get_host_uuid')
|
||||
@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):
|
||||
import XenAPI
|
||||
self.flags(connection_concurrent=2, group='xenserver')
|
||||
sess = mock.Mock()
|
||||
create_session.return_value = sess
|
||||
# First login fails, second login in except block succeeds,
|
||||
# third login for the pool succeeds
|
||||
sess.login_with_password.side_effect = [
|
||||
XenAPI.Failure(['HOST_IS_SLAVE', 'master']), None, None]
|
||||
mock_version.return_value = ('version', 'brand')
|
||||
|
||||
session.XenAPISession('url', 'username', 'password')
|
||||
self.assertEqual(3, sess.login_with_password.call_count)
|
||||
self.assertEqual(3, mock_timeout.call_count)
|
||||
|
||||
|
||||
class ApplySessionHelpersTestCase(stubs.XenAPITestBaseNoDB):
|
||||
def setUp(self):
|
||||
|
@@ -106,6 +106,11 @@ class XenAPISession(object):
|
||||
|
||||
apply_session_helpers(self)
|
||||
|
||||
def _login_with_password(self, user, pw, session, exception):
|
||||
with timeout.Timeout(CONF.xenserver.login_timeout, exception):
|
||||
session.login_with_password(user, pw,
|
||||
self.nova_version, 'OpenStack')
|
||||
|
||||
def _verify_plugin_version(self):
|
||||
requested_version = self.PLUGIN_REQUIRED_VERSION
|
||||
current_version = self.call_plugin_serialized(
|
||||
@@ -118,19 +123,14 @@ class XenAPISession(object):
|
||||
|
||||
def _create_first_session(self, url, user, pw, exception):
|
||||
try:
|
||||
session = self._create_session(url)
|
||||
with timeout.Timeout(CONF.xenserver.login_timeout, exception):
|
||||
session.login_with_password(user, pw,
|
||||
self.nova_version, 'OpenStack')
|
||||
session = self._create_session_and_login(url, user, pw, exception)
|
||||
except self.XenAPI.Failure as e:
|
||||
# if user and pw of the master are different, we're doomed!
|
||||
if e.details[0] == 'HOST_IS_SLAVE':
|
||||
master = e.details[1]
|
||||
url = pool.swap_xapi_host(url, master)
|
||||
session = self.XenAPI.Session(url)
|
||||
with timeout.Timeout(CONF.xenserver.login_timeout, exception):
|
||||
session.login_with_password(user, pw,
|
||||
self.nova_version, 'OpenStack')
|
||||
session = self._create_session_and_login(url, user, pw,
|
||||
exception)
|
||||
self.is_slave = True
|
||||
else:
|
||||
raise
|
||||
@@ -139,10 +139,7 @@ class XenAPISession(object):
|
||||
|
||||
def _populate_session_pool(self, url, user, pw, exception):
|
||||
for i in range(CONF.xenserver.connection_concurrent - 1):
|
||||
session = self._create_session(url)
|
||||
with timeout.Timeout(CONF.xenserver.login_timeout, exception):
|
||||
session.login_with_password(user, pw,
|
||||
self.nova_version, 'OpenStack')
|
||||
session = self._create_session_and_login(url, user, pw, exception)
|
||||
self._sessions.put(session)
|
||||
|
||||
def _get_host_uuid(self):
|
||||
@@ -286,6 +283,11 @@ class XenAPISession(object):
|
||||
return self.XenAPI.xapi_local()
|
||||
return self.XenAPI.Session(url)
|
||||
|
||||
def _create_session_and_login(self, url, user, pw, exception):
|
||||
session = self._create_session(url)
|
||||
self._login_with_password(user, pw, session, exception)
|
||||
return session
|
||||
|
||||
def _unwrap_plugin_exceptions(self, func, *args, **kwargs):
|
||||
"""Parse exception details."""
|
||||
try:
|
||||
|
Reference in New Issue
Block a user