Skip to content

Commit dea14af

Browse files
committed
Add more unit test cases for cluster manager
1 parent 3f402a6 commit dea14af

File tree

2 files changed

+33
-7
lines changed

2 files changed

+33
-7
lines changed

hpc_cluster_manager.py

+9-6
Original file line numberDiff line numberDiff line change
@@ -123,9 +123,7 @@ def on_slave_heartbeat(self, hostname, now=datetime.utcnow()):
123123
if self._heart_beat_table[u_hostname].state == HpcState.Provisioning:
124124
with self._table_lock:
125125
if self._heart_beat_table[u_hostname].state == HpcState.Provisioning:
126-
self._heart_beat_table[u_hostname] = self._heart_beat_table[u_hostname]._replace(
127-
state=HpcState.Configuring)
128-
self.logger.info("Configuring Host {}".format(u_hostname))
126+
self._set_nodes_configuring(u_hostname)
129127
else:
130128
self.logger.error("Host {} is not recognized. Heartbeat ignored.".format(u_hostname))
131129
self.logger.debug("_table {} ".format(self._heart_beat_table))
@@ -197,6 +195,7 @@ def _get_nodes_name_in_state(self, state):
197195
# type: (HpcState) -> [str]
198196
return [host.hostname for host in dict(self._heart_beat_table).itervalues() if host.state == state]
199197

198+
# TODO: make state_machine methods more testable
200199
def _configure_compute_nodes_state_machine(self):
201200
# type: () -> ()
202201
configuring_node_names = self._get_nodes_name_in_state(HpcState.Configuring)
@@ -229,11 +228,11 @@ def _configure_compute_nodes_state_machine(self):
229228
invalid_state_node_dict = {}
230229
for node_status in node_status_list:
231230
node_name = _get_node_name_from_status(node_status)
232-
node_state = node_status[HpcRestClient.NODE_STATUS_NODE_STATE_KEY]
231+
node_state = _get_node_state_from_status(node_status)
233232
if _check_node_health_unapproved(node_status):
234233
unapproved_node_list.append(node_name)
235234
# node approved
236-
elif (self._check_node_in_mesos_group(node_status) or (
235+
elif (not self._check_node_in_mesos_group(node_status) or (
237236
self._node_group_specified() and self._check_node_in_specified_group(node_status))):
238237
if _check_node_state_online(node_status):
239238
take_offline_node_list.append(node_name)
@@ -372,6 +371,10 @@ def _set_nodes_running(self, node_names):
372371
# type: (Iterable[str]) -> ()
373372
self._set_node_state(node_names, HpcState.Running, "Running")
374373

374+
def _set_nodes_configuring(self, node_names):
375+
# type: (Iterable[str]) -> ()
376+
self._set_node_state(node_names, HpcState.Configuring, "Configuring")
377+
375378
def _set_node_state(self, node_names, node_state, state_name):
376379
# type: (Iterable[str], int, str) -> [(str, int)]
377380
set_nodes = []
@@ -478,7 +481,7 @@ def _close_node_state_machine(self, node_names):
478481

479482
def _check_node_in_mesos_group(self, node_status):
480483
# type: (dict[str, any]) -> bool
481-
return self.MESOS_NODE_GROUP_NAME.upper() not in _upper_strings(
484+
return self.MESOS_NODE_GROUP_NAME.upper() in _upper_strings(
482485
node_status[HpcRestClient.NODE_STATUS_NODE_GROUP_KEY])
483486

484487
def _check_node_in_specified_group(self, node_status):

hpc_cluster_manger_unittest.py

+24-1
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
import datetime
22
import unittest
33

4-
from mock import patch
4+
from mock import patch, MagicMock
55

66
from hpc_cluster_manager import HpcClusterManager, HpcState
7+
from restclient import HpcRestClient
78

89
HOST1HOSTNAME = "host1hostname"
910
HOST1FQDN = "host1hostname.fqdn.com"
@@ -17,6 +18,8 @@
1718
HOST2AGENTID = "host2agentid"
1819
HOST2TASKID1 = "host2taskid1"
1920

21+
HOST3HOSTNAME = "host3hostname"
22+
2023
ZERODELTA = datetime.timedelta(0)
2124

2225

@@ -37,6 +40,15 @@ def dst(self, dt):
3740
ONESEC = datetime.timedelta(seconds=1)
3841

3942

43+
def _set_node_name(node_status, name):
44+
node_status[HpcRestClient.NODE_STATUS_NODE_NAME_KEY] = name
45+
46+
47+
_true_mock_result = MagicMock(return_value=True)
48+
_false_mock_result = MagicMock(return_value=False)
49+
_empty_mock_result = MagicMock(return_value="")
50+
51+
4052
class HeartbeatTableUnitTest(unittest.TestCase):
4153
def setUp(self):
4254
pass
@@ -228,6 +240,17 @@ def test_heartbeat_time_out_positive(self, mock_restc):
228240
_, res, _ = clusmgr._check_timeout(UTCNOW + TENMINUTES)
229241
self.assertTrue(res)
230242

243+
@patch("hpc_cluster_manager.HpcRestClient", autospec=True)
244+
def test_invalid_heartbeat(self, mock_restc):
245+
clusmgr = HpcClusterManager(mock_restc)
246+
clusmgr.on_slave_heartbeat(HOST1HOSTNAME)
247+
self.assertFalse(clusmgr._heart_beat_table)
248+
249+
@patch("hpc_cluster_manager.HpcRestClient", autospec=True)
250+
def test_missing_task_info(self, mock_restc):
251+
clusmgr = HpcClusterManager(mock_restc)
252+
self.assertEqual(clusmgr.get_task_info(HOST1HOSTNAME), ("", ""))
253+
231254

232255
if __name__ == '__main__':
233256
unittest.main()

0 commit comments

Comments
 (0)