Skip to content

Commit

Permalink
Merge pull request #314 from cgalibern/Fix-invalid-drbd-mesh-capability
Browse files Browse the repository at this point in the history
Fix invalid drbd mesh capability
  • Loading branch information
cgalibern committed Oct 12, 2020
2 parents e263aa1 + ad8282d commit 351c8e7
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 18 deletions.
18 changes: 9 additions & 9 deletions opensvc/drivers/resource/disk/drbd/__init__.py
@@ -1,4 +1,3 @@
import json
import os
import re
import time
Expand All @@ -14,8 +13,7 @@
from core.objects.svcdict import KEYS
from utilities.cache import cache
from utilities.lazy import lazy
from utilities.proc import justcall, call_log
from utilities.converters import convert_size
from utilities.proc import justcall, call_log, which

RE_MINOR = r"^\s*device\s*/dev/drbd([0-9]+).*;"
RE_PORT = r"^\s*address.*:([0-9]+).*;"
Expand Down Expand Up @@ -73,12 +71,16 @@

def driver_capabilities(node=None):
data = []
from utilities.proc import which
if which("drbdadm"):
data.append("disk.drbd")
out, err, ret = justcall(["drbdadm"])
if "Version: 9" in out:
data.append("disk.drbd.mesh")
out, err, ret = justcall(["modinfo", "drbd"])
if ret == 0:
for line in out.splitlines():
details = line.split()
if details[0] == 'version:' and details[1].startswith('9.'):
data.append("disk.drbd.mesh")
return data


Expand Down Expand Up @@ -199,12 +201,10 @@ def __init__(self, res=None, disk=None, **kwargs):
self.drbdadm = None
self.rollback_even_if_standby = True
self.can_rollback_role = False
self.can_rollback_connection = False

def __str__(self):
return "%s resource=%s" % (
super.__str__(DiskDrbd, self),
self.res
)
return "%s resource=%s" % (super(DiskDrbd, self).__str__(), self.res)

def files_to_sync(self):
if os.path.exists(self.cf):
Expand Down
50 changes: 41 additions & 9 deletions opensvc/tests/resource/disk/drbd/test_drbd.py
Expand Up @@ -11,7 +11,7 @@
import core.exceptions as ex
from core.node import Node
from core.objects.svc import Svc
from drivers.resource.disk.drbd import DiskDrbd
from drivers.resource.disk.drbd import DiskDrbd, driver_capabilities


@pytest.fixture(scope='function')
Expand Down Expand Up @@ -85,6 +85,46 @@ def svc_daemon_post(mocker):
return mocker.patch.object(Svc, 'daemon_post', mocker.Mock(side_effect=[{"status": 0}] * 2))


@pytest.fixture(scope='function')
def which(mocker):
return mocker.patch('drivers.resource.disk.drbd.which')


@pytest.mark.ci
@pytest.mark.usefixtures('osvc_path_tests') # for cache
class TestDrbdCapabilities:
@staticmethod
def test_has_no_drbd_capabilities_when_drbdadm_is_not_present(which):
which.return_value = None
assert "disk.drbd" not in driver_capabilities()
assert "disk.drbd.mesh" not in driver_capabilities()

@staticmethod
def test_has_disk_drbd_if_drbdadm_exists(which, just_call):
just_call.side_effect = [("", "", 0)]
assert 'disk.drbd' in driver_capabilities()

@staticmethod
def test_doesnot_have_disk_drbd_mesh_if_modinfo_report_version_8(which, just_call):
just_call.side_effect = [
("Version: 9.15.0", "", 0), # drbdadm output
("version: 8.0.25-1", "", 0), # modinfo drbd output
]
capabilities = driver_capabilities()
assert "disk.drbd" in capabilities
assert "disk.drbd.mesh" not in capabilities

@staticmethod
def test_has_disk_drbd_mesh_if_modinfo_report_version_9(which, just_call):
just_call.side_effect = [
("Version: 9.15.0", "", 0), # drbdadm output
("version: 9.0.25-1", "", 0), # modinfo drbd output
]
capabilities = driver_capabilities()
assert "disk.drbd" in capabilities
assert "disk.drbd.mesh" in capabilities


@pytest.mark.ci
@pytest.mark.usefixtures('osvc_path_tests') # for cache
class TestDrbdWriteConfig:
Expand Down Expand Up @@ -377,14 +417,6 @@ def test_raise_when_role_cmd_return_non_0(sleep, mocker, just_call, disk):
with pytest.raises(ex.Error):
disk.get_cstate()

@staticmethod
def test_raise_when_role_cmd_return_non_0(sleep, mocker, just_call, disk):
mocker.patch.object(DiskDrbd, 'prereq', mocker.Mock())
just_call.side_effect = [('', '', 1)]
disk.drbdadm = "drbdadm"
with pytest.raises(ex.Error):
disk.get_cstate()

@staticmethod
@pytest.mark.parametrize('cstate_just_result', [('', '', 10), ('', 'Device minor not allocated', 1)])
def test_return_unattached_examples(sleep, mocker, just_call, cstate_just_result, disk):
Expand Down

0 comments on commit 351c8e7

Please sign in to comment.