From f3dca3bfa3d53b7e7a5500f302d89bed0dc04173 Mon Sep 17 00:00:00 2001 From: Jan Fajerski Date: Wed, 15 Jan 2020 15:55:45 +0100 Subject: [PATCH] ceph-volume: fix device unittest, mock has_bluestore_label, lint This also adds a test case for has_bluestore_label. Fixes: https://tracker.ceph.com/issues/43611 Signed-off-by: Jan Fajerski (cherry picked from commit 91c7f5189d163ca517c643b8548a2e16176392cc) --- .../ceph_volume/devices/raw/activate.py | 8 +-- .../ceph_volume/devices/raw/create.py | 3 +- .../ceph_volume/devices/raw/list.py | 8 +-- .../ceph_volume/devices/raw/prepare.py | 5 +- .../ceph_volume/devices/raw/scan.py | 23 --------- src/ceph-volume/ceph_volume/tests/conftest.py | 13 ++++- .../ceph_volume/tests/util/test_device.py | 50 ++++++++++++++++--- 7 files changed, 59 insertions(+), 51 deletions(-) delete mode 100644 src/ceph-volume/ceph_volume/devices/raw/scan.py diff --git a/src/ceph-volume/ceph_volume/devices/raw/activate.py b/src/ceph-volume/ceph_volume/devices/raw/activate.py index bb5454d9c087e..44164c844dfe7 100644 --- a/src/ceph-volume/ceph_volume/devices/raw/activate.py +++ b/src/ceph-volume/ceph_volume/devices/raw/activate.py @@ -3,12 +3,9 @@ import argparse import logging import os from textwrap import dedent -from ceph_volume import process, conf, decorators, terminal, __release__, configuration -from ceph_volume.util import system, disk +from ceph_volume import process, conf, decorators, terminal +from ceph_volume.util import system from ceph_volume.util import prepare as prepare_utils -from ceph_volume.util import encryption as encryption_utils -from ceph_volume.systemd import systemctl -from ceph_volume.api import lvm as api from .list import direct_report @@ -17,7 +14,6 @@ logger = logging.getLogger(__name__) def activate_bluestore(meta, tmpfs, systemd): # find the osd osd_id = meta['osd_id'] - osd_fsid = meta['osd_uuid'] # mount on tmpfs the osd directory osd_path = '/var/lib/ceph/osd/%s-%s' % (conf.cluster, osd_id) diff --git a/src/ceph-volume/ceph_volume/devices/raw/create.py b/src/ceph-volume/ceph_volume/devices/raw/create.py index 97e38582709f2..fb633c7ffca15 100644 --- a/src/ceph-volume/ceph_volume/devices/raw/create.py +++ b/src/ceph-volume/ceph_volume/devices/raw/create.py @@ -2,7 +2,6 @@ from __future__ import print_function from textwrap import dedent import logging from ceph_volume.util import system -from ceph_volume.util.arg_validators import exclude_group_options from ceph_volume import decorators, terminal from .prepare import Prepare from .activate import Activate @@ -76,7 +75,7 @@ class Create(object): if not self.args.bluestore: terminal.error('must specify --bluestore (currently the only supported backend)') raise SystemExit(1) - if not args.no_systemd: + if not self.args.no_systemd: terminal.error('systemd support not yet implemented') raise SystemExit(1) self.create(self.args) diff --git a/src/ceph-volume/ceph_volume/devices/raw/list.py b/src/ceph-volume/ceph_volume/devices/raw/list.py index 7e526d3f8b156..5d610c7a02425 100644 --- a/src/ceph-volume/ceph_volume/devices/raw/list.py +++ b/src/ceph-volume/ceph_volume/devices/raw/list.py @@ -1,15 +1,9 @@ from __future__ import print_function import argparse -import base64 import json import logging -import os from textwrap import dedent -from ceph_volume import decorators, terminal, conf, process -from ceph_volume.api import lvm -from ceph_volume.systemd import systemctl -from ceph_volume.util import arg_validators, system, disk, encryption -from ceph_volume.util.device import Device +from ceph_volume import decorators, process logger = logging.getLogger(__name__) diff --git a/src/ceph-volume/ceph_volume/devices/raw/prepare.py b/src/ceph-volume/ceph_volume/devices/raw/prepare.py index ff59b6f9a24e2..751630563737a 100644 --- a/src/ceph-volume/ceph_volume/devices/raw/prepare.py +++ b/src/ceph-volume/ceph_volume/devices/raw/prepare.py @@ -1,11 +1,9 @@ from __future__ import print_function -import argparse import json import logging from textwrap import dedent from ceph_volume.util import prepare as prepare_utils -from ceph_volume.util import encryption as encryption_utils -from ceph_volume.util import system, disk +from ceph_volume.util import system from ceph_volume import conf, decorators, terminal from ceph_volume.devices.lvm.common import rollback_osd from .common import create_parser @@ -79,7 +77,6 @@ class Prepare(object): @decorators.needs_root def prepare(self): secrets = {'cephx_secret': prepare_utils.create_key()} - cluster_fsid = self.get_cluster_fsid() osd_fsid = self.args.osd_fsid or system.generate_uuid() crush_device_class = self.args.crush_device_class if crush_device_class: diff --git a/src/ceph-volume/ceph_volume/devices/raw/scan.py b/src/ceph-volume/ceph_volume/devices/raw/scan.py deleted file mode 100644 index 604e11c5ea93f..0000000000000 --- a/src/ceph-volume/ceph_volume/devices/raw/scan.py +++ /dev/null @@ -1,23 +0,0 @@ -from __future__ import print_function -import argparse -import base64 -import json -import logging -import os -from textwrap import dedent -from ceph_volume import decorators, terminal, conf -from ceph_volume.api import lvm -from ceph_volume.systemd import systemctl -from ceph_volume.util import arg_validators, system, disk, encryption -from ceph_volume.util.device import Device - - -logger = logging.getLogger(__name__) - -class Scan(object): - - help = 'Capture metadata from all running ceph-disk OSDs, OSD data partition or directory' - - def __init__(self, argv): - self.argv = argv - self._etc_path = '/etc/ceph/osd/' diff --git a/src/ceph-volume/ceph_volume/tests/conftest.py b/src/ceph-volume/ceph_volume/tests/conftest.py index b108ce2f1256f..bdef97ae3c670 100644 --- a/src/ceph-volume/ceph_volume/tests/conftest.py +++ b/src/ceph-volume/ceph_volume/tests/conftest.py @@ -1,5 +1,6 @@ import os import pytest +from mock.mock import patch, PropertyMock from ceph_volume.util import disk from ceph_volume.util.constants import ceph_disk_guids from ceph_volume.api import lvm as lvm_api @@ -265,8 +266,16 @@ def device_info_not_ceph_disk_member(monkeypatch, request): @pytest.fixture -def device_info(monkeypatch): - def apply(devices=None, lsblk=None, lv=None, blkid=None, udevadm=None): +def patch_bluestore_label(): + with patch('ceph_volume.util.device.Device.has_bluestore_label', + new_callable=PropertyMock) as p: + p.return_value = False + yield p + +@pytest.fixture +def device_info(monkeypatch, patch_bluestore_label): + def apply(devices=None, lsblk=None, lv=None, blkid=None, udevadm=None, + has_bluestore_label=False): devices = devices if devices else {} lsblk = lsblk if lsblk else {} blkid = blkid if blkid else {} diff --git a/src/ceph-volume/ceph_volume/tests/util/test_device.py b/src/ceph-volume/ceph_volume/tests/util/test_device.py index 7477777bc8d57..57595117d2a3d 100644 --- a/src/ceph-volume/ceph_volume/tests/util/test_device.py +++ b/src/ceph-volume/ceph_volume/tests/util/test_device.py @@ -139,14 +139,14 @@ class TestDevice(object): @pytest.mark.usefixtures("lsblk_ceph_disk_member", "disable_kernel_queries", "disable_lvm_queries") - def test_is_ceph_disk_lsblk(self, monkeypatch): + def test_is_ceph_disk_lsblk(self, monkeypatch, patch_bluestore_label): disk = device.Device("/dev/sda") assert disk.is_ceph_disk_member @pytest.mark.usefixtures("blkid_ceph_disk_member", "disable_kernel_queries", "disable_lvm_queries") - def test_is_ceph_disk_blkid(self, monkeypatch): + def test_is_ceph_disk_blkid(self, monkeypatch, patch_bluestore_label): monkeypatch.setattr("ceph_volume.util.device.disk.lsblk", lambda path: {'PARTLABEL': ""}) disk = device.Device("/dev/sda") @@ -155,7 +155,7 @@ class TestDevice(object): @pytest.mark.usefixtures("lsblk_ceph_disk_member", "disable_kernel_queries", "disable_lvm_queries") - def test_is_ceph_disk_member_not_available_lsblk(self, monkeypatch): + def test_is_ceph_disk_member_not_available_lsblk(self, monkeypatch, patch_bluestore_label): disk = device.Device("/dev/sda") assert disk.is_ceph_disk_member assert not disk.available @@ -164,7 +164,7 @@ class TestDevice(object): @pytest.mark.usefixtures("blkid_ceph_disk_member", "disable_kernel_queries", "disable_lvm_queries") - def test_is_ceph_disk_member_not_available_blkid(self, monkeypatch): + def test_is_ceph_disk_member_not_available_blkid(self, monkeypatch, patch_bluestore_label): monkeypatch.setattr("ceph_volume.util.device.disk.lsblk", lambda path: {'PARTLABEL': ""}) disk = device.Device("/dev/sda") @@ -172,10 +172,46 @@ class TestDevice(object): assert not disk.available assert "Used by ceph-disk" in disk.rejected_reasons + def test_reject_removable_device(self, device_info): + data = {"/dev/sdb": {"removable": 1}} + device_info(devices=data) + disk = device.Device("/dev/sdb") + assert not disk.available + + def test_accept_non_removable_device(self, device_info): + data = {"/dev/sdb": {"removable": 0, "size": 5368709120}} + device_info(devices=data) + disk = device.Device("/dev/sdb") + assert disk.available + + def test_reject_readonly_device(self, device_info): + data = {"/dev/cdrom": {"ro": 1}} + device_info(devices=data) + disk = device.Device("/dev/cdrom") + assert not disk.available + + def test_reject_smaller_than_5gb(self, device_info): + data = {"/dev/sda": {"size": 5368709119}} + device_info(devices=data) + disk = device.Device("/dev/sda") + assert not disk.available, 'too small device is available' + + def test_accept_non_readonly_device(self, device_info): + data = {"/dev/sda": {"ro": 0, "size": 5368709120}} + device_info(devices=data) + disk = device.Device("/dev/sda") + assert disk.available + + def test_reject_bluestore_device(self, monkeypatch, patch_bluestore_label): + patch_bluestore_label.return_value = True + disk = device.Device("/dev/sda") + assert not disk.available + assert "Has BlueStore device label" in disk.rejected_reasons + @pytest.mark.usefixtures("device_info_not_ceph_disk_member", "disable_lvm_queries", "disable_kernel_queries") - def test_is_not_ceph_disk_member_lsblk(self): + def test_is_not_ceph_disk_member_lsblk(self, patch_bluestore_label): disk = device.Device("/dev/sda") assert disk.is_ceph_disk_member is False @@ -387,7 +423,7 @@ class TestCephDiskDevice(object): @pytest.mark.usefixtures("blkid_ceph_disk_member", "disable_kernel_queries", "disable_lvm_queries") - def test_is_member_blkid(self, monkeypatch): + def test_is_member_blkid(self, monkeypatch, patch_bluestore_label): monkeypatch.setattr("ceph_volume.util.device.disk.lsblk", lambda path: {'PARTLABEL': ""}) disk = device.CephDiskDevice(device.Device("/dev/sda")) @@ -421,7 +457,7 @@ class TestCephDiskDevice(object): @pytest.mark.usefixtures("lsblk_ceph_disk_member", "disable_kernel_queries", "disable_lvm_queries") - def test_is_member_lsblk(self): + def test_is_member_lsblk(self, patch_bluestore_label): disk = device.CephDiskDevice(device.Device("/dev/sda")) assert disk.is_member is True -- 2.39.5