diff --git a/instances/tests/test_drbd_target.py b/instances/tests/test_drbd_target.py index b5290e80..0472da86 100644 --- a/instances/tests/test_drbd_target.py +++ b/instances/tests/test_drbd_target.py @@ -1,6 +1,7 @@ """drbd_status runs ssh with the compute's login@hostname; a compute whose values would inject an ssh option (an existing or bypassed row) is skipped, -and a compute that does not answer in time leaves the status unknown.""" +and a compute that does not answer in time, or an ssh that fails, leaves +the status unknown, not "None DRBD".""" import subprocess import unittest @@ -24,9 +25,16 @@ class DrbdTargetTestCase(unittest.TestCase): with patch("instances.views.get_instance", return_value=vm), patch( "instances.views.subprocess.run", side_effect=subprocess.TimeoutExpired("ssh", DRBD_STATUS_TIMEOUT) ) as run: - self.assertEqual(drbd_status(SimpleNamespace(user=None), 1), "None DRBD") + self.assertEqual(drbd_status(SimpleNamespace(user=None), 1), "Unknown") self.assertEqual(run.call_args.kwargs["timeout"], DRBD_STATUS_TIMEOUT) + def test_a_failed_ssh_leaves_the_status_unknown(self): + vm = SimpleNamespace(name="vm1", compute=SimpleNamespace(type=2, login="root", hostname="192.0.2.1")) + with patch("instances.views.get_instance", return_value=vm), patch( + "instances.views.subprocess.run", return_value=SimpleNamespace(returncode=255, stdout="") + ): + self.assertEqual(drbd_status(SimpleNamespace(user=None), 1), "Unknown") + STATUS = """webserver role:Primary disk:UpToDate @@ -41,7 +49,7 @@ class DrbdStatusTestCase(unittest.TestCase): def status(self, name, stdout=STATUS): vm = SimpleNamespace(name=name, compute=SimpleNamespace(type=2, login="root", hostname="192.0.2.1")) with patch("instances.views.get_instance", return_value=vm), patch( - "instances.views.subprocess.run", return_value=SimpleNamespace(stdout=stdout) + "instances.views.subprocess.run", return_value=SimpleNamespace(returncode=0, stdout=stdout) ): return drbd_status(SimpleNamespace(user=None), 1) diff --git a/instances/views.py b/instances/views.py index d951b993..801993e8 100755 --- a/instances/views.py +++ b/instances/views.py @@ -415,8 +415,10 @@ def drbd_status(request, pk): text=True, timeout=DRBD_STATUS_TIMEOUT, ) - except subprocess.TimeoutExpired: - return result + except (subprocess.TimeoutExpired, OSError): + return _("Unknown") # not "None DRBD": the compute did not tell + if remoteDrbdStatus.returncode != 0: + return _("Unknown") # the VM's resources are its name or its name_SUFFIX, at the start of a line instanceFindDrbd = re.compile(