self.set_tag(k, v)
# after setting all the tags, refresh them for the current object, use the
# pv_* identifiers to filter because those shouldn't change
- pv_object = self.get_first_pv(filter={'pv_name': self.pv_name,
- 'pv_uuid': self.pv_uuid})
+ pv_object = self.get_single_pv(filter={'pv_name': self.pv_name,
+ 'pv_uuid': self.pv_uuid})
+
+ if not pv_object:
+ raise RuntimeError('No PV was found.')
+
self.tags = pv_object.tags
def set_tag(self, key, value):
return [PVolume(**pv_report) for pv_report in pvs_report]
-def get_first_pv(fields=PV_FIELDS, filters=None, tags=None):
+def get_single_pv(fields=PV_FIELDS, filters=None, tags=None):
"""
- Wrapper of get_pv meant to be a convenience method to avoid the phrase::
+ Wrapper of get_pvs() meant to be a convenience method to avoid the phrase::
pvs = get_pvs()
if len(pvs) >= 1:
pv = pvs[0]
"""
pvs = get_pvs(fields=fields, filters=filters, tags=tags)
- return pvs[0] if len(pvs) > 0 else []
+
+ if len(pvs) == 0:
+ return None
+ if len(pvs) > 1:
+ raise RuntimeError('Filters {} matched more than 1 PV present on this host.'.format(str(filters)))
+
+ return pvs[0]
################################
name] + devices
)
- return get_first_vg(filters={'vg_name': name})
+ return get_single_vg(filters={'vg_name': name})
def extend_vg(vg, devices):
vg.name] + devices
)
- return get_first_vg(filters={'vg_name': vg.name})
+ return get_single_vg(filters={'vg_name': vg.name})
def reduce_vg(vg, devices):
vg.name] + devices
)
- return get_first_vg(filter={'vg_name': vg.name})
+ return get_single_vg(filter={'vg_name': vg.name})
def remove_vg(vg_name):
return [VolumeGroup(**vg_report) for vg_report in vgs_report]
-def get_first_vg(fields=VG_FIELDS, filters=None, tags=None):
+def get_single_vg(fields=VG_FIELDS, filters=None, tags=None):
"""
- Wrapper of get_vg meant to be a convenience method to avoid the phrase::
+ Wrapper of get_vgs() meant to be a convenience method to avoid the phrase::
vgs = get_vgs()
if len(vgs) >= 1:
vg = vgs[0]
"""
vgs = get_vgs(fields=fields, filters=filters, tags=tags)
- return vgs[0] if len(vgs) > 0 else []
+
+ if len(vgs) == 0:
+ return None
+ if len(vgs) > 1:
+ raise RuntimeError('Filters {} matched more than 1 VG present on this host.'.format(str(filters)))
+
+ return vgs[0]
def get_device_vgs(device, name_prefix=''):
]
process.run(command)
- lv = get_first_lv(filters={'lv_name': name, 'vg_name': vg.vg_name})
+ lv = get_single_lv(filters={'lv_name': name, 'vg_name': vg.vg_name})
if tags is None:
tags = {
return [Volume(**lv_report) for lv_report in lvs_report]
-def get_first_lv(fields=LV_FIELDS, filters=None, tags=None):
+def get_single_lv(fields=LV_FIELDS, filters=None, tags=None):
"""
- Wrapper of get_lv meant to be a convenience method to avoid the phrase::
+ Wrapper of get_lvs() meant to be a convenience method to avoid the phrase::
lvs = get_lvs()
if len(lvs) >= 1:
lv = lvs[0]
"""
lvs = get_lvs(fields=fields, filters=filters, tags=tags)
- return lvs[0] if len(lvs) > 0 else []
+
+ if len(lvs) == 0:
+ return None
+ if len(lvs) > 1:
+ raise RuntimeError('Filters {} matched more than 1 LV present on this host.'.format(str(filters)))
+
+ return lvs[0]
def get_lv_by_name(name):
"""
try:
vg_name, lv_name = full_name.split('/')
- res_lv = get_first_lv(filters={'lv_name': lv_name,
+ res_lv = get_single_lv(filters={'lv_name': lv_name,
'vg_name': vg_name})
except ValueError:
res_lv = None
try:
vg_name, lv_name = device_name.split('/')
- lv = api.get_first_lv(filters={'lv_name': lv_name,
- 'vg_name': vg_name})
+ lv = api.get_single_lv(filters={'lv_name': lv_name,
+ 'vg_name': vg_name})
except ValueError:
lv = None
try:
vgname, lvname = self.args.data.split('/')
- lv = api.get_first_lv(filters={'lv_name': lvname,
- 'vg_name': vgname})
+ lv = api.get_single_lv(filters={'lv_name': lvname,
+ 'vg_name': vgname})
except ValueError:
lv = None
try:
vg_name, lv_name = self.args.data.split('/')
- data_lv = api.get_first_lv(filters={'lv_name': lv_name,
+ data_lv = api.get_single_lv(filters={'lv_name': lv_name,
'vg_name': vg_name})
except ValueError:
data_lv = None
data_lv.set_tags(tags)
if not journal_device.startswith('/'):
# we got a journal lv, set rest of the tags
- api.get_first_lv(filters={'lv_name': lv_name,
- 'vg_name': vg_name}).set_tags(tags)
+ api.get_single_lv(filters={'lv_name': lv_name,
+ 'vg_name': vg_name}).set_tags(tags)
prepare_filestore(
data_lv.lv_path,
elif self.args.bluestore:
try:
vg_name, lv_name = self.args.data.split('/')
- block_lv = api.get_first_lv(filters={'lv_name': lv_name,
- 'vg_name': vg_name})
+ block_lv = api.get_single_lv(filters={'lv_name': lv_name,
+ 'vg_name': vg_name})
except ValueError:
block_lv = None
Device examples: vg-name/lv-name, /dev/vg-name/lv-name
Requirements: Must be a logical volume (LV)
"""
- lv = api.get_first_lv(filters={'lv_name': device.lv_name, 'vg_name':
- device.vg_name})
+ lv = api.get_single_lv(filters={'lv_name': device.lv_name, 'vg_name':
+ device.vg_name})
self.unmount_lv(lv)
wipefs(device.abspath)
mlogger.info('Zapping lvm member {}. lv_path is {}'.format(device.abspath, lv.lv_path))
self.zap_lv(Device(lv.lv_path))
else:
- vg = api.get_first_vg(filters={'vg_name': lv.vg_name})
+ vg = api.get_single_vg(filters={'vg_name': lv.vg_name})
if vg:
mlogger.info('Found empty VG {}, removing'.format(vg.vg_name))
api.remove_vg(vg.vg_name)
device = os.readlink(path)
else:
device = path
- lvm_device = lvm.get_first_lv(filters={'lv_path': device})
+ lvm_device = lvm.get_single_lv(filters={'lv_path': device})
if lvm_device:
device_uuid = lvm_device.lv_uuid
else:
@patch('ceph_volume.api.lvm.process.run')
@patch('ceph_volume.api.lvm.process.call')
- @patch('ceph_volume.api.lvm.get_first_lv')
- def test_uses_size(self, m_get_first_lv, m_call, m_run, monkeypatch):
- m_get_first_lv.return_value = self.foo_volume
+ @patch('ceph_volume.api.lvm.get_single_lv')
+ def test_uses_size(self, m_get_single_lv, m_call, m_run, monkeypatch):
+ m_get_single_lv.return_value = self.foo_volume
api.create_lv('foo', 0, vg=self.foo_group, size=419430400, tags={'ceph.type': 'data'})
expected = ['lvcreate', '--yes', '-l', '100', '-n', 'foo-0', 'foo_group']
m_run.assert_called_with(expected)
@patch('ceph_volume.api.lvm.process.run')
@patch('ceph_volume.api.lvm.process.call')
- @patch('ceph_volume.api.lvm.get_first_lv')
- def test_uses_size_adjust_if_1percent_over(self, m_get_first_lv, m_call, m_run, monkeypatch):
+ @patch('ceph_volume.api.lvm.get_single_lv')
+ def test_uses_size_adjust_if_1percent_over(self, m_get_single_lv, m_call, m_run, monkeypatch):
foo_volume = api.Volume(lv_name='foo', lv_path='/path', vg_name='foo_group', lv_tags='')
foo_group = api.VolumeGroup(vg_name='foo_group',
vg_extent_size="4194304",
vg_extent_count="1000",
vg_free_count="1000")
- m_get_first_lv.return_value = foo_volume
+ m_get_single_lv.return_value = foo_volume
# 423624704 should be just under 1% off of the available size 419430400
api.create_lv('foo', 0, vg=foo_group, size=4232052736, tags={'ceph.type': 'data'})
expected = ['lvcreate', '--yes', '-l', '1000', '-n', 'foo-0', 'foo_group']
@patch('ceph_volume.api.lvm.process.run')
@patch('ceph_volume.api.lvm.process.call')
- @patch('ceph_volume.api.lvm.get_first_lv')
- def test_uses_size_too_large(self, m_get_first_lv, m_call, m_run, monkeypatch):
- m_get_first_lv.return_value = self.foo_volume
+ @patch('ceph_volume.api.lvm.get_single_lv')
+ def test_uses_size_too_large(self, m_get_single_lv, m_call, m_run, monkeypatch):
+ m_get_single_lv.return_value = self.foo_volume
with pytest.raises(RuntimeError):
api.create_lv('foo', 0, vg=self.foo_group, size=5368709120, tags={'ceph.type': 'data'})
@patch('ceph_volume.api.lvm.process.run')
@patch('ceph_volume.api.lvm.process.call')
- @patch('ceph_volume.api.lvm.get_first_lv')
- def test_uses_extents(self, m_get_first_lv, m_call, m_run, monkeypatch):
- m_get_first_lv.return_value = self.foo_volume
+ @patch('ceph_volume.api.lvm.get_single_lv')
+ def test_uses_extents(self, m_get_single_lv, m_call, m_run, monkeypatch):
+ m_get_single_lv.return_value = self.foo_volume
api.create_lv('foo', 0, vg=self.foo_group, extents='50', tags={'ceph.type': 'data'})
expected = ['lvcreate', '--yes', '-l', '50', '-n', 'foo-0', 'foo_group']
m_run.assert_called_with(expected)
(3, 33),])
@patch('ceph_volume.api.lvm.process.run')
@patch('ceph_volume.api.lvm.process.call')
- @patch('ceph_volume.api.lvm.get_first_lv')
- def test_uses_slots(self, m_get_first_lv, m_call, m_run, monkeypatch, test_input, expected):
- m_get_first_lv.return_value = self.foo_volume
+ @patch('ceph_volume.api.lvm.get_single_lv')
+ def test_uses_slots(self, m_get_single_lv, m_call, m_run, monkeypatch, test_input, expected):
+ m_get_single_lv.return_value = self.foo_volume
api.create_lv('foo', 0, vg=self.foo_group, slots=test_input, tags={'ceph.type': 'data'})
expected = ['lvcreate', '--yes', '-l', str(expected), '-n', 'foo-0', 'foo_group']
m_run.assert_called_with(expected)
@patch('ceph_volume.api.lvm.process.run')
@patch('ceph_volume.api.lvm.process.call')
- @patch('ceph_volume.api.lvm.get_first_lv')
- def test_uses_all(self, m_get_first_lv, m_call, m_run, monkeypatch):
- m_get_first_lv.return_value = self.foo_volume
+ @patch('ceph_volume.api.lvm.get_single_lv')
+ def test_uses_all(self, m_get_single_lv, m_call, m_run, monkeypatch):
+ m_get_single_lv.return_value = self.foo_volume
api.create_lv('foo', 0, vg=self.foo_group, tags={'ceph.type': 'data'})
expected = ['lvcreate', '--yes', '-l', '100%FREE', '-n', 'foo-0', 'foo_group']
m_run.assert_called_with(expected)
@patch('ceph_volume.api.lvm.process.run')
@patch('ceph_volume.api.lvm.process.call')
@patch('ceph_volume.api.lvm.Volume.set_tags')
- @patch('ceph_volume.api.lvm.get_first_lv')
- def test_calls_to_set_tags_default(self, m_get_first_lv, m_set_tags, m_call, m_run, monkeypatch):
- m_get_first_lv.return_value = self.foo_volume
+ @patch('ceph_volume.api.lvm.get_single_lv')
+ def test_calls_to_set_tags_default(self, m_get_single_lv, m_set_tags, m_call, m_run, monkeypatch):
+ m_get_single_lv.return_value = self.foo_volume
api.create_lv('foo', 0, vg=self.foo_group)
tags = {
"ceph.osd_id": "null",
@patch('ceph_volume.api.lvm.process.run')
@patch('ceph_volume.api.lvm.process.call')
@patch('ceph_volume.api.lvm.Volume.set_tags')
- @patch('ceph_volume.api.lvm.get_first_lv')
- def test_calls_to_set_tags_arg(self, m_get_first_lv, m_set_tags, m_call, m_run, monkeypatch):
- m_get_first_lv.return_value = self.foo_volume
+ @patch('ceph_volume.api.lvm.get_single_lv')
+ def test_calls_to_set_tags_arg(self, m_get_single_lv, m_set_tags, m_call, m_run, monkeypatch):
+ m_get_single_lv.return_value = self.foo_volume
api.create_lv('foo', 0, vg=self.foo_group, tags={'ceph.type': 'data'})
tags = {
"ceph.type": "data",
@patch('ceph_volume.api.lvm.process.call')
@patch('ceph_volume.api.lvm.get_device_vgs')
@patch('ceph_volume.api.lvm.create_vg')
- @patch('ceph_volume.api.lvm.get_first_lv')
- def test_create_vg(self, m_get_first_lv, m_create_vg, m_get_device_vgs, m_call,
+ @patch('ceph_volume.api.lvm.get_single_lv')
+ def test_create_vg(self, m_get_single_lv, m_create_vg, m_get_device_vgs, m_call,
m_run, monkeypatch):
- m_get_first_lv.return_value = self.foo_volume
+ m_get_single_lv.return_value = self.foo_volume
m_get_device_vgs.return_value = []
api.create_lv('foo', 0, device='dev/foo', size='5G', tags={'ceph.type': 'data'})
m_create_vg.assert_called_with('dev/foo', name_prefix='ceph')
self.foo_volume = api.VolumeGroup(vg_name='foo', lv_tags='')
def test_uses_single_device_in_list(self, monkeypatch, fake_run):
- monkeypatch.setattr(api, 'get_first_vg', lambda **kw: True)
+ monkeypatch.setattr(api, 'get_single_vg', lambda **kw: True)
api.extend_vg(self.foo_volume, ['/dev/sda'])
expected = ['vgextend', '--force', '--yes', 'foo', '/dev/sda']
assert fake_run.calls[0]['args'][0] == expected
def test_uses_single_device(self, monkeypatch, fake_run):
- monkeypatch.setattr(api, 'get_first_vg', lambda **kw: True)
+ monkeypatch.setattr(api, 'get_single_vg', lambda **kw: True)
api.extend_vg(self.foo_volume, '/dev/sda')
expected = ['vgextend', '--force', '--yes', 'foo', '/dev/sda']
assert fake_run.calls[0]['args'][0] == expected
def test_uses_multiple_devices(self, monkeypatch, fake_run):
- monkeypatch.setattr(api, 'get_first_vg', lambda **kw: True)
+ monkeypatch.setattr(api, 'get_single_vg', lambda **kw: True)
api.extend_vg(self.foo_volume, ['/dev/sda', '/dev/sdb'])
expected = ['vgextend', '--force', '--yes', 'foo', '/dev/sda', '/dev/sdb']
assert fake_run.calls[0]['args'][0] == expected
self.foo_volume = api.VolumeGroup(vg_name='foo', lv_tags='')
def test_uses_single_device_in_list(self, monkeypatch, fake_run):
- monkeypatch.setattr(api, 'get_first_vg', lambda **kw: True)
+ monkeypatch.setattr(api, 'get_single_vg', lambda **kw: True)
api.reduce_vg(self.foo_volume, ['/dev/sda'])
expected = ['vgreduce', '--force', '--yes', 'foo', '/dev/sda']
assert fake_run.calls[0]['args'][0] == expected
def test_uses_single_device(self, monkeypatch, fake_run):
- monkeypatch.setattr(api, 'get_first_vg', lambda **kw: True)
+ monkeypatch.setattr(api, 'get_single_vg', lambda **kw: True)
api.reduce_vg(self.foo_volume, '/dev/sda')
expected = ['vgreduce', '--force', '--yes', 'foo', '/dev/sda']
assert fake_run.calls[0]['args'][0] == expected
def test_uses_multiple_devices(self, monkeypatch, fake_run):
- monkeypatch.setattr(api, 'get_first_vg', lambda **kw: True)
+ monkeypatch.setattr(api, 'get_single_vg', lambda **kw: True)
api.reduce_vg(self.foo_volume, ['/dev/sda', '/dev/sdb'])
expected = ['vgreduce', '--force', '--yes', 'foo', '/dev/sda', '/dev/sdb']
assert fake_run.calls[0]['args'][0] == expected
self.foo_volume = api.VolumeGroup(vg_name='foo', lv_tags='')
def test_no_name(self, monkeypatch, fake_run):
- monkeypatch.setattr(api, 'get_first_vg', lambda **kw: True)
+ monkeypatch.setattr(api, 'get_single_vg', lambda **kw: True)
api.create_vg('/dev/sda')
result = fake_run.calls[0]['args'][0]
assert '/dev/sda' in result
assert result[-2].startswith('ceph-')
def test_devices_list(self, monkeypatch, fake_run):
- monkeypatch.setattr(api, 'get_first_vg', lambda **kw: True)
+ monkeypatch.setattr(api, 'get_single_vg', lambda **kw: True)
api.create_vg(['/dev/sda', '/dev/sdb'], name='ceph')
result = fake_run.calls[0]['args'][0]
expected = ['vgcreate', '--force', '--yes', 'ceph', '/dev/sda', '/dev/sdb']
assert result == expected
def test_name_prefix(self, monkeypatch, fake_run):
- monkeypatch.setattr(api, 'get_first_vg', lambda **kw: True)
+ monkeypatch.setattr(api, 'get_single_vg', lambda **kw: True)
api.create_vg('/dev/sda', name_prefix='master')
result = fake_run.calls[0]['args'][0]
assert '/dev/sda' in result
assert result[-2].startswith('master-')
def test_specific_name(self, monkeypatch, fake_run):
- monkeypatch.setattr(api, 'get_first_vg', lambda **kw: True)
+ monkeypatch.setattr(api, 'get_single_vg', lambda **kw: True)
api.create_vg('/dev/sda', name='master')
result = fake_run.calls[0]['args'][0]
assert '/dev/sda' in result
assert api.get_lvs() == []
-class TestGetFirstPV(object):
+class TestGetSinglePV(object):
- def test_get_first_pv(self, monkeypatch):
- pv1 = api.PVolume(pv_name='/dev/sda', pv_uuid='0000', pv_tags={},
- vg_name='vg1')
- pv2 = api.PVolume(pv_name='/dev/sdb', pv_uuid='0001', pv_tags={},
- vg_name='vg2')
- stdout = ['{};{};{};{};;'.format(pv1.pv_name, pv1.pv_tags, pv1.pv_uuid, pv1.vg_name),
- '{};{};{};{};;'.format(pv2.pv_name, pv2.pv_tags, pv2.pv_uuid, pv2.vg_name)]
- monkeypatch.setattr(api.process, 'call', lambda x,**kw: (stdout, '', 0))
+ @patch('ceph_volume.devices.lvm.prepare.api.get_pvs')
+ def test_get_single_pv_multiple_matches_raises_runtimeerror(self, m_get_pvs):
+ fake_pvs = []
+ fake_pvs.append(api.PVolume(pv_name='/dev/sda', pv_tags={}))
+ fake_pvs.append(api.PVolume(pv_name='/dev/sdb', pv_tags={}))
- pv_ = api.get_first_pv()
- assert isinstance(pv_, api.PVolume)
- assert pv_.pv_name == pv1.pv_name
+ m_get_pvs.return_value = fake_pvs
- def test_get_first_pv_single_pv(self, monkeypatch):
- pv = api.PVolume(pv_name='/dev/sda', pv_uuid='0000', pv_tags={},
- vg_name='vg1')
- stdout = ['{};;;;;;'.format(pv.pv_name)]
- monkeypatch.setattr(api.process, 'call', lambda x,**kw: (stdout, '', 0))
+ with pytest.raises(RuntimeError) as e:
+ api.get_single_pv()
+ assert "matched more than 1 PV present on this host." in str(e.value)
- pv_ = api.get_first_pv()
- assert isinstance(pv_, api.PVolume)
- assert pv_.pv_name == pv.pv_name
+ @patch('ceph_volume.devices.lvm.prepare.api.get_pvs')
+ def test_get_single_pv_no_match_returns_none(self, m_get_pvs):
+ m_get_pvs.return_value = []
- def test_get_first_pv_empty(self, monkeypatch):
- monkeypatch.setattr(api.process, 'call', lambda x,**kw: ('', '', 0))
- assert api.get_first_pv() == []
+ pv = api.get_single_pv()
+ assert pv == None
+ @patch('ceph_volume.devices.lvm.prepare.api.get_pvs')
+ def test_get_single_pv_one_match(self, m_get_pvs):
+ fake_pvs = []
+ fake_pvs.append(api.PVolume(pv_name='/dev/sda', pv_tags={}))
+ m_get_pvs.return_value = fake_pvs
-class TestGetFirstVG(object):
+ pv = api.get_single_pv()
- def test_get_first_vg(self, monkeypatch):
- vg1 = api.VolumeGroup(vg_name='vg1')
- vg2 = api.VolumeGroup(vg_name='vg2')
- stdout = ['{};;;;;;'.format(vg1.vg_name), '{};;;;;;'.format(vg2.vg_name)]
- monkeypatch.setattr(api.process, 'call', lambda x,**kw: (stdout, '', 0))
+ assert isinstance(pv, api.PVolume)
+ assert pv.name == '/dev/sda'
- vg_ = api.get_first_vg()
- assert isinstance(vg_, api.VolumeGroup)
- assert vg_.vg_name == vg1.vg_name
- def test_get_first_vg_single_vg(self, monkeypatch):
- vg = api.VolumeGroup(vg_name='vg')
- stdout = ['{};;;;;;'.format(vg.vg_name)]
- monkeypatch.setattr(api.process, 'call', lambda x,**kw: (stdout, '', 0))
+class TestGetSingleVG(object):
- vg_ = api.get_first_vg()
- assert isinstance(vg_, api.VolumeGroup)
- assert vg_.vg_name == vg.vg_name
+ @patch('ceph_volume.devices.lvm.prepare.api.get_vgs')
+ def test_get_single_vg_multiple_matches_raises_runtimeerror(self, m_get_vgs):
+ fake_vgs = []
+ fake_vgs.append(api.VolumeGroup(vg_name='vg1'))
+ fake_vgs.append(api.VolumeGroup(vg_name='vg2'))
- def test_get_first_vg_empty(self, monkeypatch):
- monkeypatch.setattr(api.process, 'call', lambda x,**kw: ('', '', 0))
- vg_ = api.get_first_vg()
- assert vg_ == []
+ m_get_vgs.return_value = fake_vgs
+ with pytest.raises(RuntimeError) as e:
+ api.get_single_vg()
+ assert "matched more than 1 VG present on this host." in str(e.value)
-class TestGetFirstLV(object):
+ @patch('ceph_volume.devices.lvm.prepare.api.get_vgs')
+ def test_get_single_vg_no_match_returns_none(self, m_get_vgs):
+ m_get_vgs.return_value = []
- def test_get_first_lv(self, monkeypatch):
- lv1 = api.Volume(lv_tags='ceph.type=data', lv_path='/dev/vg1/lv1',
- lv_name='lv1', vg_name='vg1')
- lv2 = api.Volume(lv_tags='ceph.type=data', lv_path='/dev/vg2/lv2',
- lv_name='lv2', vg_name='vg2')
- stdout = ['{};{};{};{}'.format(lv1.lv_tags, lv1.lv_path, lv1.lv_name,
- lv1.vg_name),
- '{};{};{};{}'.format(lv2.lv_tags, lv2.lv_path, lv2.lv_name,
- lv2.vg_name)]
- monkeypatch.setattr(api.process, 'call', lambda x,**kw: (stdout, '', 0))
+ vg = api.get_single_vg()
+ assert vg == None
- lv_ = api.get_first_lv()
- assert isinstance(lv_, api.Volume)
- assert lv_.lv_name == lv1.lv_name
+ @patch('ceph_volume.devices.lvm.prepare.api.get_vgs')
+ def test_get_single_vg_one_match(self, m_get_vgs):
+ fake_vgs = []
+ fake_vgs.append(api.VolumeGroup(vg_name='vg1'))
+ m_get_vgs.return_value = fake_vgs
- def test_get_first_lv_single_lv(self, monkeypatch):
- stdout = ['ceph.type=data;/dev/vg/lv;lv;vg']
- monkeypatch.setattr(api.process, 'call', lambda x,**kw: (stdout, '', 0))
- lv = api.Volume(lv_tags='ceph.type=data',
- lv_path='/dev/vg/lv',
- lv_name='lv', vg_name='vg')
+ vg = api.get_single_vg()
- lv_ = api.get_first_lv()
- assert isinstance(lv_, api.Volume)
- assert lv_.lv_name == lv.lv_name
+ assert isinstance(vg, api.VolumeGroup)
+ assert vg.name == 'vg1'
- def test_get_first_lv_empty(self, monkeypatch):
- monkeypatch.setattr(api.process, 'call', lambda x,**kw: ('', '', 0))
- assert api.get_lvs() == []
+class TestGetSingleLV(object):
+
+ @patch('ceph_volume.devices.lvm.prepare.api.get_lvs')
+ def test_get_single_lv_multiple_matches_raises_runtimeerror(self, m_get_lvs):
+ fake_lvs = []
+ fake_lvs.append(api.Volume(lv_name='lv1',
+ lv_path='/dev/vg1/lv1',
+ vg_name='vg1',
+ lv_tags='',
+ lv_uuid='fake-uuid'))
+ fake_lvs.append(api.Volume(lv_name='lv1',
+ lv_path='/dev/vg2/lv1',
+ vg_name='vg2',
+ lv_tags='',
+ lv_uuid='fake-uuid'))
+ m_get_lvs.return_value = fake_lvs
+
+ with pytest.raises(RuntimeError) as e:
+ api.get_single_lv()
+ assert "matched more than 1 LV present on this host" in str(e.value)
+
+ @patch('ceph_volume.devices.lvm.prepare.api.get_lvs')
+ def test_get_single_lv_no_match_returns_none(self, m_get_lvs):
+ m_get_lvs.return_value = []
+
+ lv = api.get_single_lv()
+ assert lv == None
+
+ @patch('ceph_volume.devices.lvm.prepare.api.get_lvs')
+ def test_get_single_lv_one_match(self, m_get_lvs):
+ fake_lvs = []
+ fake_lvs.append(api.Volume(lv_name='lv1', lv_path='/dev/vg1/lv1', vg_name='vg1', lv_tags='', lv_uuid='fake-uuid'))
+ m_get_lvs.return_value = fake_lvs
+
+ lv_ = api.get_single_lv()
+
+ assert isinstance(lv_, api.Volume)
+ assert lv_.name == 'lv1'
monkeypatch.setattr("ceph_volume.sys_info.devices", {})
monkeypatch.setattr("ceph_volume.util.device.disk.get_devices", lambda: devices)
if not devices:
- monkeypatch.setattr("ceph_volume.util.device.lvm.get_first_lv", lambda filters: lv)
+ monkeypatch.setattr("ceph_volume.util.device.lvm.get_single_lv", lambda filters: lv)
else:
monkeypatch.setattr("ceph_volume.util.device.lvm.get_device_lvs",
lambda path: [lv])
volumes = []
volumes.append(FooVolume)
monkeypatch.setattr(api, 'get_lvs', lambda **kwargs: [])
- monkeypatch.setattr(api, 'get_first_lv', lambda **kwargs: [])
+ monkeypatch.setattr(api, 'get_single_lv', lambda **kwargs: [])
monkeypatch.setattr(activate, 'activate_filestore', capture)
args = Args(osd_id=None, osd_fsid='2222')
lv_path='/dev/VolGroup/lv', vg_name='VolGroup')
volumes = []
volumes.append(osd)
- monkeypatch.setattr(lvm.listing.api, 'get_first_pv', lambda **kwargs: pv)
+ monkeypatch.setattr(lvm.listing.api, 'get_single_pv', lambda **kwargs: pv)
monkeypatch.setattr(lvm.listing.api, 'get_lvs', lambda **kwargs:
volumes)
volumes = []
volumes.append(osd)
volumes.append(journal)
- monkeypatch.setattr(lvm.listing.api,'get_first_pv',lambda **kwargs:pv)
+ monkeypatch.setattr(lvm.listing.api,'get_single_pv',lambda **kwargs:pv)
monkeypatch.setattr(lvm.listing.api, 'get_lvs', lambda **kwargs:
volumes)
return self.mock_volumes.pop(0)
mock_single_volumes = {}
- def mock_get_first_lv(self, *args, **kwargs):
+ def mock_get_single_lv(self, *args, **kwargs):
p = kwargs['filters']['lv_path']
return self.mock_single_volumes[p]
self.mock_single_volumes = {'/dev/VolGroup/lv1': vol}
monkeypatch.setattr(migrate.api, 'get_lvs', self.mock_get_lvs)
- monkeypatch.setattr(migrate.api, 'get_first_lv', self.mock_get_first_lv)
+ monkeypatch.setattr(migrate.api, 'get_single_lv', self.mock_get_single_lv)
monkeypatch.setattr(process, 'call', lambda x, **kw: ('', '', 0))
result = migrate.find_associated_devices(osd_id='0', osd_fsid='1234')
self.mock_single_volumes = {'/dev/VolGroup/lv1': vol, '/dev/VolGroup/lv2': vol2}
monkeypatch.setattr(migrate.api, 'get_lvs', self.mock_get_lvs)
- monkeypatch.setattr(migrate.api, 'get_first_lv', self.mock_get_first_lv)
+ monkeypatch.setattr(migrate.api, 'get_single_lv', self.mock_get_single_lv)
monkeypatch.setattr(process, 'call', lambda x, **kw: ('', '', 0))
result = migrate.find_associated_devices(osd_id='0', osd_fsid='1234')
'/dev/VolGroup/lv3': vol3}
monkeypatch.setattr(migrate.api, 'get_lvs', self.mock_get_lvs)
- monkeypatch.setattr(migrate.api, 'get_first_lv', self.mock_get_first_lv)
+ monkeypatch.setattr(migrate.api, 'get_single_lv', self.mock_get_single_lv)
monkeypatch.setattr(process, 'call', lambda x, **kw: ('', '', 0))
result = migrate.find_associated_devices(osd_id='0', osd_fsid='1234')
class TestVolumeTagTracker(object):
mock_single_volumes = {}
- def mock_get_first_lv(self, *args, **kwargs):
+ def mock_get_single_lv(self, *args, **kwargs):
p = kwargs['filters']['lv_path']
return self.mock_single_volumes[p]
self.mock_single_volumes = {'/dev/VolGroup/lv1': data_vol,
'/dev/VolGroup/lv2': db_vol,
'/dev/VolGroup/lv3': wal_vol}
- monkeypatch.setattr(migrate.api, 'get_first_lv', self.mock_get_first_lv)
+ monkeypatch.setattr(migrate.api, 'get_single_lv', self.mock_get_single_lv)
self.mock_process_input = []
monkeypatch.setattr(process, 'call', self.mock_process)
self.mock_single_volumes = {'/dev/VolGroup/lv1': data_vol,
'/dev/VolGroup/lv2': db_vol}
- monkeypatch.setattr(migrate.api, 'get_first_lv', self.mock_get_first_lv)
+ monkeypatch.setattr(migrate.api, 'get_single_lv', self.mock_get_single_lv)
self.mock_process_input = []
monkeypatch.setattr(process, 'call', self.mock_process)
'/dev/VolGroup/lv2': db_vol,
'/dev/VolGroup/lv3': wal_vol}
- monkeypatch.setattr(migrate.api, 'get_first_lv', self.mock_get_first_lv)
+ monkeypatch.setattr(migrate.api, 'get_single_lv', self.mock_get_single_lv)
self.mock_process_input = []
monkeypatch.setattr(process, 'call', self.mock_process)
'/dev/VolGroup/lv2': db_vol,
'/dev/VolGroup/lv3': wal_vol}
- monkeypatch.setattr(migrate.api, 'get_first_lv', self.mock_get_first_lv)
+ monkeypatch.setattr(migrate.api, 'get_single_lv', self.mock_get_single_lv)
self.mock_process_input = []
monkeypatch.setattr(process, 'call', self.mock_process)
'/dev/VolGroup/lv2': db_vol,
'/dev/VolGroup/lv3': wal_vol}
- monkeypatch.setattr(migrate.api, 'get_first_lv', self.mock_get_first_lv)
+ monkeypatch.setattr(migrate.api, 'get_single_lv', self.mock_get_single_lv)
self.mock_process_input = []
monkeypatch.setattr(process, 'call', self.mock_process)
return ('', '', 0)
mock_single_volumes = {}
- def mock_get_first_lv(self, *args, **kwargs):
+ def mock_get_single_lv(self, *args, **kwargs):
p = kwargs['filters']['lv_path']
return self.mock_single_volumes[p]
self.mock_single_volumes = {'/dev/VolGroup/lv1': data_vol,
'/dev/VolGroup/lv3': wal_vol}
- monkeypatch.setattr(migrate.api, 'get_first_lv',
- self.mock_get_first_lv)
+ monkeypatch.setattr(migrate.api, 'get_single_lv',
+ self.mock_get_single_lv)
self.mock_process_input = []
monkeypatch.setattr(process, 'call', self.mock_process)
self.mock_single_volumes = {'/dev/VolGroup/lv1': data_vol,
'/dev/VolGroup/lv3': wal_vol}
- monkeypatch.setattr(migrate.api, 'get_first_lv',
- self.mock_get_first_lv)
+ monkeypatch.setattr(migrate.api, 'get_single_lv',
+ self.mock_get_single_lv)
self.mock_process_input = []
monkeypatch.setattr(process, 'call', self.mock_process)
self.mock_single_volumes = {'/dev/VolGroup/lv1': data_vol,
'/dev/VolGroup/lv3': wal_vol}
- monkeypatch.setattr(migrate.api, 'get_first_lv',
- self.mock_get_first_lv)
+ monkeypatch.setattr(migrate.api, 'get_single_lv',
+ self.mock_get_single_lv)
self.mock_process_input = []
monkeypatch.setattr(process, 'call', self.mock_process)
self.mock_single_volumes = {'/dev/VolGroup/lv1': data_vol}
- monkeypatch.setattr(migrate.api, 'get_first_lv', self.mock_get_first_lv)
+ monkeypatch.setattr(migrate.api, 'get_single_lv', self.mock_get_single_lv)
self.mock_process_input = []
monkeypatch.setattr(process, 'call', self.mock_process)
self.mock_single_volumes = {'/dev/VolGroup/lv1': data_vol}
- monkeypatch.setattr(migrate.api, 'get_first_lv', self.mock_get_first_lv)
+ monkeypatch.setattr(migrate.api, 'get_single_lv', self.mock_get_single_lv)
self.mock_process_input = []
monkeypatch.setattr(process, 'call', self.mock_process)
self.mock_single_volumes = {'/dev/VolGroup/lv1': data_vol}
- monkeypatch.setattr(migrate.api, 'get_first_lv', self.mock_get_first_lv)
+ monkeypatch.setattr(migrate.api, 'get_single_lv', self.mock_get_single_lv)
self.mock_process_input = []
monkeypatch.setattr(process, 'call', self.mock_process)
return ('', '', 0)
mock_single_volumes = {}
- def mock_get_first_lv(self, *args, **kwargs):
+ def mock_get_single_lv(self, *args, **kwargs):
p = kwargs['filters']['lv_path']
return self.mock_single_volumes[p]
'/dev/VolGroup/lv2': db_vol,
'/dev/VolGroup/lv3': wal_vol,
}
- monkeypatch.setattr(migrate.api, 'get_first_lv',
- self.mock_get_first_lv)
+ monkeypatch.setattr(migrate.api, 'get_single_lv',
+ self.mock_get_single_lv)
self.mock_volume = api.Volume(lv_name='volume2', lv_uuid='y',
vg_name='vg',
'/dev/VolGroup/lv1': data_vol,
'/dev/VolGroup/lv2': db_vol,
}
- monkeypatch.setattr(migrate.api, 'get_first_lv',
- self.mock_get_first_lv)
+ monkeypatch.setattr(migrate.api, 'get_single_lv',
+ self.mock_get_single_lv)
self.mock_volume = api.Volume(lv_name='volume2_new', lv_uuid='new-db-uuid',
vg_name='vg',
'/dev/VolGroup/lv1': data_vol,
'/dev/VolGroup/lv2': db_vol,
}
- monkeypatch.setattr(migrate.api, 'get_first_lv',
- self.mock_get_first_lv)
+ monkeypatch.setattr(migrate.api, 'get_single_lv',
+ self.mock_get_single_lv)
self.mock_volume = api.Volume(lv_name='volume2_new', lv_uuid='new-db-uuid',
vg_name='vg',
'/dev/VolGroup/lv1': data_vol,
'/dev/VolGroup/lv2': db_vol,
}
- monkeypatch.setattr(migrate.api, 'get_first_lv',
- self.mock_get_first_lv)
+ monkeypatch.setattr(migrate.api, 'get_single_lv',
+ self.mock_get_single_lv)
self.mock_volume = api.Volume(lv_name='volume2_new', lv_uuid='new-db-uuid',
vg_name='vg',
'/dev/VolGroup/lv2': db_vol,
'/dev/VolGroup/lv3': wal_vol,
}
- monkeypatch.setattr(migrate.api, 'get_first_lv',
- self.mock_get_first_lv)
+ monkeypatch.setattr(migrate.api, 'get_single_lv',
+ self.mock_get_single_lv)
self.mock_volume = api.Volume(lv_name='volume2_new', lv_uuid='new-db-uuid',
vg_name='vg',
'/dev/VolGroup/lv2': db_vol,
'/dev/VolGroup/lv3': wal_vol,
}
- monkeypatch.setattr(migrate.api, 'get_first_lv',
- self.mock_get_first_lv)
+ monkeypatch.setattr(migrate.api, 'get_single_lv',
+ self.mock_get_single_lv)
self.mock_volume = api.Volume(lv_name='volume2_new', lv_uuid='new-db-uuid',
vg_name='vg',
'/dev/VolGroup/lv1': data_vol,
'/dev/VolGroup/lv2': db_vol,
}
- monkeypatch.setattr(migrate.api, 'get_first_lv',
- self.mock_get_first_lv)
+ monkeypatch.setattr(migrate.api, 'get_single_lv',
+ self.mock_get_single_lv)
self.mock_volume = api.Volume(lv_name='volume2_new', lv_uuid='new-db-uuid',
vg_name='vg',
'/dev/VolGroup/lv2': db_vol,
'/dev/VolGroup/lv3': wal_vol,
}
- monkeypatch.setattr(migrate.api, 'get_first_lv',
- self.mock_get_first_lv)
+ monkeypatch.setattr(migrate.api, 'get_single_lv',
+ self.mock_get_single_lv)
self.mock_volume = wal_vol
monkeypatch.setattr(api, 'get_lv_by_fullname',
'/dev/VolGroup/lv2': db_vol,
'/dev/VolGroup/lv3': wal_vol,
}
- monkeypatch.setattr(migrate.api, 'get_first_lv',
- self.mock_get_first_lv)
+ monkeypatch.setattr(migrate.api, 'get_single_lv',
+ self.mock_get_single_lv)
self.mock_volume = db_vol
monkeypatch.setattr(api, 'get_lv_by_fullname',
'/dev/VolGroup/lv2': db_vol,
'/dev/VolGroup/lv3': wal_vol,
}
- monkeypatch.setattr(migrate.api, 'get_first_lv',
- self.mock_get_first_lv)
+ monkeypatch.setattr(migrate.api, 'get_single_lv',
+ self.mock_get_single_lv)
self.mock_volume = db_vol
monkeypatch.setattr(api, 'get_lv_by_fullname',
'/dev/VolGroup/lv2': db_vol,
'/dev/VolGroup/lv3': wal_vol,
}
- monkeypatch.setattr(migrate.api, 'get_first_lv',
- self.mock_get_first_lv)
+ monkeypatch.setattr(migrate.api, 'get_single_lv',
+ self.mock_get_single_lv)
self.mock_volume = db_vol
monkeypatch.setattr(api, 'get_lv_by_fullname',
'/dev/VolGroup/lv2': db_vol,
'/dev/VolGroup/lv3': wal_vol,
}
- monkeypatch.setattr(migrate.api, 'get_first_lv',
- self.mock_get_first_lv)
+ monkeypatch.setattr(migrate.api, 'get_single_lv',
+ self.mock_get_single_lv)
self.mock_volume = db_vol
monkeypatch.setattr(api, 'get_lv_by_fullname',
'/dev/VolGroup/lv2': db_vol,
'/dev/VolGroup/lv3': wal_vol,
}
- monkeypatch.setattr(migrate.api, 'get_first_lv',
- self.mock_get_first_lv)
+ monkeypatch.setattr(migrate.api, 'get_single_lv',
+ self.mock_get_single_lv)
self.mock_volume = db_vol
monkeypatch.setattr(api, 'get_lv_by_fullname',
'/dev/VolGroup/lv2': db_vol,
'/dev/VolGroup/lv3': wal_vol,
}
- monkeypatch.setattr(migrate.api, 'get_first_lv',
- self.mock_get_first_lv)
+ monkeypatch.setattr(migrate.api, 'get_single_lv',
+ self.mock_get_single_lv)
self.mock_volume = db_vol
monkeypatch.setattr(api, 'get_lv_by_fullname',
assert result == ('', '', {'ceph.type': 'data'})
@patch('ceph_volume.api.lvm.Volume.set_tags')
- @patch('ceph_volume.devices.lvm.prepare.api.get_first_lv')
- def test_setup_device_lv_passed(self, m_get_first_lv, m_set_tags):
+ @patch('ceph_volume.devices.lvm.prepare.api.get_single_lv')
+ def test_setup_device_lv_passed(self, m_get_single_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
+ m_get_single_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.data_device': '/fake-path'})
@patch('ceph_volume.devices.lvm.prepare.Prepare.get_ptuuid')
- @patch('ceph_volume.devices.lvm.prepare.api.get_first_lv')
- def test_setup_device_partition_passed(self, m_get_first_lv, m_get_ptuuid):
- m_get_first_lv.side_effect = ValueError()
+ @patch('ceph_volume.devices.lvm.prepare.api.get_single_lv')
+ def test_setup_device_partition_passed(self, m_get_single_lv, m_get_ptuuid):
+ m_get_single_lv.side_effect = ValueError()
m_get_ptuuid.return_value = 'fake-uuid'
result = lvm.prepare.Prepare([]).setup_device(device_type='data', device_name='/dev/sdx', tags={'ceph.type': 'data'}, size=0, slots=None)
# if the path is not absolute, we have 'vg/lv', let's use LV name
# to get the LV.
if self.path[0] == '/':
- lv = lvm.get_first_lv(filters={'lv_path': self.path})
+ lv = lvm.get_single_lv(filters={'lv_path': self.path})
else:
vgname, lvname = self.path.split('/')
- lv = lvm.get_first_lv(filters={'lv_name': lvname,
- 'vg_name': vgname})
+ lv = lvm.get_single_lv(filters={'lv_name': lvname,
+ 'vg_name': vgname})
if lv:
self.lv_api = lv
self.lvs = [lv]