def test_no_lvs_found_that_match_id_fsid(self, volumes, monkeypatch, device_info): tags = 'ceph.osd_id=9,ceph.osd_fsid=asdf-lkjh,ceph.journal_uuid=x,'+\ 'ceph.type=data' osd = api.Volume(lv_name='volume1', lv_uuid='y', vg_name='vg', lv_tags=tags, lv_path='/dev/VolGroup/lv') volumes.append(osd) monkeypatch.setattr(zap.api, 'get_lvs', lambda **kwargs: {}) with pytest.raises(RuntimeError): zap.find_associated_devices(osd_id='9', osd_fsid='aaaa-lkjh')
def test_lv_is_matched_fsid(self, volumes, monkeypatch): tags = 'ceph.osd_id=0,ceph.osd_fsid=asdf-lkjh,ceph.journal_uuid=x,' +\ 'ceph.type=data' osd = api.Volume(lv_name='volume1', lv_uuid='y', vg_name='', lv_path='/dev/VolGroup/lv', lv_tags=tags) volumes.append(osd) monkeypatch.setattr(zap.api, 'get_lvs', lambda **kwargs: deepcopy(volumes)) result = zap.find_associated_devices(osd_fsid='asdf-lkjh') assert result[0].abspath == '/dev/VolGroup/lv'
def test_lvm_size(self, monkeypatch, device_info): volume = api.Volume(lv_name='lv', lv_uuid='y', vg_name='vg', lv_tags={}, lv_path='/dev/VolGroup/lv') volumes = [] volumes.append(volume) monkeypatch.setattr(api, 'get_lvs', lambda **kwargs: deepcopy(volumes)) # 5GB in size data = {"/dev/sda": {"size": "5368709120"}} lsblk = {"TYPE": "disk"} device_info(devices=data,lsblk=lsblk) disk = device.Device("/dev/sda") assert disk.lvm_size.gb == 4
def test_report_a_ceph_journal_device(self, volumes, 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) 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_ceph_data_lv_reported(self, monkeypatch): tags = 'ceph.osd_id=0,ceph.journal_uuid=x,ceph.type=data' 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') volumes = [] volumes.append(osd) monkeypatch.setattr(lvm.listing.api, 'get_single_pv', lambda **kwargs: pv) monkeypatch.setattr(lvm.listing.api, 'get_lvs', lambda **kwargs: volumes) result = lvm.listing.List([]).full_report() assert result['0'][0]['name'] == 'volume1'
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]) 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'] == type_
def test_sys_api(self, monkeypatch, device_info): volume = api.Volume(lv_name='lv', lv_uuid='y', vg_name='vg', lv_tags={}, lv_path='/dev/VolGroup/lv') volumes = [] volumes.append(volume) monkeypatch.setattr(api, 'get_lvs', lambda **kwargs: deepcopy(volumes)) data = {"/dev/sda": {"foo": "bar"}} lsblk = {"TYPE": "disk"} device_info(devices=data,lsblk=lsblk) disk = device.Device("/dev/sda") assert disk.sys_api assert "foo" in disk.sys_api
def test_lv_is_matched_id(self, monkeypatch): tags = 'ceph.osd_id=0,ceph.journal_uuid=x,ceph.type=data' osd = api.Volume(lv_name='volume1', lv_uuid='y', vg_name='', lv_path='/dev/VolGroup/lv', lv_tags=tags) volumes = [] volumes.append(osd) monkeypatch.setattr(zap.api, 'get_lvs', lambda **kw: volumes) monkeypatch.setattr(process, 'call', lambda x, **kw: ('', '', 0)) result = zap.find_associated_devices(osd_id='0') assert result[0].abspath == '/dev/VolGroup/lv'
def test_multiple_backing_devs_are_found(self): volumes = [] for _type in ['journal', 'db', 'wal']: tags = 'ceph.osd_id=0,ceph.osd_fsid=asdf-lkjh,ceph.wal_uuid=x,ceph.type=%s' % _type osd = api.Volume(lv_name='volume%s' % _type, lv_uuid='y', vg_name='', lv_path='/dev/VolGroup/lv%s' % _type, lv_tags=tags) volumes.append(osd) result = zap.ensure_associated_lvs(volumes) assert '/dev/VolGroup/lvjournal' in result assert '/dev/VolGroup/lvwal' in result assert '/dev/VolGroup/lvdb' in result
def test_multiple_wals_are_found(self): tags = 'ceph.osd_id=0,ceph.osd_fsid=asdf-lkjh,ceph.wal_uuid=x,ceph.type=wal' volumes = [] for i in range(3): osd = api.Volume(lv_name='volume%s' % i, lv_uuid='y', vg_name='', lv_path='/dev/VolGroup/lv%s' % i, lv_tags=tags) volumes.append(osd) result = zap.ensure_associated_lvs(volumes) assert '/dev/VolGroup/lv0' in result assert '/dev/VolGroup/lv1' in result assert '/dev/VolGroup/lv2' in result
def test_block_and_partition_are_found(self, monkeypatch): monkeypatch.setattr(zap.disk, 'get_device_from_partuuid', lambda x: '/dev/sdb1') tags = 'ceph.osd_id=0,ceph.osd_fsid=asdf-lkjh,ceph.journal_uuid=x,ceph.type=block' osd = api.Volume(lv_name='volume1', lv_uuid='y', vg_name='', lv_path='/dev/VolGroup/block', lv_tags=tags) volumes = [] volumes.append(osd) result = zap.ensure_associated_lvs(volumes) assert '/dev/sdb1' in result assert '/dev/VolGroup/block' in result
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'
def test_filestore_systemd(self, is_root, volumes, monkeypatch, capture): fake_enable = Capture() fake_start_osd = Capture() monkeypatch.setattr('ceph_volume.configuration.load', lambda: None) monkeypatch.setattr('ceph_volume.util.system.device_is_mounted', lambda *a, **kw: True) monkeypatch.setattr('ceph_volume.util.system.chown', lambda *a, **kw: True) monkeypatch.setattr('ceph_volume.process.run', lambda *a, **kw: True) monkeypatch.setattr(activate.systemctl, 'enable_volume', fake_enable) monkeypatch.setattr(activate.systemctl, 'start_osd', fake_start_osd) JournalVolume = api.Volume(lv_name='journal', lv_path='/dev/vg/journal', lv_uuid='000', lv_tags=','.join([ "ceph.cluster_name=ceph", "ceph.journal_device=/dev/vg/journal", "ceph.journal_uuid=000", "ceph.type=journal", "ceph.osd_id=0", "ceph.osd_fsid=1234" ])) DataVolume = api.Volume( lv_name='data', lv_path='/dev/vg/data', lv_tags= "ceph.cluster_name=ceph,ceph.journal_device=/dev/vg/journal,ceph.journal_uuid=000,ceph.type=data,ceph.osd_id=0,ceph.osd_fsid=1234" ) volumes.append(DataVolume) volumes.append(JournalVolume) monkeypatch.setattr(api, 'Volumes', lambda: volumes) args = Args(osd_id=None, osd_fsid='1234', no_systemd=False, filestore=True) activate.Activate([]).activate(args) assert fake_enable.calls != [] assert fake_start_osd.calls != []
def test_report_by_osd_id_for_just_block_wal_and_db_dev(self, monkeypatch): tags1 = 'ceph.osd_id=0,ceph.journal_uuid=x,ceph.type=block' tags2 = 'ceph.osd_id=0,ceph.journal_uuid=x,ceph.type=wal' tags3 = 'ceph.osd_id=0,ceph.journal_uuid=x,ceph.type=db' lvs = [ api.Volume(lv_name='lv1', lv_tags=tags1, lv_path='/dev/vg/lv1', lv_uuid='aaaa', vg_name='vg'), api.Volume(lv_name='lv2', lv_tags=tags2, lv_path='/dev/vg/lv2', lv_uuid='bbbb', vg_name='vg'), api.Volume(lv_name='lv3', lv_tags=tags3, lv_path='/dev/vg/lv3', lv_uuid='cccc', vg_name='vg'), ] monkeypatch.setattr(lvm.listing.api, 'get_lvs', lambda **kwargs: lvs) listing = lvm.listing.List([]) result = listing.single_report(0) assert result['0'][0]['name'] == 'lv1' assert result['0'][0]['lv_tags'] == tags1 assert result['0'][0]['lv_path'] == '/dev/vg/lv1' assert result['0'][0]['vg_name'] == 'vg' assert result['0'][1]['name'] == 'lv2' assert result['0'][1]['lv_tags'] == tags2 assert result['0'][1]['lv_path'] == '/dev/vg/lv2' assert result['0'][1]['vg_name'] == 'vg' assert result['0'][2]['name'] == 'lv3' assert result['0'][2]['lv_tags'] == tags3 assert result['0'][2]['lv_path'] == '/dev/vg/lv3' assert result['0'][2]['vg_name'] == 'vg'
def test_report_a_ceph_lv(self, 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) volumes = [] volumes.append(lv) 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 mock_lv(): size = 21474836480 dev = create_autospec(device.Device) dev.lv_name = 'lv' dev.vg_name = 'vg' dev.path = '{}/{}'.format(dev.vg_name, dev.lv_name) dev.used_by_ceph = False dev.vg_size = [size] dev.vg_free = dev.vg_size dev.lvs = [ lvm.Volume(vg_name=dev.vg_name, lv_name=dev.lv_name, lv_size=size, lv_tags='') ] return dev
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, '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_by_osd_id_for_just_data_dev(self, monkeypatch): tags = 'ceph.osd_id=0,ceph.journal_uuid=x,ceph.type=data' lvs = [ api.Volume(lv_name='lv1', lv_tags=tags, lv_path='/dev/vg/lv1', lv_uuid='bbbb', vg_name='vg'), ] monkeypatch.setattr(lvm.listing.api, 'get_lvs', lambda **kwargs: lvs) listing = lvm.listing.List([]) result = listing.single_report(0) assert result['0'][0]['name'] == 'lv1' assert result['0'][0]['lv_tags'] == tags assert result['0'][0]['lv_path'] == '/dev/vg/lv1' assert result['0'][0]['vg_name'] == 'vg'
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 ) volumes.append(lv) monkeypatch.setattr(lvm.listing.api, 'Volumes', lambda: 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': ''}, ] 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'] == []
def test_bluestore_systemd(self, is_root, volumes, monkeypatch, capture): fake_enable = Capture() fake_start_osd = Capture() monkeypatch.setattr('ceph_volume.util.system.path_is_mounted', lambda *a, **kw: True) monkeypatch.setattr('ceph_volume.util.system.chown', lambda *a, **kw: True) monkeypatch.setattr('ceph_volume.process.run', lambda *a, **kw: True) monkeypatch.setattr(activate.systemctl, 'enable_volume', fake_enable) monkeypatch.setattr(activate.systemctl, 'start_osd', fake_start_osd) DataVolume = api.Volume( lv_name='data', lv_path='/dev/vg/data', lv_tags="ceph.cluster_name=ceph,,ceph.journal_uuid=000,ceph.type=block,ceph.osd_id=0,ceph.osd_fsid=1234") volumes.append(DataVolume) monkeypatch.setattr(api, 'Volumes', lambda: volumes) args = Args(osd_id=None, osd_fsid='1234', no_systemd=False, bluestore=True) activate.Activate([]).activate(args) assert fake_enable.calls != [] assert fake_start_osd.calls != []
def test_setup_device_lv_passed(self, m_get_first_lv, m_set_tags): fake_volume = api.Volume(lv_name='lv_foo', lv_path='/fake-path', vg_name='vg_foo', lv_tags='', lv_uuid='fake-uuid') m_get_first_lv.return_value = fake_volume result = lvm.prepare.Prepare([]).setup_device( device_type='data', device_name='vg_foo/lv_foo', tags={'ceph.type': 'data'}, size=0, slots=None) assert result == ('/fake-path', 'fake-uuid', { 'ceph.type': 'data', 'ceph.vdo': '0', 'ceph.data_uuid': 'fake-uuid', 'ceph.data_device': '/fake-path' })
def test_bluestore_no_systemd_autodetect(self, is_root, monkeypatch, capture): fake_enable = Capture() fake_start_osd = Capture() monkeypatch.setattr('ceph_volume.util.system.path_is_mounted', lambda *a, **kw: True) monkeypatch.setattr('ceph_volume.util.system.chown', lambda *a, **kw: True) monkeypatch.setattr('ceph_volume.process.run', lambda *a, **kw: True) monkeypatch.setattr(activate.systemctl, 'enable_volume', fake_enable) monkeypatch.setattr(activate.systemctl, 'start_osd', fake_start_osd) DataVolume = api.Volume( lv_name='data', lv_path='/dev/vg/data', lv_tags="ceph.cluster_name=ceph,,ceph.block_uuid=000," + \ "ceph.type=block,ceph.osd_id=0,ceph.osd_fsid=1234") volumes = [] volumes.append(DataVolume) monkeypatch.setattr(api, 'get_lvs', lambda **kwargs: deepcopy(volumes)) args = Args(osd_id=None, osd_fsid='1234', no_systemd=True, bluestore=True, auto_detect_objectstore=True) activate.Activate([]).activate(args) assert fake_enable.calls == [] assert fake_start_osd.calls == []
def test_used_by_ceph(self, device_info, volumes, pvolumes, pvolumes_empty, monkeypatch, ceph_type): data = {"/dev/sda": {"foo": "bar"}} lsblk = {"TYPE": "part"} FooPVolume = api.PVolume(pv_name='/dev/sda', pv_uuid="0000", lv_uuid="0000", pv_tags={}, vg_name="vg") pvolumes.append(FooPVolume) lv_data = {"lv_name": "lv", "lv_path": "vg/lv", "vg_name": "vg", "lv_uuid": "0000", "lv_tags": "ceph.osd_id=0,ceph.type="+ceph_type} lv = api.Volume(**lv_data) volumes.append(lv) monkeypatch.setattr(api, 'get_pvs', lambda **kwargs: deepcopy(pvolumes)) monkeypatch.setattr(api, 'get_lvs', lambda **kwargs: deepcopy(volumes)) device_info(devices=data, lsblk=lsblk, lv=lv_data) vg = api.VolumeGroup(vg_name='foo/bar', vg_free_count=6, vg_extent_size=1073741824) monkeypatch.setattr(api, 'get_device_vgs', lambda x: [vg]) disk = device.Device("/dev/sda") assert disk.used_by_ceph
def test_physical_wal_gets_reported(self, pvolumes, volumes, monkeypatch): tags = 'ceph.osd_id=0,ceph.wal_uuid=x,ceph.type=wal' 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, 'get_pvs', lambda **kwargs: pvolumes) monkeypatch.setattr(lvm.listing.api, 'get_lvs', lambda **kwargs: volumes) 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'
def setup(self): self.foo_volume = api.Volume(lv_name='foo', lv_path='/path/to/lv', vg_name='foo_group', lv_tags='')
def test_no_empty_lv_name(self): with pytest.raises(ValueError): api.Volume(lv_name='', lv_tags='')
def test_single_lv_is_matched(self, volumes, monkeypatch): FooVolume = api.Volume(lv_name='foo', lv_path='/dev/vg/foo', lv_tags="ceph.type=data") volumes.append(FooVolume) monkeypatch.setattr(api, 'Volumes', lambda: volumes) assert api.get_lv(lv_name='foo') == FooVolume
def test_find_the_correct_one(self, volumes): volume1 = api.Volume(lv_name='volume1', lv_path='/dev/vg/lv', lv_tags='') volume2 = api.Volume(lv_name='volume2', lv_path='/dev/vg/lv', lv_tags='') volumes.append(volume1) volumes.append(volume2) assert volumes.get(lv_name='volume1') == volume1
def test_as_dict_populates_path_from_lv_api(self, volumes): lv_tags = "ceph.type=data,ceph.fsid=000-aaa" osd = api.Volume(lv_name='volume1', lv_path='/dev/vg/lv', lv_tags=lv_tags) volumes.append(osd) result = volumes.get(lv_tags={'ceph.type': 'data'}).as_dict() assert result['path'] == '/dev/vg/lv'
def test_volume_has_multiple_matches(self, volumes): volume1 = volume2 = api.Volume(lv_name='foo', lv_path='/dev/vg/lv', lv_tags='') volumes.append(volume1) volumes.append(volume2) with pytest.raises(exceptions.MultipleLVsError): volumes.get(lv_name='foo')