]> git.proxmox.com Git - ceph.git/blobdiff - ceph/src/ceph-volume/ceph_volume/tests/util/test_disk.py
import new upstream nautilus stable release 14.2.8
[ceph.git] / ceph / src / ceph-volume / ceph_volume / tests / util / test_disk.py
index e40c982d1f7e9f7cb2991b6f6f58f8647947d363..5f4d57343e4c2516e2ff9d540bfa59285fa441d0 100644 (file)
@@ -1,5 +1,6 @@
 import os
 import pytest
+from mock.mock import patch
 from ceph_volume.util import disk
 
 
@@ -101,90 +102,6 @@ class TestDeviceFamily(object):
             assert parsed['NAME'] in names
 
 
-class TestMapDevPaths(object):
-
-    def test_errors_return_empty_mapping(self, tmpdir):
-        bad_dir = os.path.join(str(tmpdir), 'nonexisting')
-        assert disk._map_dev_paths(bad_dir) == {}
-
-    def test_base_name_and_abspath(self, tmpfile):
-        sda_path = tmpfile(name='sda', contents='')
-        directory = os.path.dirname(sda_path)
-        result = disk._map_dev_paths(directory)
-        assert len(result.keys()) == 1
-        assert result['sda'] == sda_path
-
-    def test_abspath_included(self, tmpfile):
-        sda_path = tmpfile(name='sda', contents='')
-        directory = os.path.dirname(sda_path)
-        result = disk._map_dev_paths(directory, include_abspath=True)
-        assert sorted(result.keys()) == sorted(['sda', sda_path])
-        assert result['sda'] == sda_path
-        assert result[sda_path] == 'sda'
-
-    def test_realpath_included(self, tmpfile):
-        sda_path = tmpfile(name='sda', contents='')
-        directory = os.path.dirname(sda_path)
-        dm_path = os.path.join(directory, 'dm-0')
-        os.symlink(sda_path, os.path.join(directory, 'dm-0'))
-        result = disk._map_dev_paths(directory, include_realpath=True)
-        assert sorted(result.keys()) == sorted(['sda', 'dm-0'])
-        assert result['sda'] == dm_path
-        assert result['dm-0'] == dm_path
-
-    def test_absolute_and_realpath_included(self, tmpfile):
-        dm_path = tmpfile(name='dm-0', contents='')
-        directory = os.path.dirname(dm_path)
-        sda_path = os.path.join(directory, 'sda')
-        os.symlink(sda_path, os.path.join(directory, 'sda'))
-        result = disk._map_dev_paths(directory, include_realpath=True, include_abspath=True)
-        assert sorted(result.keys()) == sorted([dm_path, sda_path, 'sda', 'dm-0'])
-        assert result['sda'] == sda_path
-        assert result['dm-0'] == dm_path
-        assert result[sda_path] == sda_path
-        assert result[dm_path] == 'dm-0'
-
-
-class TestGetBlockDevs(object):
-
-    def test_loop_devices_are_missing(self, tmpfile):
-        path = os.path.dirname(tmpfile(name='loop0', contents=''))
-        result = disk.get_block_devs(sys_block_path=path)
-        assert result == []
-
-    def test_loop_devices_are_included(self, tmpfile):
-        path = os.path.dirname(tmpfile(name='loop0', contents=''))
-        result = disk.get_block_devs(sys_block_path=path, skip_loop=False)
-        assert len(result) == 1
-        assert result == ['loop0']
-
-
-class TestGetDevDevs(object):
-
-    def test_abspaths_are_included(self, tmpfile):
-        sda_path = tmpfile(name='sda', contents='')
-        directory = os.path.dirname(sda_path)
-        result = disk.get_dev_devs(directory)
-        assert sorted(result.keys()) == sorted(['sda', sda_path])
-        assert result['sda'] == sda_path
-        assert result[sda_path] == 'sda'
-
-
-class TestGetMapperDevs(object):
-
-    def test_abspaths_and_realpaths_are_included(self, tmpfile):
-        dm_path = tmpfile(name='dm-0', contents='')
-        directory = os.path.dirname(dm_path)
-        sda_path = os.path.join(directory, 'sda')
-        os.symlink(sda_path, os.path.join(directory, 'sda'))
-        result = disk.get_mapper_devs(directory)
-        assert sorted(result.keys()) == sorted([dm_path, sda_path, 'sda', 'dm-0'])
-        assert result['sda'] == sda_path
-        assert result['dm-0'] == dm_path
-        assert result[sda_path] == sda_path
-        assert result[dm_path] == 'dm-0'
-
-
 class TestHumanReadableSize(object):
 
     def test_bytes(self):
@@ -208,163 +125,200 @@ class TestHumanReadableSize(object):
         assert result == '81.20 TB'
 
 
+class TestSizeFromHumanReadable(object):
+
+    def test_bytes(self):
+        result = disk.size_from_human_readable('2')
+        assert result == disk.Size(b=2)
+
+    def test_kilobytes(self):
+        result = disk.size_from_human_readable('2 K')
+        assert result == disk.Size(kb=2)
+
+    def test_megabytes(self):
+        result = disk.size_from_human_readable('2 M')
+        assert result == disk.Size(mb=2)
+
+    def test_gigabytes(self):
+        result = disk.size_from_human_readable('2 G')
+        assert result == disk.Size(gb=2)
+
+    def test_terrabytes(self):
+        result = disk.size_from_human_readable('2 T')
+        assert result == disk.Size(tb=2)
+
+    def test_case(self):
+        result = disk.size_from_human_readable('2 t')
+        assert result == disk.Size(tb=2)
+
+    def test_space(self):
+        result = disk.size_from_human_readable('2T')
+        assert result == disk.Size(tb=2)
+
+    def test_float(self):
+        result = disk.size_from_human_readable('2.0')
+        assert result == disk.Size(b=2)
+        result = disk.size_from_human_readable('2.0T')
+        assert result == disk.Size(tb=2)
+        result = disk.size_from_human_readable('1.8T')
+        assert result == disk.Size(tb=1.8)
+
+
+class TestSizeParse(object):
+
+    def test_bytes(self):
+        result = disk.Size.parse('2')
+        assert result == disk.Size(b=2)
+
+    def test_kilobytes(self):
+        result = disk.Size.parse('2K')
+        assert result == disk.Size(kb=2)
+
+    def test_megabytes(self):
+        result = disk.Size.parse('2M')
+        assert result == disk.Size(mb=2)
+
+    def test_gigabytes(self):
+        result = disk.Size.parse('2G')
+        assert result == disk.Size(gb=2)
+
+    def test_terrabytes(self):
+        result = disk.Size.parse('2T')
+        assert result == disk.Size(tb=2)
+
+    def test_tb(self):
+        result = disk.Size.parse('2Tb')
+        assert result == disk.Size(tb=2)
+
+    def test_case(self):
+        result = disk.Size.parse('2t')
+        assert result == disk.Size(tb=2)
+
+    def test_space(self):
+        result = disk.Size.parse('2T')
+        assert result == disk.Size(tb=2)
+
+    def test_float(self):
+        result = disk.Size.parse('2.0')
+        assert result == disk.Size(b=2)
+        result = disk.Size.parse('2.0T')
+        assert result == disk.Size(tb=2)
+        result = disk.Size.parse('1.8T')
+        assert result == disk.Size(tb=1.8)
+
+
+class TestGetBlockDevsLsblk(object):
+
+    @patch('ceph_volume.process.call')
+    def test_return_structure(self, patched_call):
+        lsblk_stdout = [
+                       '/dev/dm-0 /dev/mapper/ceph--8b2684eb--56ff--49e4--8f28--522e04cbd6ab-osd--data--9fc29fbf--3b5b--4066--be10--61042569b5a7 lvm',
+                       '/dev/vda  /dev/vda                                                                                                       disk',
+                       '/dev/vda1 /dev/vda1                                                                                                      part',
+                       '/dev/vdb  /dev/vdb                                                                                                       disk',]
+        patched_call.return_value = (lsblk_stdout, '', 0)
+        disks = disk.get_block_devs_lsblk()
+        assert len(disks) == len(lsblk_stdout)
+        assert len(disks[0]) == 3
+
+    @patch('ceph_volume.process.call')
+    def test_empty_lsblk(self, patched_call):
+        patched_call.return_value = ([], '', 0)
+        disks = disk.get_block_devs_lsblk()
+        assert len(disks) == 0
+
+    @patch('ceph_volume.process.call')
+    def test_raise_on_failure(self, patched_call):
+        patched_call.return_value = ([], 'error', 1)
+        with pytest.raises(OSError):
+            disk.get_block_devs_lsblk()
+
+
 class TestGetDevices(object):
 
-    def setup_paths(self, tmpdir):
-        paths = []
-        for directory in ['block', 'dev', 'mapper']:
-            path = os.path.join(str(tmpdir), directory)
-            paths.append(path)
-            os.makedirs(path)
-        return paths
-
-    def test_no_devices_are_found(self, tmpdir):
-        result = disk.get_devices(
-            _sys_block_path=str(tmpdir),
-            _dev_path=str(tmpdir),
-            _mapper_path=str(tmpdir))
-        assert result == {}
+    def setup_path(self, tmpdir):
+        path = os.path.join(str(tmpdir), 'block')
+        os.makedirs(path)
+        return path
 
-    def test_no_devices_are_found_errors(self, tmpdir):
-        block_path, dev_path, mapper_path = self.setup_paths(tmpdir)
-        os.makedirs(os.path.join(block_path, 'sda'))
-        result = disk.get_devices(
-            _sys_block_path=block_path, # has 1 device
-            _dev_path=str(tmpdir), # exists but no devices
-            _mapper_path='/does/not/exist/path') # does not exist
+    def test_no_devices_are_found(self, tmpdir, patched_get_block_devs_lsblk):
+        patched_get_block_devs_lsblk.return_value = []
+        result = disk.get_devices(_sys_block_path=str(tmpdir))
         assert result == {}
 
-    def test_sda_block_is_found(self, tmpfile, tmpdir):
-        block_path, dev_path, mapper_path = self.setup_paths(tmpdir)
-        dev_sda_path = os.path.join(dev_path, 'sda')
+    def test_sda_block_is_found(self, tmpdir, patched_get_block_devs_lsblk):
+        sda_path = '/dev/sda'
+        patched_get_block_devs_lsblk.return_value = [[sda_path, sda_path, 'disk']]
+        block_path = self.setup_path(tmpdir)
         os.makedirs(os.path.join(block_path, 'sda'))
-        os.makedirs(dev_sda_path)
-        result = disk.get_devices(
-            _sys_block_path=block_path,
-            _dev_path=dev_path,
-            _mapper_path=mapper_path)
+        result = disk.get_devices(_sys_block_path=block_path)
         assert len(result.keys()) == 1
-        assert result[dev_sda_path]['human_readable_size'] == '0.00 B'
-        assert result[dev_sda_path]['model'] == ''
-        assert result[dev_sda_path]['partitions'] == {}
-
-
-    def test_dm_device_is_not_used(self, monkeypatch, tmpdir):
-        # the link to the mapper is used instead
-        monkeypatch.setattr(disk.lvm, 'is_lv', lambda: True)
-        block_path, dev_path, mapper_path = self.setup_paths(tmpdir)
-        dev_dm_path = os.path.join(dev_path, 'dm-0')
-        ceph_data_path = os.path.join(mapper_path, 'ceph-data')
-        os.symlink(dev_dm_path, ceph_data_path)
-        block_dm_path = os.path.join(block_path, 'dm-0')
-        os.makedirs(block_dm_path)
-
-        result = disk.get_devices(
-            _sys_block_path=block_path,
-            _dev_path=dev_path,
-            _mapper_path=mapper_path)
-        result = list(result.keys())
-        assert len(result) == 1
-        assert result == [ceph_data_path]
-
-    def test_sda1_partition(self, tmpfile, tmpdir):
-        block_path, dev_path, mapper_path = self.setup_paths(tmpdir)
-        block_sda_path = os.path.join(block_path, 'sda')
-        block_sda1_path = os.path.join(block_sda_path, 'sda1')
-        block_sda1_holders = os.path.join(block_sda1_path, 'holders')
-        dev_sda_path = os.path.join(dev_path, 'sda')
-        dev_sda1_path = os.path.join(dev_path, 'sda1')
-        os.makedirs(block_sda_path)
-        os.makedirs(block_sda1_path)
-        os.makedirs(dev_sda1_path)
-        os.makedirs(block_sda1_holders)
-        os.makedirs(dev_sda_path)
-        tmpfile('size', '1024', directory=block_sda_path)
-        tmpfile('partition', '1', directory=block_sda1_path)
-        result = disk.get_devices(
-            _sys_block_path=block_path,
-            _dev_path=dev_path,
-            _mapper_path=mapper_path)
-        assert dev_sda_path in list(result.keys())
-        assert '/dev/sda1' in list(result.keys())
-        assert result['/dev/sda1']['holders'] == []
-
-    def test_sda_size(self, tmpfile, tmpdir):
-        block_path, dev_path, mapper_path = self.setup_paths(tmpdir)
+        assert result[sda_path]['human_readable_size'] == '0.00 B'
+        assert result[sda_path]['model'] == ''
+        assert result[sda_path]['partitions'] == {}
+
+
+    def test_sda_size(self, tmpfile, tmpdir, patched_get_block_devs_lsblk):
+        sda_path = '/dev/sda'
+        patched_get_block_devs_lsblk.return_value = [[sda_path, sda_path, 'disk']]
+        block_path = self.setup_path(tmpdir)
         block_sda_path = os.path.join(block_path, 'sda')
-        dev_sda_path = os.path.join(dev_path, 'sda')
         os.makedirs(block_sda_path)
-        os.makedirs(dev_sda_path)
         tmpfile('size', '1024', directory=block_sda_path)
-        result = disk.get_devices(
-            _sys_block_path=block_path,
-            _dev_path=dev_path,
-            _mapper_path=mapper_path)
-        assert list(result.keys()) == [dev_sda_path]
-        assert result[dev_sda_path]['human_readable_size'] == '512.00 KB'
-
-    def test_sda_sectorsize_fallsback(self, tmpfile, tmpdir):
+        result = disk.get_devices(_sys_block_path=block_path)
+        assert list(result.keys()) == [sda_path]
+        assert result[sda_path]['human_readable_size'] == '512.00 KB'
+
+    def test_sda_sectorsize_fallsback(self, tmpfile, tmpdir, patched_get_block_devs_lsblk):
         # if no sectorsize, it will use queue/hw_sector_size
-        block_path, dev_path, mapper_path = self.setup_paths(tmpdir)
+        sda_path = '/dev/sda'
+        patched_get_block_devs_lsblk.return_value = [[sda_path, sda_path, 'disk']]
+        block_path = self.setup_path(tmpdir)
         block_sda_path = os.path.join(block_path, 'sda')
         sda_queue_path = os.path.join(block_sda_path, 'queue')
-        dev_sda_path = os.path.join(dev_path, 'sda')
         os.makedirs(block_sda_path)
         os.makedirs(sda_queue_path)
-        os.makedirs(dev_sda_path)
         tmpfile('hw_sector_size', contents='1024', directory=sda_queue_path)
-        result = disk.get_devices(
-            _sys_block_path=block_path,
-            _dev_path=dev_path,
-            _mapper_path=mapper_path)
-        assert list(result.keys()) == [dev_sda_path]
-        assert result[dev_sda_path]['sectorsize'] == '1024'
-
-    def test_sda_sectorsize_from_logical_block(self, tmpfile, tmpdir):
-        block_path, dev_path, mapper_path = self.setup_paths(tmpdir)
+        result = disk.get_devices(_sys_block_path=block_path)
+        assert list(result.keys()) == [sda_path]
+        assert result[sda_path]['sectorsize'] == '1024'
+
+    def test_sda_sectorsize_from_logical_block(self, tmpfile, tmpdir, patched_get_block_devs_lsblk):
+        sda_path = '/dev/sda'
+        patched_get_block_devs_lsblk.return_value = [[sda_path, sda_path, 'disk']]
+        block_path = self.setup_path(tmpdir)
         block_sda_path = os.path.join(block_path, 'sda')
         sda_queue_path = os.path.join(block_sda_path, 'queue')
-        dev_sda_path = os.path.join(dev_path, 'sda')
         os.makedirs(block_sda_path)
         os.makedirs(sda_queue_path)
-        os.makedirs(dev_sda_path)
         tmpfile('logical_block_size', contents='99', directory=sda_queue_path)
-        result = disk.get_devices(
-            _sys_block_path=block_path,
-            _dev_path=dev_path,
-            _mapper_path=mapper_path)
-        assert result[dev_sda_path]['sectorsize'] == '99'
-
-    def test_sda_sectorsize_does_not_fallback(self, tmpfile, tmpdir):
-        block_path, dev_path, mapper_path = self.setup_paths(tmpdir)
+        result = disk.get_devices(_sys_block_path=block_path)
+        assert result[sda_path]['sectorsize'] == '99'
+
+    def test_sda_sectorsize_does_not_fallback(self, tmpfile, tmpdir, patched_get_block_devs_lsblk):
+        sda_path = '/dev/sda'
+        patched_get_block_devs_lsblk.return_value = [[sda_path, sda_path, 'disk']]
+        block_path = self.setup_path(tmpdir)
         block_sda_path = os.path.join(block_path, 'sda')
         sda_queue_path = os.path.join(block_sda_path, 'queue')
-        dev_sda_path = os.path.join(dev_path, 'sda')
         os.makedirs(block_sda_path)
         os.makedirs(sda_queue_path)
-        os.makedirs(dev_sda_path)
         tmpfile('logical_block_size', contents='99', directory=sda_queue_path)
         tmpfile('hw_sector_size', contents='1024', directory=sda_queue_path)
-        result = disk.get_devices(
-            _sys_block_path=block_path,
-            _dev_path=dev_path,
-            _mapper_path=mapper_path)
-        assert result[dev_sda_path]['sectorsize'] == '99'
-
-    def test_is_rotational(self, tmpfile, tmpdir):
-        block_path, dev_path, mapper_path = self.setup_paths(tmpdir)
+        result = disk.get_devices(_sys_block_path=block_path)
+        assert result[sda_path]['sectorsize'] == '99'
+
+    def test_is_rotational(self, tmpfile, tmpdir, patched_get_block_devs_lsblk):
+        sda_path = '/dev/sda'
+        patched_get_block_devs_lsblk.return_value = [[sda_path, sda_path, 'disk']]
+        block_path = self.setup_path(tmpdir)
         block_sda_path = os.path.join(block_path, 'sda')
         sda_queue_path = os.path.join(block_sda_path, 'queue')
-        dev_sda_path = os.path.join(dev_path, 'sda')
         os.makedirs(block_sda_path)
         os.makedirs(sda_queue_path)
-        os.makedirs(dev_sda_path)
         tmpfile('rotational', contents='1', directory=sda_queue_path)
-        result = disk.get_devices(
-            _sys_block_path=block_path,
-            _dev_path=dev_path,
-            _mapper_path=mapper_path)
-        assert result[dev_sda_path]['rotational'] == '1'
+        result = disk.get_devices(_sys_block_path=block_path)
+        assert result[sda_path]['rotational'] == '1'
 
 
 class TestSizeCalculations(object):