From d53aafeb94699535e5b872b8a443c12ee52d090e Mon Sep 17 00:00:00 2001 From: Andrew Schoen Date: Thu, 14 Mar 2019 15:14:40 -0500 Subject: [PATCH] ceph-volume: look for rotational data in lsblk Also ask lsblk if a device is rotational if no information is found in /sys/block, default to True if nothing is found. Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1666822 Signed-off-by: Andrew Schoen (cherry picked from commit de748f9aef894b247622ee5dc49c1fbc31097ad0) --- .../ceph_volume/tests/util/test_device.py | 36 +++++++++++++++++++ src/ceph-volume/ceph_volume/util/device.py | 7 +++- 2 files changed, 42 insertions(+), 1 deletion(-) 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 7eea92ecd0c52..dca379cbbefec 100644 --- a/src/ceph-volume/ceph_volume/tests/util/test_device.py +++ b/src/ceph-volume/ceph_volume/tests/util/test_device.py @@ -57,6 +57,42 @@ class TestDevice(object): disk = device.Device("/dev/sda") assert disk.is_device is True + def test_device_is_rotational(self, device_info, pvolumes): + data = {"/dev/sda": {"rotational": "1"}} + lsblk = {"TYPE": "device"} + device_info(devices=data, lsblk=lsblk) + disk = device.Device("/dev/sda") + assert disk.rotational + + def test_device_is_not_rotational(self, device_info, pvolumes): + data = {"/dev/sda": {"rotational": "0"}} + lsblk = {"TYPE": "device"} + device_info(devices=data, lsblk=lsblk) + disk = device.Device("/dev/sda") + assert not disk.rotational + + def test_device_is_rotational_lsblk(self, device_info, pvolumes): + data = {"/dev/sda": {"foo": "bar"}} + lsblk = {"TYPE": "device", "ROTA": "1"} + device_info(devices=data, lsblk=lsblk) + disk = device.Device("/dev/sda") + assert disk.rotational + + def test_device_is_not_rotational_lsblk(self, device_info, pvolumes): + data = {"/dev/sda": {"rotational": "0"}} + lsblk = {"TYPE": "device", "ROTA": "0"} + device_info(devices=data, lsblk=lsblk) + disk = device.Device("/dev/sda") + assert not disk.rotational + + def test_device_is_rotational_defaults_true(self, device_info, pvolumes): + # rotational will default true if no info from sys_api or lsblk is found + data = {"/dev/sda": {"foo": "bar"}} + lsblk = {"TYPE": "device", "foo": "bar"} + device_info(devices=data, lsblk=lsblk) + disk = device.Device("/dev/sda") + assert disk.rotational + def test_disk_is_device(self, device_info, pvolumes): data = {"/dev/sda": {"foo": "bar"}} lsblk = {"TYPE": "disk"} diff --git a/src/ceph-volume/ceph_volume/util/device.py b/src/ceph-volume/ceph_volume/util/device.py index 041f0d7ed5a4c..f06cb41ee4e9a 100644 --- a/src/ceph-volume/ceph_volume/util/device.py +++ b/src/ceph-volume/ceph_volume/util/device.py @@ -270,7 +270,12 @@ class Device(object): @property def rotational(self): - return self.sys_api['rotational'] == '1' + rotational = self.sys_api.get('rotational') + if rotational is None: + # fall back to lsblk if not found in sys_api + # default to '1' if no value is found with lsblk either + rotational = self.disk_api.get('ROTA', '1') + return rotational == '1' @property def model(self): -- 2.39.5