diff --git a/instances/tests/test_drbd_target.py b/instances/tests/test_drbd_target.py index dc7f32af..b5290e80 100644 --- a/instances/tests/test_drbd_target.py +++ b/instances/tests/test_drbd_target.py @@ -26,3 +26,29 @@ class DrbdTargetTestCase(unittest.TestCase): ) as run: self.assertEqual(drbd_status(SimpleNamespace(user=None), 1), "None DRBD") self.assertEqual(run.call_args.kwargs["timeout"], DRBD_STATUS_TIMEOUT) + + +STATUS = """webserver role:Primary + disk:UpToDate +web role:Secondary + disk:UpToDate +web_data role:Secondary + disk:Outdated +""" + + +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) + ): + return drbd_status(SimpleNamespace(user=None), 1) + + def test_a_vm_counts_only_its_own_resources(self): + # "webserver" is another VM's resource; "web_data" is web's second disk + self.assertEqual(self.status("web"), "Secondary/NOK") + self.assertEqual(self.status("webserver"), "Primary/OK") + + def test_a_vm_without_a_resource_has_no_drbd(self): + self.assertEqual(self.status("db"), "None DRBD") diff --git a/instances/views.py b/instances/views.py index f3b4a231..31ffb997 100755 --- a/instances/views.py +++ b/instances/views.py @@ -341,13 +341,13 @@ def drbd_status(request, pk): except subprocess.TimeoutExpired: return result - if remoteDrbdStatus.stdout: - instanceFindDrbd = re.compile( - re.escape(instance.name) + "[_]*[A-Z]* role:(.+?)\n disk:(.+?)\n", - re.IGNORECASE, - ) - instanceDrbd = instanceFindDrbd.findall(remoteDrbdStatus.stdout) - + # the VM's resources are its name or its name_SUFFIX, at the start of a line + instanceFindDrbd = re.compile( + "^" + re.escape(instance.name) + "(?:_[A-Z]+)? role:(.+?)\n disk:(.+?)\n", + re.IGNORECASE | re.MULTILINE, + ) + instanceDrbd = instanceFindDrbd.findall(remoteDrbdStatus.stdout or "") + if instanceDrbd: primaryCount = 0 secondaryCount = 0 statusDisk = "OK"