This is an automated email from the git hooks/post-receive script. x2go pushed a change to branch master in repository x2gobroker. from e4be2b0 Don't return X2Go Servers that are actually down, currently. new 4a261d7 More load-balancing improvements... new b882b5e remove debug output new a9bc46b Fix remote agent detection if one ore more X2Go Servers are offline and hostname does not match host address (plus unit test). The 3 revisions listed above as "new" are entirely new to this repository and will be described in separate emails. The revisions listed as "adds" were already present in the repository and have only been added to this reference. Summary of changes: debian/changelog | 6 ++ x2gobroker/agent.py | 22 +++--- x2gobroker/brokers/base_broker.py | 43 +++++++---- x2gobroker/tests/test_broker_agent.py | 135 ++++++++++++++++++++++++++++++--- 4 files changed, 171 insertions(+), 35 deletions(-) -- Alioth's /srv/git/_hooks_/post-receive-email on /srv/git/code.x2go.org/x2gobroker.git
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@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
This is an automated email from the git hooks/post-receive script. x2go pushed a commit to branch master in repository x2gobroker. commit b882b5e61924336622336ad76b1635059defa7e6 Author: Mike Gabriel <mike.gabriel@das-netzwerkteam.de> Date: Wed Dec 10 11:51:01 2014 +0100 remove debug output --- x2gobroker/tests/test_broker_agent.py | 1 - 1 file changed, 1 deletion(-) diff --git a/x2gobroker/tests/test_broker_agent.py b/x2gobroker/tests/test_broker_agent.py index ba349bc..a7cc26c 100644 --- a/x2gobroker/tests/test_broker_agent.py +++ b/x2gobroker/tests/test_broker_agent.py @@ -424,7 +424,6 @@ broker-autologin = true 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 -- Alioth's /srv/git/_hooks_/post-receive-email on /srv/git/code.x2go.org/x2gobroker.git
This is an automated email from the git hooks/post-receive script. x2go pushed a commit to branch master in repository x2gobroker. commit a9bc46b1a69ad769aa04f7bd9d24efd795d9d73e Author: Mike Gabriel <mike.gabriel@das-netzwerkteam.de> Date: Wed Dec 10 11:52:08 2014 +0100 Fix remote agent detection if one ore more X2Go Servers are offline and hostname does not match host address (plus unit test). --- debian/changelog | 2 ++ x2gobroker/agent.py | 21 ++++++------ x2gobroker/brokers/base_broker.py | 20 +++++++---- x2gobroker/tests/test_broker_agent.py | 59 ++++++++++++++++++++++++++++++--- 4 files changed, 81 insertions(+), 21 deletions(-) diff --git a/debian/changelog b/debian/changelog index d040e38..ad3eb5e 100644 --- a/debian/changelog +++ b/debian/changelog @@ -215,6 +215,8 @@ x2gobroker (0.0.3.0-0x2go1) UNRELEASED; urgency=low deploying SSH keys. - Allow resuming sessions from servers even if one offline server has left bogus in the session DB (plus unit tests). + - Fix remote agent detection if one ore more X2Go Servers are offline and + hostname does not match host address (plus unit test). * 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 8f7ae9e..56c66fd 100644 --- a/x2gobroker/agent.py +++ b/x2gobroker/agent.py @@ -164,17 +164,17 @@ def _call_remote_broker_agent(username, task, cmdline_args=[], remote_agent=None """ if remote_agent is None: - logger_error.error('With the SSH agent-query-mode a remote agent host (hostname, port) has to be specified!') + logger_error.error('With the SSH agent-query-mode a remote agent host (hostname, hostaddr, port) has to be specified!') elif not remote_agent.has_key('host_key_policy'): remote_agent['host_key_policy'] = paramiko.WarningPolicy() - remote_hostname = remote_agent[u'hostname'] + remote_hostaddr = remote_agent[u'hostaddr'] if remote_agent.has_key(u'port'): remote_port = int(remote_agent[u'port']) else: remote_port = 22 - if x2gobroker.utils.portscan(remote_hostname, remote_port): + if x2gobroker.utils.portscan(remote_hostaddr, remote_port): cmd_line = [ '{x2gobroker_agent_binary}'.format(x2gobroker_agent_binary=x2gobroker.defaults.X2GOBROKER_AGENT_CMD), '{username}'.format(username=username), @@ -192,7 +192,7 @@ def _call_remote_broker_agent(username, task, cmdline_args=[], remote_agent=None if os.path.exists(os.path.expanduser("~/.ssh/known_hosts")): client.load_host_keys(os.path.expanduser("~/.ssh/known_hosts")) client.set_missing_host_key_policy(remote_agent['host_key_policy']) - client.connect(remote_hostname, remote_port, remote_username, look_for_keys=True, allow_agent=True) + client.connect(remote_hostaddr, remote_port, remote_username, look_for_keys=True, allow_agent=True) result = [] ssh_transport = client.get_transport() @@ -213,11 +213,11 @@ def _call_remote_broker_agent(username, task, cmdline_args=[], remote_agent=None else: return (False, []) except paramiko.AuthenticationException: - raise x2gobroker.x2gobroker_exceptions.X2GoBrokerAgentException('Authentication to remote X2Go Broker Agent Host failed (user: {user}, hostname: {hostname}, port: {port}) failed'.format(user=remote_username, hostname=remote_hostname, port=remote_port)) + raise x2gobroker.x2gobroker_exceptions.X2GoBrokerAgentException('Authentication to remote X2Go Broker Agent Host failed (user: {user}, hostname: {hostname}, host address: {hostaddr}, port: {port}) failed'.format(user=remote_username, hostname=remote_hostname, hostaddr=remote_hostaddr, port=remote_port)) except (paramiko.SSHException, paramiko.BadHostKeyException, socket.error): - raise x2gobroker.x2gobroker_exceptions.X2GoBrokerAgentException('Query to remote X2Go Broker Agent (user: {user}, hostname: {hostname}, port: {port}) failed'.format(user=remote_username, hostname=remote_hostname, port=remote_port)) + raise x2gobroker.x2gobroker_exceptions.X2GoBrokerAgentException('Query to remote X2Go Broker Agent (user: {user}, hostname: {hostname}, host address: {hostaddr}, port: {port}) failed'.format(user=remote_username, hostname=remote_hostname, hostaddr=remote_hostaddr, port=remote_port)) else: - raise x2gobroker.x2gobroker_exceptions.X2GoBrokerAgentException('Could not ping remote X2Go Broker Agent host ({remote_hostname})'.format(remote_hostname=remote_hostname)) + raise x2gobroker.x2gobroker_exceptions.X2GoBrokerAgentException('Could not ping remote X2Go Broker Agent host: {hostname} ({hostaddr})'.format(hostname=remote_hostname, hostaddr=remote_hostaddr)) def ping(remote_agent=None, **kwargs): @@ -233,7 +233,7 @@ def ping(remote_agent=None, **kwargs): return _call_local_broker_agent(username)[0] else: return remote_agent is not None and \ - x2gobroker.utils.portscan(remote_agent['hostname'], remote_agent['port']) and \ + (x2gobroker.utils.portscan(remote_agent['hostname'], remote_agent['port']) or x2gobroker.utils.portscan(remote_agent['hostname'], remote_agent['port'])) and \ _call_remote_broker_agent(username, task='ping', remote_agent=remote_agent)[0] tasks['ping'] = ping @@ -364,13 +364,14 @@ def delete_authorized_key(username, pubkey_hash, authorized_keys_file='%h/.x2go/ """ # this is for the logger output if remote_agent in ('LOCAL', None): - _hostname = 'LOCAL' + _hostname = _hostaddr = 'LOCAL' else: _hostname = remote_agent['hostname'] + _hostaddr = remote_agent['hostaddr'] if delay_deletion > 0: delayed_execution(delete_authorized_key, delay=delay_deletion, username=username, pubkey_hash=pubkey_hash, authorized_keys_file=authorized_keys_file, remote_agent=remote_agent, ) - logger_broker.debug('Scheduled deletion of authorized key in {delay}s: user={user}, host={host}'.format(delay=delay_deletion, user=username, host=_hostname)) + logger_broker.debug('Scheduled deletion of authorized key in {delay}s: user={user}, hostname={hostname}, hostaddr={hostaddr}'.format(delay=delay_deletion, user=username, hostname=_hostname, hostaddr=_hostaddr)) else: return call_broker_agent(username, task='delauthkey', cmdline_args=[pubkey_hash, authorized_keys_file, ], remote_agent=remote_agent, **kwargs) tasks['delauthkey'] = delete_authorized_key diff --git a/x2gobroker/brokers/base_broker.py b/x2gobroker/brokers/base_broker.py index 4a6cb00..ebcf4af 100644 --- a/x2gobroker/brokers/base_broker.py +++ b/x2gobroker/brokers/base_broker.py @@ -1008,14 +1008,18 @@ class X2GoBroker(object): while server_list: - remote_agent_server = server_list[-1] + remote_agent_hostname = server_list[-1] + remote_agent_hostaddr = remote_agent_hostname remote_agent_port = profile[u'sshport'] - if profile.has_key('sshport={ras}'.format(ras=remote_agent_server)): - remote_agent_port = profile["sshport={ras}".format(ras=remote_agent_server)] - if profile.has_key('host={ras}'.format(ras=remote_agent_server)): - remote_agent_server = profile["host={ras}".format(ras=remote_agent_server)] + if profile.has_key('sshport={hostname}'.format(hostname=remote_agent_hostname)): + remote_agent_port = profile["sshport={hostname}".format(hostname=remote_agent_hostname)] + if profile.has_key('host={hostname}'.format(hostname=remote_agent_hostname)): + remote_agent_hostaddr = profile["host={hostname}".format(hostname=remote_agent_hostname)] - remote_agent = {u'hostname': remote_agent_server, u'port': remote_agent_port, } + remote_agent = { + u'hostname': remote_agent_hostname, + u'hostaddr': remote_agent_hostaddr, + u'port': remote_agent_port, } try: if x2gobroker.agent.ping(remote_agent=remote_agent): @@ -1397,6 +1401,7 @@ class X2GoBroker(object): if profile.has_key(u'sshproxyhost') and profile[u'sshproxyhost']: remote_sshproxy_agent = { u'hostname': profile[u'sshproxyhost'], + u'hostaddr': profile[u'sshproxyhost'], u'port': "22" } if profile.has_key(u'sshproxyport') and profile[u'sshproxyport']: @@ -1410,7 +1415,8 @@ class X2GoBroker(object): # 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'hostname': server_name, + u'hostaddr': server_addr, u'port': selected_session[u'port'], } diff --git a/x2gobroker/tests/test_broker_agent.py b/x2gobroker/tests/test_broker_agent.py index a7cc26c..e9ead47 100644 --- a/x2gobroker/tests/test_broker_agent.py +++ b/x2gobroker/tests/test_broker_agent.py @@ -206,7 +206,7 @@ broker-agent-query-mode = SSH i = 0 while i < 10: _remoteagent5 = inifile_backend.get_remote_agent('testprofile5') - self.assertTrue( _remoteagent5 == {u'hostname': '10.0.2.4', u'port': 22} or _remoteagent5 == {u'hostname': '10.0.2.5', u'port': 22} ) + self.assertTrue( _remoteagent5 == {u'hostname': 'host1.mydomain', u'hostaddr': '10.0.2.4', u'port': 22} or _remoteagent5 == {u'hostname': 'host2.mydomain', u'hostaddr': '10.0.2.5', u'port': 22} ) _session5 = inifile_backend.select_session('testprofile5', 'foo5N') self.assertTrue( _session5 == {'port': 22, 'server': '10.0.2.4', } or _session5 == {'port': 22, 'server': '10.0.2.5', } ) i += 1 @@ -220,7 +220,7 @@ broker-agent-query-mode = SSH self.assertTrue( _profile6['host'][0] in ('host1.mydomain', 'host2.mydomain') ) self.assertTrue( not _profile6.has_key('status') ) _remoteagent6 = inifile_backend.get_remote_agent('testprofile6') - self.assertTrue( _remoteagent6 == {u'hostname': '10.0.2.4', u'port': 23467} or _remoteagent6 == {u'hostname': '10.0.2.5', u'port': 23467} ) + self.assertTrue( _remoteagent6 == {u'hostname': 'host1.mydomain', u'hostaddr': '10.0.2.4', u'port': 23467} or _remoteagent6 == {u'hostname': 'host2.mydomain', u'hostaddr': '10.0.2.5', u'port': 23467} ) _session6 = inifile_backend.select_session('testprofile6', 'foo6N') self.assertTrue( _session6 == {'port': 23467, 'server': '10.0.2.4', } or _session6 == {'port': 23467, 'server': '10.0.2.5', } ) @@ -232,7 +232,7 @@ broker-agent-query-mode = SSH i = 0 while i < 10: _remoteagent7 = inifile_backend.get_remote_agent('testprofile7') - self.assertTrue( _remoteagent7 == {u'hostname': 'docker-server', u'port': 22001} or _remoteagent7 == {u'hostname': 'docker-server', u'port': 22002} ) + self.assertTrue( _remoteagent7 == {u'hostname': 'docker-vm-1', u'hostaddr': 'docker-server', u'port': 22001} or _remoteagent7 == {u'hostname': 'docker-vm-2', u'hostaddr': 'docker-server', u'port': 22002} ) _session7 = inifile_backend.select_session('testprofile7', 'foo7N') self.assertTrue( _session7 == {'port': 22001, 'server': 'docker-server', } or _session7 == {'port': 22001, 'server': 'docker-server', } ) i += 1 @@ -245,7 +245,7 @@ broker-agent-query-mode = SSH i = 0 while i < 10: _remoteagent8 = inifile_backend.get_remote_agent('testprofile8') - self.assertTrue( _remoteagent8 == {u'hostname': 'docker-server', u'port': 22000} or _remoteagent8 == {u'hostname': 'docker-server', u'port': 22001} or _remoteagent8 == {u'hostname': 'docker-server', u'port': 22002} ) + self.assertTrue( _remoteagent8 == {u'hostname': 'docker-vm-0', u'hostaddr': 'docker-server', u'port': 22000} or _remoteagent8 == {u'hostname': 'docker-vm-1', u'hostaddr': 'docker-server', u'port': 22001} or _remoteagent8 == {u'hostname': 'docker-vm-2', u'hostaddr': 'docker-server', u'port': 22002} ) _session8 = inifile_backend.select_session('testprofile8', 'foo8N') self.assertTrue( _session8 == {'port': 22000, 'server': 'docker-server', } or _session8 == {'port': 22001, 'server': 'docker-server', } or _session8 == {'port': 22001, 'server': 'docker-server', } ) i += 1 @@ -433,6 +433,57 @@ broker-autologin = true x2gobroker.utils.portscan = _save_portscan time.sleep = _save_time_sleep + def test_get_remote_agent_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 + + def _call_testsuite_broker_agent(username, task, cmdline_args=[], remote_agent=None): + + if task == 'ping': + return True, [] + + return False, [] + + def _fake_portscan(addr, port=22): + if addr == 'host3.internal': + return False + if addr.startswith('downhost'): + 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] +command = MATE +user = foo +broker-agent-query-mode = NONE + +[testprofile1] +name = testprofile1 +host = downhost1.internal (10.0.2.11), host2.internal (10.0.2.12), host3.internal (10.0.2.13) +broker-agent-query-mode = SSH +broker-portscan-x2goservers = true + +""" + tf = tempfile.NamedTemporaryFile() + print >> tf, _session_profiles + tf.seek(0) + inifile_backend = inifile.X2GoBroker(profile_config_file=tf.name) + + i = 0 + while i < 50: + remote_agent = inifile_backend.get_remote_agent('testprofile1') + self.assertTrue ( remote_agent['hostaddr'] != '10.0.2.11') + i += 1 def test_suite(): from unittest import TestSuite, makeSuite -- Alioth's /srv/git/_hooks_/post-receive-email on /srv/git/code.x2go.org/x2gobroker.git