]> git.proxmox.com Git - ceph.git/blobdiff - ceph/src/ceph-volume/ceph_volume/tests/devices/lvm/test_listing.py
import new upstream nautilus stable release 14.2.8
[ceph.git] / ceph / src / ceph-volume / ceph_volume / tests / devices / lvm / test_listing.py
index efbb460f96033e46acc72885d9e6e2cf0c4afe01..e41cbba7262513ea616099c7253394be3215c10a 100644 (file)
@@ -2,6 +2,11 @@ import pytest
 from ceph_volume.devices import lvm
 from ceph_volume.api import lvm as api
 
+# TODO: add tests for following commands -
+# ceph-volume list
+# ceph-volume list <path-to-pv>
+# ceph-volume list <path-to-vg>
+# ceph-volume list <path-to-lv>
 
 class TestReadableTag(object):
 
@@ -57,13 +62,15 @@ class TestPrettyReport(object):
 
 class TestList(object):
 
-    def test_empty_full_json_zero_exit_status(self, is_root, volumes, factory, capsys):
+    def test_empty_full_json_zero_exit_status(self, is_root, volumes,
+                                              factory, capsys):
         args = factory(format='json', device=None)
         lvm.listing.List([]).list(args)
         stdout, stderr = capsys.readouterr()
         assert stdout == '{}\n'
 
-    def test_empty_device_json_zero_exit_status(self, is_root, volumes, factory, capsys):
+    def test_empty_device_json_zero_exit_status(self, is_root, volumes,
+                                                factory, capsys):
         args = factory(format='json', device='/dev/sda1')
         lvm.listing.List([]).list(args)
         stdout, stderr = capsys.readouterr()
@@ -79,53 +86,53 @@ class TestList(object):
         with pytest.raises(SystemExit):
             lvm.listing.List([]).list(args)
 
-    def test_lvs_list_is_created_just_once(self, monkeypatch, is_root, volumes, factory):
-        api.volumes_obj_create_count = 0
-
-        def monkey_populate(self):
-            api.volumes_obj_create_count += 1
-            for lv_item in api.get_api_lvs():
-                self.append(api.Volume(**lv_item))
-        monkeypatch.setattr(api.Volumes, '_populate', monkey_populate)
-
-        args = factory(format='pretty', device='/dev/sda1')
-        with pytest.raises(SystemExit):
-            lvm.listing.List([]).list(args)
-
-        # XXX: Ideally, the count should be just 1. Volumes._populate() is
-        # being called thrice out of which only twice is moneky_populate.
-        assert api.volumes_obj_create_count == 2
-
-
 class TestFullReport(object):
 
     def test_no_ceph_lvs(self, volumes, monkeypatch):
         # ceph lvs are detected by looking into its tags
-        osd = api.Volume(lv_name='volume1', lv_path='/dev/VolGroup/lv', lv_tags={})
+        osd = api.Volume(lv_name='volume1', lv_path='/dev/VolGroup/lv',
+                         lv_tags={})
         volumes.append(osd)
-        monkeypatch.setattr(lvm.listing.api, 'Volumes', lambda: volumes)
+        monkeypatch.setattr(lvm.listing.api, 'get_lvs', lambda **kwargs:
+                            volumes)
+
         result = lvm.listing.List([]).full_report()
         assert result == {}
 
-    def test_ceph_data_lv_reported(self, volumes, monkeypatch):
+    def test_ceph_data_lv_reported(self, pvolumes, volumes, monkeypatch):
         tags = 'ceph.osd_id=0,ceph.journal_uuid=x,ceph.type=data'
-        osd = api.Volume(
-            lv_name='volume1', lv_uuid='y', lv_path='/dev/VolGroup/lv', lv_tags=tags)
+        pv = api.PVolume(pv_name='/dev/sda1', pv_tags={}, pv_uuid="0000",
+                         vg_name='VolGroup', lv_uuid="aaaa")
+        osd = api.Volume(lv_name='volume1', lv_uuid='y', lv_tags=tags,
+                         lv_path='/dev/VolGroup/lv', vg_name='VolGroup')
+        pvolumes.append(pv)
         volumes.append(osd)
-        monkeypatch.setattr(lvm.listing.api, 'Volumes', lambda: volumes)
+        monkeypatch.setattr(lvm.listing.api, 'get_pvs', lambda **kwargs:
+                            pvolumes)
+        monkeypatch.setattr(lvm.listing.api, 'get_lvs', lambda **kwargs:
+                            volumes)
+
         result = lvm.listing.List([]).full_report()
         assert result['0'][0]['name'] == 'volume1'
 
-    def test_ceph_journal_lv_reported(self, volumes, monkeypatch):
+    def test_ceph_journal_lv_reported(self, pvolumes, volumes, monkeypatch):
         tags = 'ceph.osd_id=0,ceph.journal_uuid=x,ceph.type=data'
         journal_tags = 'ceph.osd_id=0,ceph.journal_uuid=x,ceph.type=journal'
-        osd = api.Volume(
-            lv_name='volume1', lv_uuid='y', lv_path='/dev/VolGroup/lv', lv_tags=tags)
+        pv = api.PVolume(pv_name='/dev/sda1', pv_tags={}, pv_uuid="0000",
+                         vg_name="VolGroup", lv_uuid="aaaa")
+        osd = api.Volume(lv_name='volume1', lv_uuid='y', lv_tags=tags,
+                         lv_path='/dev/VolGroup/lv', vg_name='VolGroup')
         journal = api.Volume(
-            lv_name='journal', lv_uuid='x', lv_path='/dev/VolGroup/journal', lv_tags=journal_tags)
+            lv_name='journal', lv_uuid='x', lv_tags=journal_tags,
+            lv_path='/dev/VolGroup/journal', vg_name='VolGroup')
+        pvolumes.append(pv)
         volumes.append(osd)
         volumes.append(journal)
-        monkeypatch.setattr(lvm.listing.api, 'Volumes', lambda: volumes)
+        monkeypatch.setattr(lvm.listing.api, 'get_pvs', lambda **kwargs:
+                            pvolumes)
+        monkeypatch.setattr(lvm.listing.api, 'get_lvs', lambda **kwargs:
+                            volumes)
+
         result = lvm.listing.List([]).full_report()
         assert result['0'][0]['name'] == 'volume1'
         assert result['0'][1]['name'] == 'journal'
@@ -133,156 +140,123 @@ class TestFullReport(object):
     def test_ceph_wal_lv_reported(self, volumes, monkeypatch):
         tags = 'ceph.osd_id=0,ceph.wal_uuid=x,ceph.type=data'
         wal_tags = 'ceph.osd_id=0,ceph.wal_uuid=x,ceph.type=wal'
-        osd = api.Volume(
-            lv_name='volume1', lv_uuid='y', lv_path='/dev/VolGroup/lv', lv_tags=tags)
-        wal = api.Volume(
-            lv_name='wal', lv_uuid='x', lv_path='/dev/VolGroup/wal', lv_tags=wal_tags)
+        osd = api.Volume(lv_name='volume1', lv_uuid='y', lv_tags=tags,
+                         lv_path='/dev/VolGroup/lv', vg_name='VolGroup')
+        wal = api.Volume(lv_name='wal', lv_uuid='x', lv_tags=wal_tags,
+                         lv_path='/dev/VolGroup/wal', vg_name='VolGroup')
         volumes.append(osd)
         volumes.append(wal)
-        monkeypatch.setattr(lvm.listing.api, 'Volumes', lambda: volumes)
+        monkeypatch.setattr(lvm.listing.api, 'get_lvs', lambda **kwargs:
+                            volumes)
+
         result = lvm.listing.List([]).full_report()
         assert result['0'][0]['name'] == 'volume1'
         assert result['0'][1]['name'] == 'wal'
 
-    def test_physical_journal_gets_reported(self, volumes, monkeypatch):
-        tags = 'ceph.osd_id=0,ceph.journal_uuid=x,ceph.type=data'
-        osd = api.Volume(
-            lv_name='volume1', lv_uuid='y', lv_path='/dev/VolGroup/lv', lv_tags=tags)
-        volumes.append(osd)
-        monkeypatch.setattr(lvm.listing.api, 'Volumes', lambda: volumes)
-        monkeypatch.setattr(lvm.listing.disk, 'get_device_from_partuuid', lambda x: '/dev/sda1')
-        result = lvm.listing.List([]).full_report()
-        assert result['0'][1]['path'] == '/dev/sda1'
-        assert result['0'][1]['tags'] == {'PARTUUID': 'x'}
-        assert result['0'][1]['type'] == 'journal'
+    @pytest.mark.parametrize('type_', ['journal', 'db', 'wal'])
+    def test_physical_2nd_device_gets_reported(self, type_, monkeypatch):
+        tags = ('ceph.osd_id=0,ceph.{t}_uuid=x,ceph.type=data,'
+                'ceph.{t}_device=/dev/sda1').format(t=type_)
+        osd = api.Volume(lv_name='volume1', lv_uuid='y', lv_tags=tags,
+                         vg_name='VolGroup', lv_path='/dev/VolGroup/lv')
+        monkeypatch.setattr(lvm.listing.api, 'get_lvs', lambda **kwargs:
+                            [osd])
 
-    def test_physical_wal_gets_reported(self, volumes, monkeypatch):
-        tags = 'ceph.osd_id=0,ceph.wal_uuid=x,ceph.type=data'
-        osd = api.Volume(
-            lv_name='volume1', lv_uuid='y', lv_path='/dev/VolGroup/lv', lv_tags=tags)
-        volumes.append(osd)
-        monkeypatch.setattr(lvm.listing.api, 'Volumes', lambda: volumes)
-        monkeypatch.setattr(lvm.listing.disk, 'get_device_from_partuuid', lambda x: '/dev/sda1')
         result = lvm.listing.List([]).full_report()
         assert result['0'][1]['path'] == '/dev/sda1'
         assert result['0'][1]['tags'] == {'PARTUUID': 'x'}
-        assert result['0'][1]['type'] == 'wal'
+        assert result['0'][1]['type'] == type_
 
 
 class TestSingleReport(object):
 
     def test_not_a_ceph_lv(self, volumes, monkeypatch):
         # ceph lvs are detected by looking into its tags
-        lv = api.Volume(
-            lv_name='lv', vg_name='VolGroup', lv_path='/dev/VolGroup/lv', lv_tags={})
-        volumes.append(lv)
-        monkeypatch.setattr(lvm.listing.api, 'Volumes', lambda: volumes)
+        lv = api.Volume(lv_name='lv', lv_tags={}, lv_path='/dev/VolGroup/lv',
+                        vg_name='VolGroup')
+        monkeypatch.setattr(lvm.listing.api, 'get_lvs', lambda **kwargs:
+                            [lv])
+
         result = lvm.listing.List([]).single_report('VolGroup/lv')
         assert result == {}
 
-    def test_report_a_ceph_lv(self, volumes, monkeypatch):
+    def test_report_a_ceph_lv(self, pvolumes, volumes, monkeypatch):
         # ceph lvs are detected by looking into its tags
         tags = 'ceph.osd_id=0,ceph.journal_uuid=x,ceph.type=data'
-        lv = api.Volume(
-            lv_name='lv', vg_name='VolGroup',
-            lv_uuid='aaaa', lv_path='/dev/VolGroup/lv', lv_tags=tags
-        )
+        lv = api.Volume(lv_name='lv', vg_name='VolGroup', lv_uuid='aaaa',
+                        lv_path='/dev/VolGroup/lv', lv_tags=tags)
         volumes.append(lv)
-        monkeypatch.setattr(lvm.listing.api, 'Volumes', lambda: volumes)
+        monkeypatch.setattr(lvm.listing.api, 'get_pvs', lambda **kwargs:
+                            pvolumes)
+        monkeypatch.setattr(lvm.listing.api, 'get_lvs', lambda **kwargs:
+                            volumes)
+
         result = lvm.listing.List([]).single_report('VolGroup/lv')
         assert result['0'][0]['name'] == 'lv'
         assert result['0'][0]['lv_tags'] == tags
         assert result['0'][0]['path'] == '/dev/VolGroup/lv'
         assert result['0'][0]['devices'] == []
 
-    def test_report_a_ceph_journal_device(self, volumes, monkeypatch):
+    def test_report_a_ceph_journal_device(self, monkeypatch):
         # ceph lvs are detected by looking into its tags
-        tags = 'ceph.osd_id=0,ceph.journal_uuid=x,ceph.type=data,ceph.journal_device=/dev/sda1'
-        lv = api.Volume(
-            lv_name='lv', vg_name='VolGroup', lv_path='/dev/VolGroup/lv',
-            lv_uuid='aaa', lv_tags=tags)
-        volumes.append(lv)
-        monkeypatch.setattr(lvm.listing.api, 'Volumes', lambda: volumes)
+        tags = 'ceph.osd_id=0,ceph.journal_uuid=x,ceph.type=data,' + \
+               'ceph.journal_device=/dev/sda1'
+        lv = api.Volume(lv_name='lv', lv_uuid='aaa', lv_tags=tags,
+                        lv_path='/dev/VolGroup/lv', vg_name='VolGroup')
+        monkeypatch.setattr(lvm.listing.api, 'get_lvs', lambda **kwargs:
+                            [lv] if 'tags' in kwargs else [])
+
         result = lvm.listing.List([]).single_report('/dev/sda1')
         assert result['0'][0]['tags'] == {'PARTUUID': 'x'}
         assert result['0'][0]['type'] == 'journal'
         assert result['0'][0]['path'] == '/dev/sda1'
 
-    def test_report_a_ceph_lv_with_devices(self, volumes, monkeypatch):
-        tags = 'ceph.osd_id=0,ceph.journal_uuid=x,ceph.type=data'
-        lv = api.Volume(
-            lv_name='lv', vg_name='VolGroup',
-            lv_uuid='aaaa', lv_path='/dev/VolGroup/lv', lv_tags=tags
-        )
+    def test_report_a_ceph_lv_with_devices(self, volumes, pvolumes, monkeypatch):
+        tags = 'ceph.osd_id=0,ceph.type=data'
+        pv1 = api.PVolume(vg_name="VolGroup", pv_name='/dev/sda1',
+                          pv_uuid='', pv_tags={}, lv_uuid="aaaa")
+        pv2 = api.PVolume(vg_name="VolGroup", pv_name='/dev/sdb1',
+                          pv_uuid='', pv_tags={}, lv_uuid="aaaa")
+        lv = api.Volume(lv_name='lv', vg_name='VolGroup',lv_uuid='aaaa',
+                        lv_path='/dev/VolGroup/lv', lv_tags=tags)
+        pvolumes.append(pv1)
+        pvolumes.append(pv2)
         volumes.append(lv)
-        monkeypatch.setattr(lvm.listing.api, 'Volumes', lambda: volumes)
+        monkeypatch.setattr(lvm.listing.api, 'get_pvs', lambda **kwargs:
+                            pvolumes)
+        monkeypatch.setattr(lvm.listing.api, 'get_lvs', lambda **kwargs:
+                            volumes)
+
         listing = lvm.listing.List([])
         listing._pvs = [
             {'lv_uuid': 'aaaa', 'pv_name': '/dev/sda1', 'pv_tags': '', 'pv_uuid': ''},
             {'lv_uuid': 'aaaa', 'pv_name': '/dev/sdb1', 'pv_tags': '', 'pv_uuid': ''},
         ]
+
         result = listing.single_report('VolGroup/lv')
         assert result['0'][0]['name'] == 'lv'
         assert result['0'][0]['lv_tags'] == tags
         assert result['0'][0]['path'] == '/dev/VolGroup/lv'
         assert result['0'][0]['devices'] == ['/dev/sda1', '/dev/sdb1']
 
-    def test_report_a_ceph_lv_with_multiple_pvs_of_same_name(self, pvolumes, monkeypatch):
-        tags = 'ceph.osd_id=0,ceph.journal_uuid=x,ceph.type=data'
-        lv = api.Volume(
-            lv_name='lv', vg_name='VolGroup',
-            lv_uuid='aaaa', lv_path='/dev/VolGroup/lv', lv_tags=tags
-        )
-        monkeypatch.setattr(api, 'get_lv_from_argument', lambda device: None)
-        monkeypatch.setattr(api, 'get_lv', lambda vg_name: lv)
-        FooPVolume = api.PVolume(vg_name="vg", pv_name='/dev/sda', pv_uuid="0000", pv_tags={}, lv_uuid="aaaa")
-        BarPVolume = api.PVolume(vg_name="vg", pv_name='/dev/sda', pv_uuid="0000", pv_tags={})
-        pvolumes.append(FooPVolume)
-        pvolumes.append(BarPVolume)
-        monkeypatch.setattr(api, 'PVolumes', lambda: pvolumes)
-        listing = lvm.listing.List([])
-        result = listing.single_report('/dev/sda')
-        assert result['0'][0]['name'] == 'lv'
-        assert result['0'][0]['lv_tags'] == tags
-        assert result['0'][0]['path'] == '/dev/VolGroup/lv'
-        assert len(result) == 1
-
-    def test_report_a_ceph_lv_with_no_matching_devices(self, volumes, monkeypatch):
-        tags = 'ceph.osd_id=0,ceph.journal_uuid=x,ceph.type=data'
-        lv = api.Volume(
-            lv_name='lv', vg_name='VolGroup',
-            lv_uuid='aaaa', lv_path='/dev/VolGroup/lv', lv_tags=tags
-        )
+    def test_report_a_ceph_lv_with_no_matching_devices(self, volumes,
+                                                       monkeypatch):
+        tags = 'ceph.osd_id=0,ceph.type=data'
+        lv = api.Volume(lv_name='lv', vg_name='VolGroup', lv_uuid='aaaa',
+                        lv_path='/dev/VolGroup/lv', lv_tags=tags)
         volumes.append(lv)
-        monkeypatch.setattr(lvm.listing.api, 'Volumes', lambda: volumes)
+        monkeypatch.setattr(lvm.listing.api, 'get_lvs', lambda **kwargs:
+                            volumes)
+
         listing = lvm.listing.List([])
         listing._pvs = [
-            {'lv_uuid': 'ffff', 'pv_name': '/dev/sda1', 'pv_tags': '', 'pv_uuid': ''},
-            {'lv_uuid': 'ffff', 'pv_name': '/dev/sdb1', 'pv_tags': '', 'pv_uuid': ''},
-        ]
+            {'lv_uuid': 'ffff', 'pv_name': '/dev/sda1', 'pv_tags': '',
+             'pv_uuid': ''},
+            {'lv_uuid': 'ffff', 'pv_name': '/dev/sdb1', 'pv_tags': '',
+             'pv_uuid': ''}]
+
         result = listing.single_report('VolGroup/lv')
         assert result['0'][0]['name'] == 'lv'
         assert result['0'][0]['lv_tags'] == tags
         assert result['0'][0]['path'] == '/dev/VolGroup/lv'
         assert result['0'][0]['devices'] == []
-
-
-class TestListingPVs(object):
-
-    def setup(self):
-        self.default_pvs = [
-            {'lv_uuid': 'ffff', 'pv_name': '/dev/sda1', 'pv_tags': '', 'pv_uuid': ''},
-            {'lv_uuid': 'ffff', 'pv_name': '/dev/sdb1', 'pv_tags': '', 'pv_uuid': ''},
-        ]
-
-    def test_pvs_is_unset(self, monkeypatch):
-        monkeypatch.setattr(lvm.listing.api, 'get_api_pvs', lambda: self.default_pvs)
-        listing = lvm.listing.List([])
-        assert listing.pvs == self.default_pvs
-
-    def test_pvs_is_set(self, monkeypatch):
-        # keep it patched so that we can fail if this gets returned
-        monkeypatch.setattr(lvm.listing.api, 'get_api_pvs', lambda: self.default_pvs)
-        listing = lvm.listing.List([])
-        listing._pvs = []
-        assert listing.pvs == []