if not self.args.bluestore and not self.args.filestore:
self.args.bluestore = True
- if not self.args.no_auto:
+ if (self.args.no_auto or self.args.db_devices or
+ self.args.journal_devices or
+ self.args.wal_devices):
+ self.get_explicit_strategy()
+ else:
if self.args.report:
self.report()
else:
self.execute()
- else:
- self.get_explicit_strategy()
def get_explicit_strategy(self):
raise NotImplementedError()
Support for all SSDs, or all HDDS
"""
- def __init__(self, devices, args):
- super(SingleType, self).__init__(devices, args)
+ def __init__(self, block_devs, db_devs, wal_devs, args):
+ super(SingleType, self).__init__(block_devs, db_devs, wal_devs, args)
self.validate_compute()
+ @classmethod
+ def with_auto_devices(cls, devices, args):
+ block_devs, wal_devs = cls.split_devices_rotational(devices)
+ return cls(block_devs, wal_devs, [], args)
+
@staticmethod
def type():
return "bluestore.SingleType"
)
# make sure that data devices do not have any LVs
- validators.no_lvm_membership(self.hdds)
+ validators.no_lvm_membership(self.block_devs)
def compute(self):
"""
a dictionary with the result
"""
osds = self.computed['osds']
- for device in self.hdds:
+ for device in self.block_devs:
for hdd in range(self.osds_per_device):
osd = {'data': {}, 'block.db': {}}
osd['data']['path'] = device.abspath
)
osds.append(osd)
- for device in self.ssds:
+ for device in self.wal_devs:
extents = lvm.sizing(device.lvm_size.b, parts=self.osds_per_device)
for ssd in range(self.osds_per_device):
osd = {'data': {}, 'block.db': {}}
class MixedType(MixedStrategy):
- def __init__(self, devices, args):
- super(MixedType, self).__init__(devices, args)
+ def __init__(self, block_devs, db_devs, wal_devs, args):
+ super(MixedType, self).__init__(block_devs, db_devs, wal_devs, args)
self.block_db_size = self.get_block_size()
self.system_vgs = lvm.VolumeGroups()
- self.dbs_needed = len(self.hdds) * self.osds_per_device
+ self.dbs_needed = len(self.block_devs) * self.osds_per_device
self.use_large_block_db = False
self.validate_compute()
+ @classmethod
+ def with_auto_devices(cls, devices, args):
+ block_devs, db_devs = cls.split_devices_rotational(devices)
+ return cls(block_devs, db_devs, [], args)
+
@staticmethod
def type():
return "bluestore.MixedType"
if self.args.filtered_devices:
string += templates.filtered_devices(self.args.filtered_devices)
string += templates.total_osds.format(
- total_osds=len(self.hdds) * self.osds_per_device
+ total_osds=len(self.block_devs) * self.osds_per_device
)
string += templates.ssd_volume_group.format(
total_lv_size=str(self.total_available_db_space),
total_lvs=vg_extents['parts'] * self.osds_per_device,
block_lv_size=db_size,
- block_db_devices=', '.join([ssd.abspath for ssd in self.ssds]),
+ block_db_devices=', '.join([ssd.abspath for ssd in self.db_devs]),
lv_size=self.block_db_size or str(disk.Size(b=(vg_extents['sizes']))),
- total_osds=len(self.hdds)
+ total_osds=len(self.block_devs)
)
string += templates.osd_component_titles
else:
vg_name = self.common_vg.name
- for device in self.hdds:
+ for device in self.block_devs:
for hdd in range(self.osds_per_device):
osd = {'data': {}, 'block.db': {}}
osd['data']['path'] = device.abspath
validators.minimum_device_size(self.devices, osds_per_device=self.osds_per_device)
# make sure that data devices do not have any LVs
- validators.no_lvm_membership(self.hdds)
+ validators.no_lvm_membership(self.block_devs)
# do not allow non-common VG to continue
- validators.has_common_vg(self.ssds)
+ validators.has_common_vg(self.db_devs)
# find the common VG to calculate how much is available
self.common_vg = self.get_common_vg()
common_vg_size = disk.Size(gb=0)
# non-VG SSDs
- self.vg_ssds = set([d for d in self.ssds if d.is_lvm_member])
- self.blank_ssds = set(self.ssds).difference(self.vg_ssds)
+ self.vg_ssds = set([d for d in self.db_devs if d.is_lvm_member])
+ self.blank_ssds = set(self.db_devs).difference(self.vg_ssds)
self.total_blank_ssd_size = disk.Size(b=0)
for blank_ssd in self.blank_ssds:
self.total_blank_ssd_size += disk.Size(b=blank_ssd.lvm_size.b)
in the same device
"""
- def __init__(self, devices, args):
- super(SingleType, self).__init__(devices, args)
+
+ def __init__(self, block_devs, db_devs, args):
+ super(SingleType, self).__init__(block_devs, db_devs, [], args)
self.journal_size = get_journal_size(args)
self.validate_compute()
+ @classmethod
+ def with_auto_devices(cls, devices, args):
+ block_devs, wal_devs = cls.split_devices_rotational(devices)
+ return cls(block_devs, wal_devs, args)
+
@staticmethod
def type():
return "filestore.SingleType"
validators.minimum_device_size(self.devices, osds_per_device=self.osds_per_device)
# validate collocation
- if self.hdds:
+ if self.block_devs:
validators.minimum_device_collocated_size(
- self.hdds, self.journal_size, osds_per_device=self.osds_per_device
+ self.block_devs, self.journal_size, osds_per_device=self.osds_per_device
)
else:
validators.minimum_device_collocated_size(
- self.ssds, self.journal_size, osds_per_device=self.osds_per_device
+ self.wal_devs, self.journal_size, osds_per_device=self.osds_per_device
)
# make sure that data devices do not have any LVs
- validators.no_lvm_membership(self.hdds)
+ validators.no_lvm_membership(self.block_devs)
def compute(self):
"""
a dictionary with the result
"""
# chose whichever is the one group we have to compute against
- devices = self.hdds or self.ssds
+ devices = self.block_devs or self.wal_devs
osds = self.computed['osds']
for device in devices:
for osd in range(self.osds_per_device):
SSDs are used, otherwise it will be used directly.
"""
- def __init__(self, devices, args):
- super(MixedType, self).__init__(devices, args)
+
+ def __init__(self, block_devs, db_devs, args):
+ super(MixedType, self).__init__(block_devs, db_devs, [], args)
self.blank_ssds = []
- self.journals_needed = len(self.hdds) * self.osds_per_device
+ self.journals_needed = len(self.block_devs) * self.osds_per_device
self.journal_size = get_journal_size(args)
self.system_vgs = lvm.VolumeGroups()
self.validate_compute()
+ @classmethod
+ def with_auto_devices(cls, devices, args):
+ block_devs, db_devs = cls.split_devices_rotational(devices)
+ return cls(block_devs, db_devs, args)
+
@staticmethod
def type():
return "filestore.MixedType"
target='journal',
total_lv_size=str(self.total_available_journal_space),
total_lvs=self.journals_needed,
- block_db_devices=', '.join([d.path for d in self.ssds]),
+ block_db_devices=', '.join([d.path for d in self.db_devs]),
lv_size=str(self.journal_size),
total_osds=self.journals_needed
)
validators.minimum_device_size(self.devices, osds_per_device=self.osds_per_device)
# make sure that data devices do not have any LVs
- validators.no_lvm_membership(self.hdds)
+ validators.no_lvm_membership(self.block_devs)
# do not allow non-common VG to continue
- validators.has_common_vg(self.ssds)
+ validators.has_common_vg(self.db_devs)
# find the common VG to calculate how much is available
self.common_vg = self.get_common_vg()
common_vg_size = disk.Size(gb=0)
# non-VG SSDs
- self.vg_ssds = set([d for d in self.ssds if d.is_lvm_member])
- self.blank_ssds = set(self.ssds).difference(self.vg_ssds)
+ self.vg_ssds = set([d for d in self.db_devs if d.is_lvm_member])
+ self.blank_ssds = set(self.db_devs).difference(self.vg_ssds)
self.total_blank_ssd_size = disk.Size(b=0)
for blank_ssd in self.blank_ssds:
self.total_blank_ssd_size += disk.Size(b=blank_ssd.lvm_size.b)
else:
vg_name = self.common_vg.name
- for device in self.hdds:
+ for device in self.block_devs:
for osd in range(self.osds_per_device):
device_size = disk.Size(b=device.lvm_size.b)
data_size = device_size / self.osds_per_device
class Strategy(object):
- def __init__(self, devices, args):
+ def __init__(self, block_devs, db_devs, wal_devs, args):
self.args = args
self.osds_per_device = args.osds_per_device
- self.devices = devices
- self.hdds = [device for device in devices if device.sys_api['rotational'] == '1']
- self.ssds = [device for device in devices if device.sys_api['rotational'] == '0']
+ self.devices = block_devs + wal_devs + db_devs
+ self.block_devs = block_devs
+ self.db_devs = db_devs
self.computed = {'osds': [], 'vgs': [], 'filtered_devices': args.filtered_devices}
+ @staticmethod
+ def split_devices_rotational(devices):
+ block_devs = [device for device in devices if device.sys_api['rotational'] == '1']
+ db_devs = [device for device in devices if device.sys_api['rotational'] == '0']
+ return block_devs, db_devs
+
+
def validate_compute(self):
if self.devices:
self.validate()
@property
def total_osds(self):
- if self.hdds:
- return len(self.hdds) * self.osds_per_device
+ if self.block_devs:
+ return len(self.block_devs) * self.osds_per_device
else:
- return len(self.ssds) * self.osds_per_device
+ return len(self.wal_devs) * self.osds_per_device
# protect against base class instantiation and incomplete implementations.
# We could also use the abc module and implement this as an
def get_common_vg(self):
# find all the vgs associated with the current device
- for ssd in self.ssds:
+ for ssd in self.db_devs:
for pv in ssd.pvs_api:
vg = self.system_vgs.get(vg_name=pv.vg_name)
if not vg: