X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/68d551b65a837664be72bf08aad55ab76d778d07..90209af8fa35bc99c9821db0c815404d1234ef31:/services/nodemanager/tests/testutil.py diff --git a/services/nodemanager/tests/testutil.py b/services/nodemanager/tests/testutil.py index b376ca792a..41f4ed1355 100644 --- a/services/nodemanager/tests/testutil.py +++ b/services/nodemanager/tests/testutil.py @@ -2,13 +2,15 @@ from __future__ import absolute_import, print_function +import contextlib import datetime +import mock +import pykka +import sys import threading import time import libcloud.common.types as cloud_types -import mock -import pykka from . import pykka_timeout @@ -55,6 +57,17 @@ def cloud_node_fqdn(node): def ip_address_mock(last_octet): return '10.20.30.{}'.format(last_octet) +@contextlib.contextmanager +def redirected_streams(stdout=None, stderr=None): + orig_stdout, sys.stdout = sys.stdout, stdout or sys.stdout + orig_stderr, sys.stderr = sys.stderr, stderr or sys.stderr + try: + yield + finally: + sys.stdout = orig_stdout + sys.stderr = orig_stderr + + class MockShutdownTimer(object): def _set_state(self, is_open, next_opening): self.window_open = lambda: is_open @@ -119,6 +132,13 @@ class ActorTestMixin(object): if result is not unassigned: return result + def busywait(self, f): + n = 0 + while not f() and n < 10: + time.sleep(.1) + n += 1 + self.assertTrue(f()) + class DriverTestMixin(object): def setUp(self): @@ -143,10 +163,10 @@ class DriverTestMixin(object): self.assertTrue(self.driver_mock.called) self.assertIs(driver.real, driver_mock2) - def test_create_can_find_node_after_timeout(self): - driver = self.new_driver() + def test_create_can_find_node_after_timeout(self, create_kwargs={}, node_extra={}): + driver = self.new_driver(create_kwargs=create_kwargs) arv_node = arvados_node_mock() - cloud_node = cloud_node_mock() + cloud_node = cloud_node_mock(**node_extra) cloud_node.name = driver.create_cloud_name(arv_node) create_method = self.driver_mock().create_node create_method.side_effect = cloud_types.LibcloudError("fake timeout") @@ -166,6 +186,20 @@ class DriverTestMixin(object): driver.create_node(MockSize(1), arv_node) self.assertIs(create_method.side_effect, exc_test.exception) + def check_node_found_after_timeout_has_fixed_size(self, size, cloud_node, + create_kwargs={}): + # This method needs to be called explicitly by driver test suites + # that need it. + self.driver_mock().list_sizes.return_value = [size] + driver = self.new_driver(create_kwargs=create_kwargs) + arv_node = arvados_node_mock() + cloud_node.name = driver.create_cloud_name(arv_node) + create_method = self.driver_mock().create_node + create_method.side_effect = cloud_types.LibcloudError("fake timeout") + self.driver_mock().list_nodes.return_value = [cloud_node] + actual = driver.create_node(size, arv_node) + self.assertIs(size, actual.size) + class RemotePollLoopActorTestMixin(ActorTestMixin): def build_monitor(self, *args, **kwargs): @@ -175,7 +209,9 @@ class RemotePollLoopActorTestMixin(ActorTestMixin): self.monitor = self.TEST_CLASS.start( self.client, self.timer, *args, **kwargs).proxy() -def cloud_node_mock(node_num=99, size=MockSize(1), **extra): +def cloud_node_mock(node_num=99, size=None, **extra): + if size is None: + size = MockSize(node_num) node = mock.NonCallableMagicMock( ['id', 'name', 'state', 'public_ips', 'private_ips', 'driver', 'size', 'image', 'extra'],