|
14 | 14 |
|
15 | 15 | import collections
|
16 | 16 |
|
| 17 | +import eventlet.timeout |
17 | 18 | import mock
|
18 | 19 | import os_traits
|
19 | 20 | from oslo_utils.fixture import uuidsentinel as uuids
|
@@ -187,15 +188,150 @@ def do_test():
|
187 | 188 | do_test()
|
188 | 189 |
|
189 | 190 | def test_wait_for_instance_event_timeout(self):
|
| 191 | + instance = mock.Mock() |
| 192 | + instance.vm_state = mock.sentinel.vm_state |
| 193 | + instance.task_state = mock.sentinel.task_state |
| 194 | + |
| 195 | + mock_log = mock.Mock() |
| 196 | + |
| 197 | + @mock.patch.object(compute_manager, 'LOG', new=mock_log) |
190 | 198 | @mock.patch.object(self.virtapi._compute, '_event_waiter',
|
191 |
| - side_effect=test.TestingException()) |
192 |
| - @mock.patch('eventlet.timeout.Timeout') |
193 |
| - def do_test(mock_timeout, mock_waiter): |
194 |
| - with self.virtapi.wait_for_instance_event('instance', |
195 |
| - [('foo', 'bar')]): |
| 199 | + side_effect=eventlet.timeout.Timeout()) |
| 200 | + def do_test(mock_waiter): |
| 201 | + with self.virtapi.wait_for_instance_event( |
| 202 | + instance, [('foo', 'bar')]): |
196 | 203 | pass
|
197 | 204 |
|
198 |
| - self.assertRaises(test.TestingException, do_test) |
| 205 | + self.assertRaises(eventlet.timeout.Timeout, do_test) |
| 206 | + mock_log.warning.assert_called_once_with( |
| 207 | + 'Timeout waiting for %(events)s for instance with vm_state ' |
| 208 | + '%(vm_state)s and task_state %(task_state)s. ' |
| 209 | + 'Event states are: %(event_states)s', |
| 210 | + { |
| 211 | + 'events': ['foo-bar'], |
| 212 | + 'vm_state': mock.sentinel.vm_state, |
| 213 | + 'task_state': mock.sentinel.task_state, |
| 214 | + 'event_states': |
| 215 | + 'foo-bar: timed out after 0.00 seconds', |
| 216 | + }, |
| 217 | + instance=instance |
| 218 | + ) |
| 219 | + |
| 220 | + def test_wait_for_instance_event_one_received_one_timed_out(self): |
| 221 | + instance = mock.Mock() |
| 222 | + instance.vm_state = mock.sentinel.vm_state |
| 223 | + instance.task_state = mock.sentinel.task_state |
| 224 | + |
| 225 | + mock_log = mock.Mock() |
| 226 | + |
| 227 | + calls = [] |
| 228 | + |
| 229 | + def fake_event_waiter(*args, **kwargs): |
| 230 | + calls.append((args, kwargs)) |
| 231 | + if len(calls) == 1: |
| 232 | + event = mock.Mock(status="completed") |
| 233 | + return event |
| 234 | + else: |
| 235 | + raise eventlet.timeout.Timeout() |
| 236 | + |
| 237 | + @mock.patch.object(compute_manager, 'LOG', new=mock_log) |
| 238 | + @mock.patch.object(self.virtapi._compute, '_event_waiter', |
| 239 | + side_effect=fake_event_waiter) |
| 240 | + def do_test(mock_waiter): |
| 241 | + with self.virtapi.wait_for_instance_event( |
| 242 | + instance, [('foo', 'bar'), ('missing', 'event')]): |
| 243 | + pass |
| 244 | + |
| 245 | + self.assertRaises(eventlet.timeout.Timeout, do_test) |
| 246 | + mock_log.warning.assert_called_once_with( |
| 247 | + 'Timeout waiting for %(events)s for instance with vm_state ' |
| 248 | + '%(vm_state)s and task_state %(task_state)s. ' |
| 249 | + 'Event states are: %(event_states)s', |
| 250 | + { |
| 251 | + 'events': ['foo-bar', 'missing-event'], |
| 252 | + 'vm_state': mock.sentinel.vm_state, |
| 253 | + 'task_state': mock.sentinel.task_state, |
| 254 | + 'event_states': |
| 255 | + 'foo-bar: received after waiting 0.00 seconds, ' |
| 256 | + 'missing-event: timed out after 0.00 seconds', |
| 257 | + }, |
| 258 | + instance=instance |
| 259 | + ) |
| 260 | + |
| 261 | + def test_wait_for_instance_event_multiple_events(self): |
| 262 | + instance = mock.Mock() |
| 263 | + instance.vm_state = mock.sentinel.vm_state |
| 264 | + instance.task_state = mock.sentinel.task_state |
| 265 | + |
| 266 | + mock_log = mock.Mock() |
| 267 | + |
| 268 | + calls = [] |
| 269 | + |
| 270 | + def fake_event_waiter(*args, **kwargs): |
| 271 | + calls.append((args, kwargs)) |
| 272 | + if len(calls) == 1: |
| 273 | + event = mock.Mock(status="completed") |
| 274 | + return event |
| 275 | + else: |
| 276 | + raise eventlet.timeout.Timeout() |
| 277 | + |
| 278 | + def fake_prepare_for_instance_event(instance, name, tag): |
| 279 | + m = mock.MagicMock() |
| 280 | + m.instance = instance |
| 281 | + m.name = name |
| 282 | + m.tag = tag |
| 283 | + m.event_name = '%s-%s' % (name, tag) |
| 284 | + m.wait.side_effect = fake_event_waiter |
| 285 | + print(name, tag) |
| 286 | + if name == 'received-but-not-waited': |
| 287 | + m.ready.return_value = True |
| 288 | + if name == 'missing-but-not-waited': |
| 289 | + m.ready.return_value = False |
| 290 | + return m |
| 291 | + |
| 292 | + self.virtapi._compute.instance_events.prepare_for_instance_event.\ |
| 293 | + side_effect = fake_prepare_for_instance_event |
| 294 | + |
| 295 | + @mock.patch.object(compute_manager, 'LOG', new=mock_log) |
| 296 | + def do_test(): |
| 297 | + with self.virtapi.wait_for_instance_event( |
| 298 | + instance, |
| 299 | + [ |
| 300 | + ('received', 'event'), |
| 301 | + ('early', 'event'), |
| 302 | + ('missing', 'event'), |
| 303 | + ('received-but-not-waited', 'event'), |
| 304 | + ('missing-but-not-waited', 'event'), |
| 305 | + ] |
| 306 | + ): |
| 307 | + self.virtapi.exit_wait_early([('early', 'event')]) |
| 308 | + |
| 309 | + self.assertRaises(eventlet.timeout.Timeout, do_test) |
| 310 | + mock_log.warning.assert_called_once_with( |
| 311 | + 'Timeout waiting for %(events)s for instance with vm_state ' |
| 312 | + '%(vm_state)s and task_state %(task_state)s. ' |
| 313 | + 'Event states are: %(event_states)s', |
| 314 | + { |
| 315 | + 'events': |
| 316 | + [ |
| 317 | + 'received-event', |
| 318 | + 'early-event', |
| 319 | + 'missing-event', |
| 320 | + 'received-but-not-waited-event', |
| 321 | + 'missing-but-not-waited-event' |
| 322 | + ], |
| 323 | + 'vm_state': mock.sentinel.vm_state, |
| 324 | + 'task_state': mock.sentinel.task_state, |
| 325 | + 'event_states': |
| 326 | + 'received-event: received after waiting 0.00 seconds, ' |
| 327 | + 'early-event: received early, ' |
| 328 | + 'missing-event: timed out after 0.00 seconds, ' |
| 329 | + 'received-but-not-waited-event: received but not ' |
| 330 | + 'processed, ' |
| 331 | + 'missing-but-not-waited-event: expected but not received' |
| 332 | + }, |
| 333 | + instance=instance |
| 334 | + ) |
199 | 335 |
|
200 | 336 | def test_wait_for_instance_event_exit_early(self):
|
201 | 337 | # Wait for two events, exit early skipping one.
|
|
0 commit comments