|
2 | 2 | import json |
3 | 3 | import os |
4 | 4 | import sys |
| 5 | +import time |
5 | 6 | from threading import Event |
6 | 7 | import unittest |
7 | 8 |
|
@@ -215,23 +216,86 @@ def test_set_standby_config(self): |
215 | 216 | self.assertEqual(r, True) |
216 | 217 |
|
217 | 218 | def test_check_transition(self): |
218 | | - on_change = Mock() |
219 | | - os.environ[Config.PATRONI_CONFIG_VARIABLE] = PATRONI_CONFIG.replace('name: mstest', 'name: leader') |
220 | | - self.config = Config(None) |
221 | | - self.m = MultisiteController(self.config, on_change=on_change) |
222 | | - |
223 | | - self.m._has_leader = False |
224 | | - self.m._check_transition(True, 'blahblah') |
225 | | - self.m.on_change.assert_called_once() |
226 | | - self.assertEqual(self.m._has_leader, True) |
| 219 | + self.multisite.on_change = Mock() |
| 220 | + self.multisite._has_leader = False |
| 221 | + self.multisite._check_transition(True, 'blahblah') |
| 222 | + self.assertEqual(self.multisite._has_leader, True) |
227 | 223 |
|
228 | 224 | # TODO: state_handler case |
229 | 225 |
|
230 | | - def test_resolve_multisite_leader(self): |
231 | | - pass |
| 226 | + @patch.object(MultisiteController, 'touch_member') |
| 227 | + @patch.object(MultisiteController, '_disconnected_operation') |
| 228 | + @patch.object(MultisiteController, '_check_transition') |
| 229 | + # @patch.object(MultisiteController, '_update_history') |
| 230 | + def test_resolve_multisite_leader(self, check_transition, disconnected_operation, touch_member): |
| 231 | + # c = get_cluster_initialized_with_leader() |
| 232 | + # self.multisite.dcs.get_cluster = Mock(return_value=c) |
| 233 | + self.multisite.on_change = Mock() |
| 234 | + |
| 235 | + # update_history.assert_called_once() |
| 236 | + |
| 237 | + # we are not a member of the cluster |
| 238 | + # self.multisite._resolve_multisite_leader() |
| 239 | + # self.assertEqual(touch_member.call_count, 2) |
| 240 | + |
| 241 | + # we are a member of the cluster |
| 242 | + # touch_member.reset_mock() |
| 243 | + |
| 244 | + # unlocked cluster |
| 245 | + c = get_cluster_initialized_without_leader(failover=Failover(0, '', 'foo', None, 'mstest')) |
| 246 | + self.multisite.dcs.get_cluster = Mock(return_value=c) |
| 247 | + |
| 248 | + self.multisite._release = True |
| 249 | + self.multisite._resolve_multisite_leader() |
| 250 | + disconnected_operation.assert_called_once() |
| 251 | + |
| 252 | + disconnected_operation.reset_mock() |
| 253 | + self.multisite._release = False |
| 254 | + self.multisite._failover_target = 'foo' |
| 255 | + self.multisite._failover_timeout = 9999999999 # I am not _that_ optimistic |
| 256 | + self.multisite._resolve_multisite_leader() |
| 257 | + disconnected_operation.assert_called_once() |
| 258 | + |
| 259 | + self.multisite._failover_target = '' |
| 260 | + self.multisite._standby_config = {} |
| 261 | + |
| 262 | + # could acquire multisite lock |
| 263 | + self.multisite.dcs.attempt_to_acquire_leader = Mock(return_value=True) |
| 264 | + self.multisite.dcs.manual_failover = Mock() |
| 265 | + self.multisite._resolve_multisite_leader() |
| 266 | + self.assertIsNone(self.multisite._standby_config) |
| 267 | + check_transition.assert_called_with(leader=True, note='Acquired multisite leader status') |
| 268 | + self.multisite.dcs.manual_failover.assert_called_with('', '') |
| 269 | + |
| 270 | + # could not... |
| 271 | + c = get_cluster_initialized_without_leader() |
| 272 | + self.multisite.dcs.get_cluster = Mock(return_value=c) |
| 273 | + self.multisite.dcs.manual_failover.reset_mock() |
| 274 | + self.multisite._resolve_multisite_leader() |
| 275 | + self.multisite.dcs.manual_failover.assert_not_called() |
| 276 | + |
| 277 | + # self.multisite.name = 'leader' |
| 278 | + # self.multisite._resolve_multisite_leader() |
| 279 | + # touch_member.assert_called_once() |
232 | 280 |
|
233 | 281 | def test_observe_leader(self): |
234 | | - pass |
| 282 | + # there is no leader |
| 283 | + with patch.object(MultisiteController, '_disconnected_operation', Mock()) as d: |
| 284 | + self.multisite.dcs.get_cluster = Mock(return_value=get_cluster_initialized_without_leader()) |
| 285 | + self.multisite._observe_leader() |
| 286 | + d.assert_called_once() |
| 287 | + |
| 288 | + # there is a leader and it's not us |
| 289 | + with patch.object(MultisiteController, '_set_standby_config', Mock()) as s: |
| 290 | + c = get_cluster_initialized_with_leader() |
| 291 | + self.multisite.dcs.get_cluster = Mock(return_value=c) |
| 292 | + self.multisite._observe_leader() |
| 293 | + s.assert_called_once_with(c.leader.member) |
| 294 | + |
| 295 | + # we are the leader |
| 296 | + self.multisite.name = 'leader' |
| 297 | + self.multisite._observe_leader() |
| 298 | + self.assertIsNone(self.multisite._standby_config) |
235 | 299 |
|
236 | 300 | def test_update_history(self): |
237 | 301 | pass |
|
0 commit comments