[X2Go-Commits] [x2gobroker] 01/03: More load-balancing improvements...
git-admin at x2go.org
git-admin at x2go.org
Wed Dec 10 11:52:32 CET 2014
This is an automated email from the git hooks/post-receive script.
x2go pushed a commit to branch master
in repository x2gobroker.
commit 4a261d742746f973b46d0ffe0afa856916ddbdeb
Author: Mike Gabriel <mike.gabriel at das-netzwerkteam.de>
Date: Wed Dec 10 09:54:36 2014 +0100
More load-balancing improvements...
- When load-balancing, switch to chosen server as remote broker agent before
deploying SSH keys.
- Allow resuming sessions from servers even if one offline server has
left bogus in the session DB (plus unit tests).
---
debian/changelog | 4 ++
x2gobroker/agent.py | 1 -
x2gobroker/brokers/base_broker.py | 25 +++++++----
x2gobroker/tests/test_broker_agent.py | 77 ++++++++++++++++++++++++++++++---
4 files changed, 92 insertions(+), 15 deletions(-)
diff --git a/debian/changelog b/debian/changelog
index 94f5c22..d040e38 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -211,6 +211,10 @@ x2gobroker (0.0.3.0-0x2go1) UNRELEASED; urgency=low
can be switched off via "default-portscan-x2goservers" in x2gobroker.conf
or via "broker-portscan-x2goservers" per session profile. (Fixes:
#692).
+ - When load-balancing, switch to chosen server as remote broker agent before
+ deploying SSH keys.
+ - Allow resuming sessions from servers even if one offline server has
+ left bogus in the session DB (plus unit tests).
* debian/control:
+ Provide separate bin:package for SSH brokerage: x2gobroker-ssh.
+ Replace LDAP support with session brokerage support in LONG_DESCRIPTION.
diff --git a/x2gobroker/agent.py b/x2gobroker/agent.py
index 94c8d1d..8f7ae9e 100644
--- a/x2gobroker/agent.py
+++ b/x2gobroker/agent.py
@@ -220,7 +220,6 @@ def _call_remote_broker_agent(username, task, cmdline_args=[], remote_agent=None
raise x2gobroker.x2gobroker_exceptions.X2GoBrokerAgentException('Could not ping remote X2Go Broker Agent host ({remote_hostname})'.format(remote_hostname=remote_hostname))
-
def ping(remote_agent=None, **kwargs):
"""\
Ping X2Go Broker Agent.
diff --git a/x2gobroker/brokers/base_broker.py b/x2gobroker/brokers/base_broker.py
index afb8ce2..4a6cb00 100644
--- a/x2gobroker/brokers/base_broker.py
+++ b/x2gobroker/brokers/base_broker.py
@@ -1026,7 +1026,7 @@ class X2GoBroker(object):
server_list = server_list[0:-1]
- if remote_agent is None:
+ if not remote_agent:
logger_broker.warning('base_broker.X2GoBroker.get_remote_agent(): failed to allocate any broker agent (query-mode: {query_mode}, remote_agent: {remote_agent})'.format(query_mode=agent_query_mode, remote_agent=remote_agent))
elif agent_query_mode == u'LOCAL':
@@ -1361,8 +1361,8 @@ class X2GoBroker(object):
if server_list:
if not self.get_portscan_x2goservers(profile_id) or x2gobroker.utils.portscan(addr=server_name, port=server_port) or x2gobroker.utils.portscan(addr=server_addr, port=server_port):
selected_session = {
- 'server': server_addr,
- 'port': server_port,
+ u'server': server_addr,
+ u'port': server_port,
}
else:
server_list.remove(server_name)
@@ -1378,15 +1378,15 @@ class X2GoBroker(object):
# carries a zombie session entry (that will disappear when the down X2Go Server comes up again (cleanup
# via x2gocleansessions).
#
- # We have to presume that any running/suspended session we received from the remote agent
- # is gone... Let's assign a new session...
- session_list = []
- session_info = None
+ # Thus, let's ignore this session and check if there is another appropriate session in session_list
+ if session_info is not None:
+ session_list.remove(session_info)
+ session_info = None
if not selected_session and not server_list:
selected_session = {
- 'server': 'no-X2Go-Server-available',
- 'port': server_port,
+ u'server': u'no-X2Go-Server-available',
+ u'port': server_port,
}
# are we resuming a running/suspended session?
@@ -1407,6 +1407,13 @@ class X2GoBroker(object):
# session autologin feature
if remote_agent and self.get_session_autologin(profile_id) and username:
+ # let's use the chosen server_name if remote_agent is reachable via SSH
+ if type(remote_agent) is types.DictType:
+ remote_agent = {
+ u'hostname': selected_session[u'server'],
+ u'port': selected_session[u'port'],
+ }
+
if not pubkey:
# if the broker client has not provided a public SSH key, we will generate one
# this is the OLD style of the auto login feature
diff --git a/x2gobroker/tests/test_broker_agent.py b/x2gobroker/tests/test_broker_agent.py
index 2bdab1e..ba349bc 100644
--- a/x2gobroker/tests/test_broker_agent.py
+++ b/x2gobroker/tests/test_broker_agent.py
@@ -20,6 +20,7 @@
import unittest
import tempfile
import copy
+import time
# Python X2GoBroker modules
import x2gobroker.brokers.inifile_broker as inifile
@@ -33,6 +34,7 @@ class TestX2GoBrokerAgent(unittest.TestCase):
_save_local_broker_agent_call = x2gobroker.agent._call_local_broker_agent
_save_remote_broker_agent_call = x2gobroker.agent._call_remote_broker_agent
_save_portscan = x2gobroker.utils.portscan
+ _save_time_sleep = time.sleep
def _call_testsuite_broker_agent(username, task, cmdline_args=[], remote_agent=None):
@@ -60,16 +62,23 @@ class TestX2GoBrokerAgent(unittest.TestCase):
return True, list_sessions
elif task == 'suspendsession':
- return True
+ return True, []
+
+ elif task == 'ping':
+ return True, []
return False, []
def _fake_portscan(addr, port=22):
return True
+ def _fake_time_sleep(sec):
+ pass
+
x2gobroker.agent._call_local_broker_agent = _call_testsuite_broker_agent
x2gobroker.agent._call_remote_broker_agent = _call_testsuite_broker_agent
x2gobroker.utils.portscan = _fake_portscan
+ time.sleep = _fake_time_sleep
_session_profiles = """
[DEFAULT]
@@ -244,27 +253,39 @@ broker-agent-query-mode = SSH
x2gobroker.agent._call_local_broker_agent = _save_local_broker_agent_call
x2gobroker.agent._call_remote_broker_agent = _save_remote_broker_agent_call
x2gobroker.utils.portscan = _save_portscan
+ time.sleep = _save_time_sleep
def test_broker_agent_replies_with_offline_servers(self):
_save_local_broker_agent_call = x2gobroker.agent._call_local_broker_agent
_save_remote_broker_agent_call = x2gobroker.agent._call_remote_broker_agent
_save_portscan = x2gobroker.utils.portscan
+ _save_time_sleep = time.sleep
+ self.tbarwos_session_suspended = False
def _call_testsuite_broker_agent(username, task, cmdline_args=[], remote_agent=None):
if task == 'listsessions':
list_sessions = []
if username == 'foo4BS1':
- list_sessions = ['30342|foo1S-50-1414759661_stDMATE_dp24|50|host3-with-session|S|2014-10-31T13:47:41|c02c7bbe58677a2726f7e456cb398ae4|127.0.0.1|30001|30002|2014-10-31T13:47:43|foo1S|34|30003|-1|-1',
+ list_sessions = ['30342|foo4BS1-50-1414759661_stDMATE_dp24|50|host3-with-session|S|2014-10-31T13:47:41|c02c7bbe58677a2726f7e456cb398ae4|127.0.0.1|30001|30002|2014-10-31T13:47:43|foo4BS1|34|30003|-1|-1',
]
elif username == 'foo4BS2':
+ list_sessions = ['30342|foo4BS2-50-1414759661_stDMATE_dp24|50|downhost1-with-session|S|2014-10-31T13:47:41|c02c7bbe58677a2726f7e456cb398ae4|127.0.0.1|30001|30002|2014-10-31T13:47:43|foo4BS2|34|30003|-1|-1',
+ ]
+ elif username == 'foo4BS3':
+ list_sessions = ['30342|foo1S-50-1414759661_stDMATE_dp24|50|downhost1-with-session|R|2014-10-31T13:47:41|c02c7bbe58677a2726f7e456cb398ae4|127.0.0.1|30001|30002|2014-10-31T13:47:43|foo1S|34|30003|-1|-1',
+ '30342|foo1S-50-1414759661_stDMATE_dp24|50|host3-with-session|S|2014-10-30T13:47:41|c02c7bbe58677a2726f7e456cb398ae4|127.0.0.1|30001|30002|2014-10-31T13:47:43|foo1S|1474|30003|-1|-1',
+ ]
+ elif username == 'foo4BS4':
list_sessions = ['30342|foo1S-50-1414759661_stDMATE_dp24|50|downhost1-with-session|S|2014-10-31T13:47:41|c02c7bbe58677a2726f7e456cb398ae4|127.0.0.1|30001|30002|2014-10-31T13:47:43|foo1S|34|30003|-1|-1',
+ '30342|foo1S-50-1414759661_stDMATE_dp24|50|host3-with-session|R|2014-10-30T13:47:41|c02c7bbe58677a2726f7e456cb398ae4|127.0.0.1|30001|30002|2014-10-31T13:47:43|foo1S|1474|30003|-1|-1',
]
return True, list_sessions
elif task == 'suspendsession':
- return True
+ self.tbarwos_session_suspended = True
+ return True, []
elif task == 'findbusyservers':
busy_servers = []
@@ -274,14 +295,24 @@ broker-agent-query-mode = SSH
'2:host2.internal',
'1:host3.internal',
]
- elif username == 'foo4BS1':
+ elif username in ('foo4BS1', 'foo4BS2', 'foo4BS3'):
busy_servers = [
'2:downhost1-with-session.internal',
'1:host2.internal',
'3:host3-with-session.internal',
]
+ elif username in ('foo5BS1'):
+ busy_servers = [
+ '2:downhost1-with-session.internal',
+ '1:host2.internal',
+ '3:host3-with-session.internal',
+ '0:host4.internal',
+ ]
return True, busy_servers
+ elif task == 'ping':
+ return True, []
+
return False, []
def _fake_portscan(addr, port=22):
@@ -291,9 +322,13 @@ broker-agent-query-mode = SSH
return False
return True
+ def _fake_time_sleep(sec):
+ pass
+
x2gobroker.agent._call_local_broker_agent = _call_testsuite_broker_agent
x2gobroker.agent._call_remote_broker_agent = _call_testsuite_broker_agent
x2gobroker.utils.portscan = _fake_portscan
+ time.sleep = _fake_time_sleep
_session_profiles = """
[DEFAULT]
@@ -325,6 +360,13 @@ host = downhost1-with-session.internal, host2.internal, host3-with-session.inter
broker-agent-query-mode = LOCAL
broker-portscan-x2goservers = true
+[testprofile5]
+name = testprofile5
+host = downhost1-with-session.internal, host2.internal, host3-with-session.internal, host4.internal
+broker-agent-query-mode = SSH
+broker-portscan-x2goservers = true
+broker-autologin = true
+
"""
tf = tempfile.NamedTemporaryFile()
print >> tf, _session_profiles
@@ -353,7 +395,7 @@ broker-portscan-x2goservers = true
while i < 10:
_session4 = inifile_backend.select_session('testprofile4', username='foo4BS1')
self.assertTrue ( _session4['server'] == 'host3-with-session.internal')
- self.assertTrue ( _session4['session_info'] == '30342|foo1S-50-1414759661_stDMATE_dp24|50|host3-with-session|S|2014-10-31T13:47:41|c02c7bbe58677a2726f7e456cb398ae4|127.0.0.1|30001|30002|2014-10-31T13:47:43|foo1S|34|30003|-1|-1' )
+ self.assertTrue ( _session4['session_info'] == '30342|foo4BS1-50-1414759661_stDMATE_dp24|50|host3-with-session|S|2014-10-31T13:47:41|c02c7bbe58677a2726f7e456cb398ae4|127.0.0.1|30001|30002|2014-10-31T13:47:43|foo4BS1|34|30003|-1|-1' )
i += 1
i = 0
@@ -363,9 +405,34 @@ broker-portscan-x2goservers = true
self.assertFalse ( _session4.has_key('session_info') )
i += 1
+ i = 0
+ while i < 10:
+ _session4 = inifile_backend.select_session('testprofile4', username='foo4BS3')
+ self.assertTrue ( _session4['server'] == 'host3-with-session.internal')
+ self.assertTrue ( _session4['session_info'] == '30342|foo1S-50-1414759661_stDMATE_dp24|50|host3-with-session|S|2014-10-30T13:47:41|c02c7bbe58677a2726f7e456cb398ae4|127.0.0.1|30001|30002|2014-10-31T13:47:43|foo1S|1474|30003|-1|-1' )
+ i += 1
+
+ i = 0
+ while i < 10:
+ _session4 = inifile_backend.select_session('testprofile4', username='foo4BS4')
+ self.assertTrue ( _session4['server'] == 'host3-with-session.internal')
+ self.assertTrue ( _session4['session_info'] == '30342|foo1S-50-1414759661_stDMATE_dp24|50|host3-with-session|S|2014-10-30T13:47:41|c02c7bbe58677a2726f7e456cb398ae4|127.0.0.1|30001|30002|2014-10-31T13:47:43|foo1S|1474|30003|-1|-1' )
+ self.assertTrue ( self.tbarwos_session_suspended )
+ self.tbarwos_session_suspended = False
+ i += 1
+
+ i = 0
+ while i < 10:
+ _session5 = inifile_backend.select_session('testprofile5', username='foo5BS1')
+ print _session5
+ self.assertTrue ( _session5['server'] == 'host4.internal')
+ self.assertFalse ( _session5.has_key('session_info') )
+ i += 1
+
x2gobroker.agent._call_local_broker_agent = _save_local_broker_agent_call
x2gobroker.agent._call_remote_broker_agent = _save_remote_broker_agent_call
x2gobroker.utils.portscan = _save_portscan
+ time.sleep = _save_time_sleep
def test_suite():
--
Alioth's /srv/git/_hooks_/post-receive-email on /srv/git/code.x2go.org/x2gobroker.git
More information about the x2go-commits
mailing list