This is an automated email from the git hooks/post-receive script. x2go pushed a change to branch master in repository x2gobroker. from 340cc71 Get several issues around select_session fixed via tests in the broker's backend base.py. new ebf7718 Add tests for broker agent queries. new 6f9a657 Fix setting the remote agent's SSH port if the host option is of style "<hostname> (<ip-address>:<port>)". new 72db45f During select_session: Re-add subdomain (if possible) to the hostname to make sure we can detect the host's <ip-address>:<port> further down in the code. 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/brokers/base_broker.py | 9 +- x2gobroker/tests/test_broker_agent.py | 255 +++++++++++++++++++++++++++++++++ 3 files changed, 268 insertions(+), 2 deletions(-) create mode 100644 x2gobroker/tests/test_broker_agent.py -- 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 ebf77180885f59b9febd46afe4c4eb39a3edd894 Author: Mike Gabriel <mike.gabriel@das-netzwerkteam.de> Date: Thu Nov 6 05:54:59 2014 +0100 Add tests for broker agent queries. --- debian/changelog | 1 + x2gobroker/tests/test_broker_agent.py | 255 +++++++++++++++++++++++++++++++++ 2 files changed, 256 insertions(+) diff --git a/debian/changelog b/debian/changelog index 37fe2a8..2c1aeee 100644 --- a/debian/changelog +++ b/debian/changelog @@ -189,6 +189,7 @@ x2gobroker (0.0.3.0-0x2go1) UNRELEASED; urgency=low for authentication requests. - Get several issues around select_session fixed via tests in the broker's backend base.py. + - Add tests for broker agent queries. * 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/tests/test_broker_agent.py b/x2gobroker/tests/test_broker_agent.py new file mode 100644 index 0000000..6eefa02 --- /dev/null +++ b/x2gobroker/tests/test_broker_agent.py @@ -0,0 +1,255 @@ +# -*- coding: utf-8 -*- + +# Copyright (C) 2012-2014 by Mike Gabriel <mike.gabriel@das-netzwerkteam.de> +# +# X2Go Session Broker is free software; you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# X2Go Session Broker is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program; if not, write to the +# Free Software Foundation, Inc., +# 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. + +import unittest +import tempfile +import copy + +# Python X2GoBroker modules +import x2gobroker.brokers.inifile_broker as inifile +import x2gobroker.defaults + +class TestX2GoBrokerAgent(unittest.TestCase): + + # TEST INTERPRETATION OF REPLIES FROM (FAKED) BROKER AGENT + + def test_broker_agent_replies(self): + _save_icmp_ping = x2gobroker.agent.icmp_ping + _save_local_broker_agent_call = x2gobroker.agent._call_local_broker_agent + _save_remote_broker_agent_call = x2gobroker.agent._call_remote_broker_agent + + def _call_testsuite_broker_agent(username, task, cmdline_args=[], remote_agent=None): + + if task == 'listsessions': + list_sessions = [] + if username == 'foo1R': + list_sessions = ['30342|foo1R-50-1414759661_stDMATE_dp24|50|host1|R|2014-10-31T13:47:41|c02c7bbe58677a2726f7e456cb398ae4|127.0.0.1|30001|30002|2014-10-31T13:47:43|foo1R|34|30003|-1|-1', + ] + elif username == 'foo1S': + list_sessions = ['30342|foo1S-50-1414759661_stDMATE_dp24|50|host1|S|2014-10-31T13:47:41|c02c7bbe58677a2726f7e456cb398ae4|127.0.0.1|30001|30002|2014-10-31T13:47:43|foo1S|34|30003|-1|-1', + ] + elif username == 'foo1N': + list_sessions = ['30342|foo1N-50-1414759661_stDMATE_dp24|50|host2|S|2014-10-31T13:47:41|c02c7bbe58677a2726f7e456cb398ae4|127.0.0.1|30001|30002|2014-10-31T13:47:43|foo1N|34|30003|-1|-1', + ] + elif username == 'foo2RS': + # the session on host2 is older than the session on host1!!! + list_sessions = ['30342|foo2RS-50-1414759789_stDMATE_dp24|50|host2|S|2014-10-31T13:49:51|c02c7bbe58677a2726f7e456cb398ae4|127.0.0.1|30001|30002|2014-10-31T13:49:51|foo2RS|89|30003|-1|-1', + '23412|foo2RS-50-1414759661_stDMATE_dp24|50|host1|R|2014-10-31T13:47:43|fasd7asd58677a2726f7e456cb398ae4|127.0.0.1|30001|30002|2014-10-31T13:47:43|foo2RS|34|30003|-1|-1', + ] + elif username == 'foo3RS': + # the session on host2 is older than the session on host1!!! + list_sessions = ['30342|foo3RS-50-1414759789_stDMATE_dp24|50|host2|S|2014-10-31T13:49:51|c02c7bbe58677a2726f7e456cb398ae4|127.0.0.1|30001|30002|2014-10-31T13:49:51|foo3RS|89|30003|-1|-1', + '23412|foo3RS-50-1414759661_stDMATE_dp24|50|host1|R|2014-10-31T13:47:43|fasd7asd58677a2726f7e456cb398ae4|127.0.0.1|30001|30002|2014-10-31T13:47:43|foo3RS|34|30003|-1|-1', + ] + return True, list_sessions + + elif task == 'suspendsession': + return True + + return False, [] + + def _fake_icmp_ping(hostname): + return True + + x2gobroker.agent._call_local_broker_agent = _call_testsuite_broker_agent + x2gobroker.agent._call_remote_broker_agent = _call_testsuite_broker_agent + x2gobroker.agent.icmp_ping = _fake_icmp_ping + + _session_profiles = """ +[DEFAULT] +command = MATE +user = foo +broker-agent-query-mode = NONE + +[testprofile1] +name = testprofile1 +host = host1 +broker-agent-query-mode = LOCAL + +[testprofile2] +name = testprofile2 +host = host1, host2, host3, host4 +broker-agent-query-mode = SSH + +[testprofile3] +name = testprofile3 +host = host1.mydomain, host2.mydomain, host3.mydomain, host4.mydomain, host5.mydomain, host6.mydomain +broker-agent-query-mode = LOCAL + +[testprofile4] +name = testprofile4 +host = host1.mydomain, host2.yourdomain + +[testprofile5] +name = testprofile5 +host = host1.mydomain (10.0.2.4), host2.mydomain (10.0.2.5) +broker-agent-query-mode = SSH + +[testprofile6] +name = testprofile6 +host = host1.mydomain (10.0.2.4), host2.mydomain (10.0.2.5) +sshport = 23467 +broker-agent-query-mode = SSH + +[testprofile7] +name = testprofile7 +host = docker-vm-1 (docker-server:22001), docker-vm-2 (docker-server:22002) +broker-agent-query-mode = SSH + +[testprofile8] +name = testprofile8 +host = docker-vm-0 (localhost), docker-vm-1 (localhost:22001), docker-vm-2 (localhost:22002) +sshport = 22000 + +""" + tf = tempfile.NamedTemporaryFile() + print >> tf, _session_profiles + tf.seek(0) + inifile_backend = inifile.X2GoBroker(profile_config_file=tf.name) + + # test with 'testprofile1' + + # the faked broker agent should report a running session + _list1 = inifile_backend.list_profiles(username='foo1R') + _profile1 = _list1['testprofile1'] + self.assertTrue( ( _profile1['host'] == ['host1'] ) ) + self.assertTrue( ( _profile1.has_key('status') and _profile1['status'] == 'R' ) ) + # here will be a short pause, as we will try to suspend the faked X2Go Session + _session1 = inifile_backend.select_session('testprofile1', username='foo1R') + # the session broker has detected the running session on host 1 and changed its status to "S" + self.assertEqual ( _session1, {'port': 22, 'server': 'host1', 'session_info': '30342|foo1R-50-1414759661_stDMATE_dp24|50|host1|S|2014-10-31T13:47:41|c02c7bbe58677a2726f7e456cb398ae4|127.0.0.1|30001|30002|2014-10-31T13:47:43|foo1R|34|30003|-1|-1', } ) + + # the faked broker agent should report a suspended session + _list1 = inifile_backend.list_profiles(username='foo1S') + _profile1 = _list1['testprofile1'] + self.assertTrue( ( _profile1['host'] == ['host1'] ) ) + self.assertTrue( ( _profile1.has_key('status') and _profile1['status'] == 'S' ) ) + _session1 = inifile_backend.select_session('testprofile1') + self.assertEqual ( _session1, {'port': 22, 'server': 'host1'} ) + + # the faked broker agent should report a suspended session for host2, nothing for host1 + _list1 = inifile_backend.list_profiles(username='foo1N') + _profile1 = _list1['testprofile1'] + self.assertTrue( ( _profile1['host'] == ['host1'] ) ) + self.assertFalse( ( _profile1.has_key('status') ) ) + _session1 = inifile_backend.select_session('testprofile1') + self.assertEqual ( _session1, {'port': 22, 'server': 'host1'} ) + + # test "testprofile2", always resume suspended sessions first + + # the faked broker agent should report a suspended session for host1, a running session for host2 + # we resume host1 (the broker attempts resumption of suspended sessions, then the take-over of running sessions + _list2 = inifile_backend.list_profiles(username='foo2RS') + _profile2 = _list2['testprofile2'] + _profile2['host'].sort() + self.assertTrue( ( _profile2['host'] == ['host2'] ) ) + self.assertTrue( ( _profile2.has_key('status') and _profile2['status'] == 'S' ) ) + _session2 = inifile_backend.select_session('testprofile2', 'foo2RS') + self.assertEqual ( _session2, {'port': 22, 'server': 'host2', 'session_info': '30342|foo2RS-50-1414759789_stDMATE_dp24|50|host2|S|2014-10-31T13:49:51|c02c7bbe58677a2726f7e456cb398ae4|127.0.0.1|30001|30002|2014-10-31T13:49:51|foo2RS|89|30003|-1|-1', } ) + + # test "testprofile3", given host names with a subdomain, but subdomains not in listsessions output + + # the faked broker agent should report a suspended session for host1, a running session for host2 + # we resume host1 (the broker attempts resumption of suspended sessions, then the take-over of running sessions + _list3 = inifile_backend.list_profiles(username='foo3RS') + _profile3 = _list3['testprofile3'] + _profile3['host'].sort() + self.assertTrue( ( _profile3['host'] == ['host2'] ) ) + self.assertTrue( ( _profile3.has_key('status') and _profile3['status'] == 'S' ) ) + _session3 = inifile_backend.select_session('testprofile3', 'foo3RS') + self.assertEqual ( _session3, {'port': 22, 'server': 'host2.mydomain', 'session_info': '30342|foo3RS-50-1414759789_stDMATE_dp24|50|host2|S|2014-10-31T13:49:51|c02c7bbe58677a2726f7e456cb398ae4|127.0.0.1|30001|30002|2014-10-31T13:49:51|foo3RS|89|30003|-1|-1', } ) + _session3 = inifile_backend.select_session('testprofile3', 'foo3RS') + +# # test "testprofile4" +# _profile4 = inifile_backend.get_profile('testprofile4') +# _profile4['host'].sort() +# self.assertTrue( ( _profile4['host'] == ['host1.mydomain', 'host2.yourdomain'] ) ) +# for key in _profile4.keys(): +# self.assertFalse( (key.startswith('host') and key != 'host' ) ) +# _session4 = inifile_backend.select_session('testprofile4') +# self.assertTrue ( _session4['port'] == 22 ) +# self.assertTrue ( _session4['server'] in ('host1.mydomain', 'host2.yourdomain') ) + + # test "testprofile5", test if canonical hostnames and real hostnames differ + + _list5 = inifile_backend.list_profiles(username='foo5N') + _profile5 = _list5['testprofile5'] + _profile5['host'].sort() + self.assertTrue( _profile5['host'][0] in ('host1.mydomain', 'host2.mydomain') ) + self.assertTrue( not _profile5.has_key('status') ) + _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} ) + _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', } ) + + # test "testprofile6", test if canonical hostnames and real hostnames differ and the default + # SSH port has been adapted + + _list6 = inifile_backend.list_profiles(username='foo6N') + _profile6 = _list6['testprofile6'] + _profile6['host'].sort() + 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} ) + _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', } ) + + _list7 = inifile_backend.list_profiles(username='foo7N') + _profile7 = _list7['testprofile7'] + _profile7['host'].sort() + self.assertTrue( _profile7['host'][0] in ('docker-vm-1', 'docker-vm-2') ) + self.assertTrue( not _profile7.has_key('status') ) + _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} ) + _session7 = inifile_backend.select_session('testprofile7', 'foo7N') + self.assertTrue( _session7 == {'port': 22001, 'server': 'docker-server', } or _session7 == {'port': 22001, 'server': 'docker-server', } ) + +# # test "testprofile8" +# _profile8 = inifile_backend.get_profile('testprofile8') +# _profile8['host'].sort() +# self.assertTrue( ( _profile8['host'] == ['docker-vm-0', 'docker-vm-1', 'docker-vm-2'] ) ) +# self.assertTrue( _profile8.has_key('host=docker-vm-0') ) +# self.assertTrue( _profile8.has_key('host=docker-vm-1') ) +# self.assertTrue( _profile8.has_key('host=docker-vm-2') ) +# self.assertTrue( _profile8['host=docker-vm-0'] == 'localhost' ) +# self.assertTrue( _profile8['host=docker-vm-1'] == 'localhost' ) +# self.assertTrue( _profile8['host=docker-vm-2'] == 'localhost' ) +# self.assertTrue( _profile8['sshport'] == 22000 ) +# self.assertFalse( _profile8.has_key('sshport=docker-vm-0') ) +# self.assertTrue( _profile8['sshport=docker-vm-1'] == 22001 ) +# self.assertTrue( _profile8['sshport=docker-vm-2'] == 22002 ) +# i = 0 +# while i < 10: +# _session8 = inifile_backend.select_session('testprofile8', username='foo') +# self.assertTrue ( _session8['port'] in (22000, 22001, 22002) ) +# self.assertTrue ( _session8['server'] == 'localhost' ) +# 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.agent.icmp_ping = _save_icmp_ping + + +def test_suite(): + from unittest import TestSuite, makeSuite + suite = TestSuite() + suite.addTest(makeSuite(TestX2GoBrokerAgent)) + return 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 6f9a657188a3eb727c9513da6dc03aa8cc4205b7 Author: Mike Gabriel <mike.gabriel@das-netzwerkteam.de> Date: Thu Nov 6 05:57:17 2014 +0100 Fix setting the remote agent's SSH port if the host option is of style "<hostname> (<ip-address>:<port>)". --- debian/changelog | 2 ++ x2gobroker/brokers/base_broker.py | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/debian/changelog b/debian/changelog index 2c1aeee..a99ddf0 100644 --- a/debian/changelog +++ b/debian/changelog @@ -190,6 +190,8 @@ x2gobroker (0.0.3.0-0x2go1) UNRELEASED; urgency=low - Get several issues around select_session fixed via tests in the broker's backend base.py. - Add tests for broker agent queries. + - Fix setting the remote agent's SSH port if the host option + is of style "<hostname> (<ip-address>:<port>)". * 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/brokers/base_broker.py b/x2gobroker/brokers/base_broker.py index 93f86b3..3007351 100644 --- a/x2gobroker/brokers/base_broker.py +++ b/x2gobroker/brokers/base_broker.py @@ -968,10 +968,10 @@ class X2GoBroker(object): remote_agent_server = server_list[-1] 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={ras}'.format(ras=remote_agent_port)): - remote_agent_port = profile["host={rap}".format(ras=remote_agent_port)] remote_agent = {u'hostname': remote_agent_server, u'port': remote_agent_port, } -- 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 72db45ff8f0678196d2aab0cb2180b23fe773b46 Author: Mike Gabriel <mike.gabriel@das-netzwerkteam.de> Date: Thu Nov 6 05:59:10 2014 +0100 During select_session: Re-add subdomain (if possible) to the hostname to make sure we can detect the host's <ip-address>:<port> further down in the code. --- debian/changelog | 3 +++ x2gobroker/brokers/base_broker.py | 5 +++++ 2 files changed, 8 insertions(+) diff --git a/debian/changelog b/debian/changelog index a99ddf0..4057286 100644 --- a/debian/changelog +++ b/debian/changelog @@ -192,6 +192,9 @@ x2gobroker (0.0.3.0-0x2go1) UNRELEASED; urgency=low - Add tests for broker agent queries. - Fix setting the remote agent's SSH port if the host option is of style "<hostname> (<ip-address>:<port>)". + - During select_session: Re-add subdomain (if possible) to the hostname to + make sure we can detect the host's <ip-address>:<port> further down in + the code. * 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/brokers/base_broker.py b/x2gobroker/brokers/base_broker.py index 3007351..fc5082c 100644 --- a/x2gobroker/brokers/base_broker.py +++ b/x2gobroker/brokers/base_broker.py @@ -1221,6 +1221,11 @@ class X2GoBroker(object): server_name = busy_server_list[0][1] + # this makes sure we allow back-translation of hostname to host address + # when the format "<hostname> (<ip-address>)" ist used in the hosts field... + if len(subdomains_config) == 1: + server_name += '.{domain}'.format(domain=subdomains_config[0]) + else: logger_broker.warning('base_broker.X2GoBroker.select_session(): no broker agent could be contacted, this does not look good. We tried these agent hosts: {agent_hosts}'.format(agent_hosts=unicode(server_list))) -- Alioth's /srv/git/_hooks_/post-receive-email on /srv/git/code.x2go.org/x2gobroker.git