Skip to content

Commit d8e4deb

Browse files
committed
fix sigint
1 parent b5b2876 commit d8e4deb

File tree

3 files changed

+76
-61
lines changed

3 files changed

+76
-61
lines changed

framework/test_cases/base_testcase.py

Lines changed: 47 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,61 @@
1313
# limitations under the License.
1414
"""Base test case used for xds test suites."""
1515
import inspect
16+
import signal
17+
import time
1618
import traceback
17-
from typing import Optional, Union
19+
from types import FrameType
20+
from typing import Any, Callable, Optional, TypeAlias, Union
1821
import unittest
1922

2023
from absl import logging
2124
from absl.testing import absltest
25+
from typing_extensions import override
26+
27+
# pylint complains about signal.Signals for some reason.
28+
_SignalNum: TypeAlias = Union[int, signal.Signals] # pylint: disable=no-member
29+
_SignalHandler: TypeAlias = Callable[[_SignalNum, Optional[FrameType]], Any]
2230

2331

2432
class BaseTestCase(absltest.TestCase):
25-
# @override
33+
_prev_sigint_handler: Optional[_SignalHandler] = None
34+
_handling_sigint: bool = False
35+
36+
@override
37+
def setUp(self):
38+
super().setUp()
39+
self._prev_sigint_handler = signal.signal(
40+
signal.SIGINT, self._handle_sigint
41+
)
42+
43+
def _handle_sigint(
44+
self, signalnum: _SignalNum, frame: Optional[FrameType]
45+
) -> None:
46+
if self._handling_sigint:
47+
logging.info("Ctrl+C pressed twice, aborting the cleanup.")
48+
else:
49+
cleanup_delay_sec = 2
50+
logging.info(
51+
"Caught Ctrl+C. Cleanup will start in %d seconds."
52+
" Press Ctrl+C again to abort.",
53+
cleanup_delay_sec,
54+
)
55+
self._handling_sigint = True
56+
# Sleep for a few seconds to allow second Ctrl-C before the cleanup.
57+
time.sleep(cleanup_delay_sec)
58+
# Force resource cleanup by their name. Addresses the case where
59+
# ctrl-c is pressed while waiting for the resource creation.
60+
self.force_cleanup = True
61+
self.tearDown()
62+
self.tearDownClass()
63+
64+
# Remove the sigint handler.
65+
self._handling_sigint = False
66+
if self._prev_sigint_handler is not None:
67+
signal.signal(signal.SIGINT, self._prev_sigint_handler)
68+
raise KeyboardInterrupt
69+
70+
@override
2671
def run(self, result: Optional[unittest.TestResult] = None) -> None:
2772
super().run(result)
2873
# TODO(sergiitk): should this method be returning result? See

framework/xds_k8s_testcase.py

Lines changed: 27 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,8 @@
1919
import hashlib
2020
import logging
2121
import re
22-
import signal
2322
import time
24-
from types import FrameType
25-
from typing import Any, Callable, Final, Optional, Tuple, Union
23+
from typing import Callable, Final, Optional, Tuple
2624

2725
from absl import flags
2826
from absl.testing import absltest
@@ -80,9 +78,6 @@
8078
ClientConfig = grpc_csds.ClientConfig
8179
RpcMetadata = grpc_testing.LoadBalancerStatsResponse.RpcMetadata
8280
MetadataByPeer: list[str, RpcMetadata]
83-
# pylint complains about signal.Signals for some reason.
84-
_SignalNum = Union[int, signal.Signals] # pylint: disable=no-member
85-
_SignalHandler = Callable[[_SignalNum, Optional[FrameType]], Any]
8681

8782
TD_CONFIG_MAX_WAIT: Final[dt.timedelta] = dt.timedelta(minutes=10)
8883
# TODO(sergiitk): get rid of the seconds constant, use timedelta
@@ -144,8 +139,6 @@ class XdsKubernetesBaseTestCase(base_testcase.BaseTestCase):
144139
server_xds_port: Optional[int]
145140
td: TrafficDirectorManager
146141
td_bootstrap_image: str
147-
_prev_sigint_handler: Optional[_SignalHandler] = None
148-
_handling_sigint: bool = False
149142
yaml_highlighter: framework.helpers.highlighter.HighlighterYaml = None
150143
enable_dualstack: bool = False
151144

@@ -269,39 +262,6 @@ def tearDownClass(cls):
269262
cls.secondary_k8s_api_manager.close()
270263
cls.gcp_api_manager.close()
271264

272-
def setUp(self):
273-
self._prev_sigint_handler = signal.signal(
274-
signal.SIGINT, self.handle_sigint
275-
)
276-
277-
def handle_sigint(
278-
self, signalnum: _SignalNum, frame: Optional[FrameType]
279-
) -> None:
280-
# TODO(sergiitk): move to base_testcase.BaseTestCase
281-
if self._handling_sigint:
282-
logger.info("Ctrl+C pressed twice, aborting the cleanup.")
283-
else:
284-
cleanup_delay_sec = 2
285-
logger.info(
286-
"Caught Ctrl+C. Cleanup will start in %d seconds."
287-
" Press Ctrl+C again to abort.",
288-
cleanup_delay_sec,
289-
)
290-
self._handling_sigint = True
291-
# Sleep for a few seconds to allow second Ctrl-C before the cleanup.
292-
time.sleep(cleanup_delay_sec)
293-
# Force resource cleanup by their name. Addresses the case where
294-
# ctrl-c is pressed while waiting for the resource creation.
295-
self.force_cleanup = True
296-
self.tearDown()
297-
self.tearDownClass()
298-
299-
# Remove the sigint handler.
300-
self._handling_sigint = False
301-
if self._prev_sigint_handler is not None:
302-
signal.signal(signal.SIGINT, self._prev_sigint_handler)
303-
raise KeyboardInterrupt
304-
305265
@contextlib.contextmanager
306266
def subTest(self, msg, **params): # noqa pylint: disable=signature-differs
307267
# TODO(sergiitk): move to base_testcase.BaseTestCase
@@ -779,6 +739,10 @@ class IsolatedXdsKubernetesTestCase(
779739
each test, and destroyed after.
780740
"""
781741

742+
client_runner: Optional[KubernetesClientRunner] = None
743+
server_runner: Optional[KubernetesServerRunner] = None
744+
td: Optional[TrafficDirectorManager] = None
745+
782746
def setUp(self):
783747
"""Hook method for setting up the test fixture before exercising it."""
784748
super().setUp()
@@ -850,12 +814,14 @@ def tearDown(self):
850814
client_restarts: int = 0
851815
server_restarts: int = 0
852816
try:
853-
client_restarts = self.client_runner.get_pod_restarts(
854-
self.client_runner.deployment
855-
)
856-
server_restarts = self.server_runner.get_pod_restarts(
857-
self.server_runner.deployment
858-
)
817+
if self.client_runner:
818+
client_restarts = self.client_runner.get_pod_restarts(
819+
self.client_runner.deployment
820+
)
821+
if self.server_runner:
822+
server_restarts = self.server_runner.get_pod_restarts(
823+
self.server_runner.deployment
824+
)
859825
except (retryers.RetryError, k8s.NotFound) as e:
860826
logger.exception(e)
861827

@@ -869,9 +835,10 @@ def tearDown(self):
869835
except retryers.RetryError:
870836
logger.exception("Got error during teardown")
871837
finally:
872-
logger.info("----- Test client/server logs -----")
873-
self.client_runner.logs_explorer_run_history_links()
874-
self.server_runner.logs_explorer_run_history_links()
838+
if self.client_runner and self.server_runner:
839+
logger.info("----- Test client/server logs -----")
840+
self.client_runner.logs_explorer_run_history_links()
841+
self.server_runner.logs_explorer_run_history_links()
875842

876843
# Fail if any of the pods restarted.
877844
self.assertEqual(
@@ -894,13 +861,16 @@ def tearDown(self):
894861
)
895862

896863
def cleanup(self):
897-
self.td.cleanup(force=self.force_cleanup)
898-
self.client_runner.cleanup(
899-
force=self.force_cleanup, force_namespace=self.force_cleanup
900-
)
901-
self.server_runner.cleanup(
902-
force=self.force_cleanup, force_namespace=self.force_cleanup
903-
)
864+
if self.td:
865+
self.td.cleanup(force=self.force_cleanup)
866+
if self.client_runner:
867+
self.client_runner.cleanup(
868+
force=self.force_cleanup, force_namespace=self.force_cleanup
869+
)
870+
if self.server_runner:
871+
self.server_runner.cleanup(
872+
force=self.force_cleanup, force_namespace=self.force_cleanup
873+
)
904874

905875
def _start_test_client(
906876
self,

run.sh

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,10 +98,10 @@ main() {
9898
echo
9999
fi
100100

101-
# Automatically save last run logs to out/
101+
# Automatically save last run logs to out
102102
if [[ -n "${psm_log_file}" ]]; then
103103
mkdir -p "${PSM_LOG_DIR}"
104-
exec &> >(tee "${PSM_LOG_DIR}/${psm_log_file}")
104+
exec &> >(tee -i "${PSM_LOG_DIR}/${psm_log_file}")
105105
echo "Saving framework log to ${PSM_LOG_DIR}/${psm_log_file}"
106106
fi
107107

0 commit comments

Comments
 (0)