mirror of
https://github.com/clearlinux/WALinuxAgent.git
synced 2026-09-03 20:31:31 +00:00
Ensure child process is terminated - #272
Signed-off-by: Brendan Dixon <brendand@microsoft.com>
This commit is contained in:
@@ -96,7 +96,7 @@ class UpdateHandler(object):
|
||||
|
||||
self.agents = []
|
||||
|
||||
self.child = None
|
||||
self.child_process = None
|
||||
self.signal_handler = None
|
||||
|
||||
def run_latest(self):
|
||||
@@ -114,7 +114,7 @@ class UpdateHandler(object):
|
||||
agent_dir = latest_agent.get_agent_dir()
|
||||
agent_name = latest_agent.name
|
||||
|
||||
if self.child is not None:
|
||||
if self.child_process is not None:
|
||||
raise Exception("Illegal attempt to launch multiple child processes")
|
||||
|
||||
try:
|
||||
@@ -126,9 +126,13 @@ class UpdateHandler(object):
|
||||
if cmds[0].lower() == "python":
|
||||
cmds[0] = get_python_cmd()
|
||||
|
||||
child = subprocess.Popen(cmds, cwd=agent_dir, stdout=sys.stdout, stderr=sys.stderr)
|
||||
self.child_process = subprocess.Popen(
|
||||
cmds,
|
||||
cwd=agent_dir,
|
||||
stdout=sys.stdout,
|
||||
stderr=sys.stderr)
|
||||
|
||||
ret = child.wait()
|
||||
ret = self.child_process.wait()
|
||||
if ret == None:
|
||||
ret = 1
|
||||
if ret != 0:
|
||||
@@ -169,13 +173,14 @@ class UpdateHandler(object):
|
||||
return
|
||||
|
||||
def forward_signal(self, signum, frame):
|
||||
if self.child is None:
|
||||
if self.child_process is None:
|
||||
return
|
||||
|
||||
if signum is signal.SIGTERM:
|
||||
self.child.send_signal(signal.SIGTERM)
|
||||
self.child_process.send_signal(signal.SIGTERM)
|
||||
|
||||
if self.signal_handler is not None:
|
||||
if not self.signal_handler in (signal.SIG_IGN, signal.SIG_DFL):
|
||||
self.signal_handler(signum, frame)
|
||||
return
|
||||
|
||||
|
||||
+14
-6
@@ -736,34 +736,42 @@ class TestUpdate(UpdateTestCase):
|
||||
shutil.rmtree(tempdir, True)
|
||||
return
|
||||
|
||||
def test_run_latest_marks_failures(self):
|
||||
def test_run_latest_nonzero_code_marks_failures(self):
|
||||
# logger.add_logger_appender(logger.AppenderType.STDOUT)
|
||||
self.prepare_agents()
|
||||
|
||||
|
||||
latest_agent = self.update_handler.get_latest_agent()
|
||||
self.assertTrue(latest_agent.is_available)
|
||||
self.assertEqual(None, latest_agent.error.last_failure)
|
||||
self.assertEqual(0, latest_agent.error.failure_count)
|
||||
|
||||
# Any non-zero return code marks a failure
|
||||
self._test_run_latest(return_value=1)
|
||||
|
||||
self.assertTrue(latest_agent.is_available)
|
||||
self.assertNotEqual(None, latest_agent.error.last_failure)
|
||||
self.assertEqual(1, latest_agent.error.failure_count)
|
||||
return
|
||||
|
||||
def test_run_latest_missing_code_marks_failures(self):
|
||||
# logger.add_logger_appender(logger.AppenderType.STDOUT)
|
||||
self.prepare_agents()
|
||||
|
||||
latest_agent = self.update_handler.get_latest_agent()
|
||||
self.assertTrue(latest_agent.is_available)
|
||||
self.assertEqual(None, latest_agent.error.last_failure)
|
||||
self.assertEqual(0, latest_agent.error.failure_count)
|
||||
|
||||
# Absence of a return code marks a failure
|
||||
self._test_run_latest(return_value=None)
|
||||
|
||||
self.assertTrue(latest_agent.is_available)
|
||||
self.assertNotEqual(None, latest_agent.error.last_failure)
|
||||
self.assertEqual(2, latest_agent.error.failure_count)
|
||||
self.assertEqual(1, latest_agent.error.failure_count)
|
||||
return
|
||||
|
||||
def test_run_latest_exception_blacklists(self):
|
||||
# logger.add_logger_appender(logger.AppenderType.STDOUT)
|
||||
self.prepare_agents()
|
||||
|
||||
|
||||
latest_agent = self.update_handler.get_latest_agent()
|
||||
self.assertTrue(latest_agent.is_available)
|
||||
self.assertEqual(None, latest_agent.error.last_failure)
|
||||
|
||||
Reference in New Issue
Block a user