diff --git a/examples/integration_test/it.py b/examples/integration_test/it.py
index e7d166387900ff1c0d9ed8ae4c0ad0c0e560a575..0ff25fdec37920be744a4527f07e423152897f82 100644
--- a/examples/integration_test/it.py
+++ b/examples/integration_test/it.py
@@ -134,8 +134,8 @@ def run(oidc_username):
# ensure there is a running server that is not currently running an experiment
results.start('Checking For Available Backend')
- servers = server_info.itervalues().next()['availableServers']
- if len(servers) == 0:
+ available_servers = vc._VirtualCoach__get_available_server_list()
+ if len(available_servers) == 0:
raise TestCaseError('No available backends to run test on.')
results.done(True)
diff --git a/hbp_nrp_virtual_coach/hbp_nrp_virtual_coach/config.py b/hbp_nrp_virtual_coach/hbp_nrp_virtual_coach/config.py
index 6cc08485ac44d5fe39501e7e0aa7eac34b138494..b4cc360b60859d52affcc1610d92a8a160eafdda 100644
--- a/hbp_nrp_virtual_coach/hbp_nrp_virtual_coach/config.py
+++ b/hbp_nrp_virtual_coach/hbp_nrp_virtual_coach/config.py
@@ -83,7 +83,7 @@ class Config(dict):
# validate required sections of the config, except if any values are missing
self.__validate('oidc', ['user'])
self.__validate('proxy', ['staging', 'dev', 'local', environment])
- self.__validate('proxy-services', ['experiment-list', 'server-info'])
+ self.__validate('proxy-services', ['experiment-list', 'available-servers', 'server-info'])
self.__validate('simulation-services', ['create', 'state', 'reset', 'csv-recorders'])
self.__validate('simulation-scripts', ['state-machine', 'transfer-function', 'brain'])
self.__validate('reset-services', ['robot_pose', 'full', 'world', 'brain'])
diff --git a/hbp_nrp_virtual_coach/hbp_nrp_virtual_coach/tests/test_virtual_coach.py b/hbp_nrp_virtual_coach/hbp_nrp_virtual_coach/tests/test_virtual_coach.py
index 6895787a0c1c9bb707ef8f13bbd34ba0ef8c2755..19ef25429674f7d787679123df5ec9c7212793c2 100644
--- a/hbp_nrp_virtual_coach/hbp_nrp_virtual_coach/tests/test_virtual_coach.py
+++ b/hbp_nrp_virtual_coach/hbp_nrp_virtual_coach/tests/test_virtual_coach.py
@@ -54,6 +54,12 @@ class TestVirtualCoach(unittest.TestCase):
self._vc = VirtualCoach()
+ self._mock_available_servers_list = [
+ {"id": 'mock-server-1'},
+ {"id":'mock-server-4'},
+ {"id":'mock-server-5'}
+ ]
+
self._mock_exp_list = {'MockExperiment1': {'configuration': {'name': 'C',
'maturity': 'production',
'description': 'Mock C',
@@ -66,17 +72,15 @@ class TestVirtualCoach(unittest.TestCase):
{'server': 'mock-server-6',
'runningSimulation': {'owner': '3',
'state': 'started',
- 'creationDate': 'Feb 03 12:15:24 UTC 2017'}}],
- 'availableServers': [{"id": 'mock-server-1'}, {"id":'mock-server-4'},
- {"id":'mock-server-5'}]},
+ 'creationDate': 'Feb 03 12:15:24 UTC 2017'}}]
+ },
'MockExperiment2': {'configuration': {'name': 'A',
'maturity': 'production',
'description': 'Mock A',
'timeout': 900,
'experimentConfiguration': 'foo/bar3.xml'},
- 'joinableServers': {},
- 'availableServers': [{"id": 'mock-server-1'}, {"id":'mock-server-4'},
- {"id":'mock-server-5'}]},
+ 'joinableServers': []
+ },
'MockDevExperiment': {'configuration': {'name': 'B',
'maturity': 'development',
'description': 'Mock B',
@@ -85,9 +89,8 @@ class TestVirtualCoach(unittest.TestCase):
'joinableServers': [{'server': 'mock-server-2',
'runningSimulation': {'owner': '2',
'state': 'created',
- 'creationDate': 'Feb 03 12:07:58 UTC 2017'}}],
- 'availableServers': [{"id": 'mock-server-1'}, {"id":'mock-server-4'},
- {"id":'mock-server-5'}]}}
+ 'creationDate': 'Feb 03 12:07:58 UTC 2017'}}]
+ }}
self._mock_exp_list_local = {'MockExperiment1': {'configuration': {'name': 'C',
'maturity': 'production',
@@ -97,15 +100,15 @@ class TestVirtualCoach(unittest.TestCase):
'joinableServers': [{'server': 'localhost',
'runningSimulation': {'owner': '1',
'state': 'paused',
- 'creationDate': 'Feb 03 12:11:10 UTC 2017'}}],
- 'availableServers': []},
+ 'creationDate': 'Feb 03 12:11:10 UTC 2017'}}]
+ },
'MockExperiment2': {'configuration': {'name': 'A',
'maturity': 'production',
'description': 'Mock A',
'timeout': 900,
'experimentConfiguration': 'foo/bar3.xml'},
- 'joinableServers': [],
- 'availableServers': []}}
+ 'joinableServers': []
+ }}
def test_init_asserts(self):
# invalid username
@@ -241,12 +244,12 @@ class TestVirtualCoach(unittest.TestCase):
"""
self.assertEqual(mock_stdout.getvalue().strip(), running_table.strip())
- @patch('hbp_nrp_virtual_coach.virtual_coach.VirtualCoach._VirtualCoach__get_experiment_list')
+ @patch('hbp_nrp_virtual_coach.virtual_coach.VirtualCoach._VirtualCoach__get_available_server_list')
@patch('sys.stdout', new_callable=StringIO)
- def test_print_available_servers(self, mock_stdout, mock_list):
+ def test_print_available_servers(self, mock_stdout, available_servers):
# mock the OIDC server call
- mock_list.return_value = self._mock_exp_list
+ available_servers.return_value = self._mock_available_servers_list
self._vc.print_available_servers()
available_servers = """
@@ -256,17 +259,12 @@ mock-server-5
"""
self.assertEqual(mock_stdout.getvalue().strip(), available_servers.strip())
- @patch('hbp_nrp_virtual_coach.virtual_coach.VirtualCoach._VirtualCoach__get_experiment_list')
+ @patch('hbp_nrp_virtual_coach.virtual_coach.VirtualCoach._VirtualCoach__get_available_server_list')
@patch('sys.stdout', new_callable=StringIO)
- def test_print_no_available_servers(self, mock_stdout, mock_list):
-
- # remove all available servers (deep copy to avoid an issues with test order)
- mock_exp_list_copy = copy.deepcopy(self._mock_exp_list)
- for k in mock_exp_list_copy:
- mock_exp_list_copy[k]['availableServers'] = []
+ def test_print_no_available_servers(self, mock_stdout, available_servers):
# mock the OIDC server call
- mock_list.return_value = mock_exp_list_copy
+ available_servers.return_value = []
self._vc.print_available_servers()
available_servers = 'No available servers.'
@@ -299,27 +297,26 @@ mock-server-5
mock_list.return_value = self._mock_exp_list
self.assertRaises(ValueError, self._vc.launch_experiment, 'MockExperiment1', 'invalid-server-1')
+ @patch('hbp_nrp_virtual_coach.virtual_coach.VirtualCoach._VirtualCoach__get_available_server_list')
@patch('hbp_nrp_virtual_coach.virtual_coach.VirtualCoach._VirtualCoach__get_experiment_list')
- def test_launch_no_available_servers(self, mock_list):
-
- # remove all available servers (deep copy to avoid an issues with test order)
- mock_exp_list_copy = copy.deepcopy(self._mock_exp_list)
- for k in mock_exp_list_copy:
- mock_exp_list_copy[k]['availableServers'] = []
+ def test_launch_no_available_servers(self, mock_list, servers_list):
# mock the OIDC server call
- mock_list.return_value = mock_exp_list_copy
+ mock_list.return_value = self._mock_exp_list
+ servers_list.return_value = []
self.assertRaises(ValueError, self._vc.launch_experiment, 'MockExperiment1')
+ @patch('hbp_nrp_virtual_coach.virtual_coach.VirtualCoach._VirtualCoach__get_available_server_list')
@patch('hbp_nrp_virtual_coach.virtual_coach.VirtualCoach._VirtualCoach__get_experiment_list')
@patch('hbp_nrp_virtual_coach.simulation.Simulation.__init__')
@patch('hbp_nrp_virtual_coach.simulation.Simulation.launch')
- def test_launch_one_server(self, mock_sim_launch, mock_sim, mock_list):
+ def test_launch_one_server(self, mock_sim_launch, mock_sim, mock_list, servers_list):
# mock sim launch to succeed
mock_sim.return_value = None
mock_sim_launch.return_value = True
+ servers_list.return_value = self._mock_available_servers_list
# mock the OIDC server call
mock_list.return_value = self._mock_exp_list
self._vc.launch_experiment('MockExperiment1', 'mock-server-4')
diff --git a/hbp_nrp_virtual_coach/hbp_nrp_virtual_coach/virtual_coach.py b/hbp_nrp_virtual_coach/hbp_nrp_virtual_coach/virtual_coach.py
index a12a5e6f845c730676c42e5e512a0cd112ef131e..d312c7a02a3808c92220148e90a96e8fe1671a1a 100644
--- a/hbp_nrp_virtual_coach/hbp_nrp_virtual_coach/virtual_coach.py
+++ b/hbp_nrp_virtual_coach/hbp_nrp_virtual_coach/virtual_coach.py
@@ -184,8 +184,8 @@ class VirtualCoach(object):
# retrieve the experiment list, and take the first list of available servers, this is the
# same across all experiment listings
- exp_list = self.__get_experiment_list()
- servers = [server['id'] for server in exp_list.itervalues().next()['availableServers']]
+ available_servers = self.__get_available_server_list()
+ servers = [server['id'] for server in available_servers]
# add a display value if there are no available servers
if len(servers) == 0:
@@ -219,8 +219,11 @@ class VirtualCoach(object):
experiment_id)
# get the experiment configuration details and available servers that can be used
+ available_servers = self.__get_available_server_list()
+ from pprint import pprint
+ pprint(available_servers)
+ servers = [available_server['id'] for available_server in available_servers]
experiment = exp_list[experiment_id]
- servers = [available_server['id'] for available_server in experiment['availableServers']]
experiment_conf = experiment['configuration']['experimentConfiguration']
# if the user provided a specific server, ensure it is available before trying to launch
@@ -258,3 +261,12 @@ class VirtualCoach(object):
logger.info('Retrieving list of experiments.')
_, l_json = self.__oidc_client.request(self.__config['proxy-services']['experiment-list'])
return json.loads(l_json)
+
+ def __get_available_server_list(self):
+ """
+ Internal helper to retrieve the available server list from the backend proxy.
+ """
+
+ logger.info('Retrieving list of available servers.')
+ _, l_json = self.__oidc_client.request(self.__config['proxy-services']['available-servers'])
+ return json.loads(l_json)