ceph-volume: don't keep device lists as sets

This was introduced by #27754. The explicit device lists were cast to
sets but other parts of the code where not updated accordingly. To avoid
touching all code places, only cast to sets for disjoint test and keep
lists otherwise.

Fixes: https://tracker.ceph.com/issues/41292

Signed-off-by: Jan Fajerski <jfajerski@suse.com>
This commit is contained in:
Jan Fajerski 2019-08-15 12:20:00 +02:00
parent 362bfac4dc
commit 0534cf188a
3 changed files with 9 additions and 17 deletions

View File

@ -254,7 +254,7 @@ class Batch(object):
self.args = parser.parse_args(argv) self.args = parser.parse_args(argv)
self.parser = parser self.parser = parser
for dev_list in ['', 'db_', 'wal_', 'journal_']: for dev_list in ['', 'db_', 'wal_', 'journal_']:
setattr(self, '{}usable'.format(dev_list), set()) setattr(self, '{}usable'.format(dev_list), [])
def get_devices(self): def get_devices(self):
# remove devices with partitions # remove devices with partitions
@ -361,8 +361,8 @@ class Batch(object):
dev_list_prop = '{}devices'.format(dev_list) dev_list_prop = '{}devices'.format(dev_list)
if hasattr(self.args, dev_list_prop): if hasattr(self.args, dev_list_prop):
usable_dev_list_prop = '{}usable'.format(dev_list) usable_dev_list_prop = '{}usable'.format(dev_list)
usable = set([d for d in getattr(self.args, dev_list_prop) if usable = [d for d in getattr(self.args, dev_list_prop) if
d.available]) d.available]
setattr(self, usable_dev_list_prop, usable) setattr(self, usable_dev_list_prop, usable)
self.filtered_devices.update({d: used_reason for d in self.filtered_devices.update({d: used_reason for d in
getattr(self.args, dev_list_prop) getattr(self.args, dev_list_prop)
@ -370,8 +370,8 @@ class Batch(object):
def _ensure_disjoint_device_lists(self): def _ensure_disjoint_device_lists(self):
# check that all device lists are disjoint with each other # check that all device lists are disjoint with each other
if not(self.usable.isdisjoint(self.db_usable) and if not(set(self.usable).isdisjoint(set(self.db_usable)) and
self.usable.isdisjoint(self.wal_usable) and set(self.usable).isdisjoint(set(self.wal_usable)) and
self.usable.isdisjoint(self.journal_usable) and set(self.usable).isdisjoint(set(self.journal_usable)) and
self.db_usable.isdisjoint(self.wal_usable)): set(self.db_usable).isdisjoint(set(self.wal_usable))):
raise Exception('Device lists are not disjoint') raise Exception('Device lists are not disjoint')

View File

@ -223,12 +223,3 @@ class TestMixedType(object):
filestore.MixedType.with_auto_devices(args, devices) filestore.MixedType.with_auto_devices(args, devices)
msg = "Not enough space in fast devices (14.97 GB) to create 2 x 14.77 GB journal LV" msg = "Not enough space in fast devices (14.97 GB) to create 2 x 14.77 GB journal LV"
assert msg in str(error.value) assert msg in str(error.value)
def test_filter_all_data_devs(self, fakedevice, factory):
# in this scenario the user passed a already used device to be used for
# data and an unused device to be used as db device.
db_dev = fakedevice(used_by_ceph=False, is_lvm_member=False, rotational=False, sys_api=dict(size=6073740000))
data_dev = fakedevice(used_by_ceph=True, is_lvm_member=False, rotational=True, sys_api=dict(size=6073740000))
args = factory(filtered_devices=[data_dev], osds_per_device=1,
journal_size=None, osd_ids=[])
filestore.MixedType(args, [], [db_dev])

View File

@ -63,8 +63,9 @@ class TestBatch(object):
b.args.devices = [device1, device2] b.args.devices = [device1, device2]
b.args.db_devices = [device2] b.args.db_devices = [device2]
b._filter_devices() b._filter_devices()
with pytest.raises(Exception): with pytest.raises(Exception) as disjoint_ex:
b._ensure_disjoint_device_lists() b._ensure_disjoint_device_lists()
assert 'Device lists are not disjoint' in str(disjoint_ex.value)
class TestFilterDevices(object): class TestFilterDevices(object):