summaryrefslogtreecommitdiffstats
path: root/src/ceph-volume
diff options
context:
space:
mode:
authorAlfredo Deza <adeza@redhat.com>2018-08-08 18:58:16 +0200
committerAlfredo Deza <adeza@redhat.com>2018-08-10 19:14:31 +0200
commitaf99401cad2c25b02e6ea0df4554d80afbad2b9b (patch)
tree05d0bc8272ef569c7b364c51c510088dbbf405aa /src/ceph-volume
parentceph-volume tests.util verify that Size object don't change state (diff)
downloadceph-af99401cad2c25b02e6ea0df4554d80afbad2b9b.tar.xz
ceph-af99401cad2c25b02e6ea0df4554d80afbad2b9b.zip
ceph-volume lvm.strategies create single type filestore
Signed-off-by: Alfredo Deza <adeza@redhat.com>
Diffstat (limited to 'src/ceph-volume')
-rw-r--r--src/ceph-volume/ceph_volume/devices/lvm/strategies/filestore.py115
1 files changed, 114 insertions, 1 deletions
diff --git a/src/ceph-volume/ceph_volume/devices/lvm/strategies/filestore.py b/src/ceph-volume/ceph_volume/devices/lvm/strategies/filestore.py
index 3d8870ab6d0..914772f3b56 100644
--- a/src/ceph-volume/ceph_volume/devices/lvm/strategies/filestore.py
+++ b/src/ceph-volume/ceph_volume/devices/lvm/strategies/filestore.py
@@ -1,7 +1,120 @@
+from __future__ import print_function
+import json
+from ceph_volume.util import disk
+from ceph_volume.api import lvm
+from . import validators
+from ceph_volume.devices.lvm.create import Create
+from ceph_volume.util import templates
class SingleType(object):
- pass
+ """
+ Support for all SSDs, or all HDDs, data and journal LVs will be colocated
+ in the same device
+ """
+
+ def __init__(self, devices, args):
+ self.args = args
+ self.devices = devices
+ self.hdds = [device for device in devices if device['rotational'] == '1']
+ self.ssds = [device for device in devices if device['rotational'] == '0']
+ self.computed = {'osds': [], 'vgs': []}
+ self.validate()
+ self.compute()
+
+ def report_json(self):
+ print(json.dumps(self.computed, indent=4, sort_keys=True))
+
+ def report_pretty(self):
+ string = ""
+ string += templates.osd_header.format(
+ total_osds=len(self.hdds) or len(self.ssds) * 2
+ )
+ string += templates.osd_component
+
+ for osd in self.computed['osds']:
+ string += templates.osd_header
+ string += templates.osd_component.format(
+ _type='[data]',
+ path=osd['data']['path'],
+ size=osd['data']['human_readable_size'],
+ percent=osd['data']['percentage'],
+ )
+ string += templates.osd_component.format(
+ _type='[journal]',
+ path=osd['journal']['path'],
+ size=osd['journal']['human_readable_size'],
+ percent=osd['journal']['percentage'],
+ )
+
+ print(string)
+
+ def validate(self):
+ """
+ Ensure that the minimum requirements for this type of scenario is
+ met, raise an error if the provided devices would not work
+ """
+ # validate minimum size for all devices
+ validators.minimum_device_size(self.devices)
+
+ def compute(self):
+ """
+ Go through the rules needed to properly size the lvs, return
+ a dictionary with the result
+ """
+ # chose whichever is the one group we have to compute against
+ devices = self.hdds or self.ssds
+ osds = self.computed['osds']
+ vgs = self.computed['vgs']
+ for device in devices:
+ # XXX needs to read `osd journal size` from ceph.conf
+ device_size = disk.Size(b=device['size'])
+ journal_size = disk.Size(gb=5)
+ data_size = device_size - journal_size
+ data_percentage = data_size * 100 / device_size
+ vgs.append({'devices': [device['path']], 'parts': 2})
+ osd = {'data': {}, 'journal': {}}
+ osd['data']['path'] = device['path']
+ osd['data']['size'] = data_size.b
+ osd['data']['percentage'] = round(data_percentage.b)
+ osd['data']['human_readable_size'] = str(data_size / 100)
+ osd['journal']['path'] = device['path']
+ osd['journal']['size'] = journal_size.b
+ osd['journal']['percentage'] = round(100 - data_percentage.b)
+ osd['journal']['human_readable_size'] = str(journal_size)
+ osds.append(osd)
+
+ def execute(self):
+ """
+ Create vgs/lvs from the incoming set of devices, assign their roles
+ (data, journal) and offload the OSD creation to ``lvm create``
+ """
+ osd_vgs = []
+
+ # create the vgs first, one per device (since this is colocating, it
+ # picks the 'data' path)
+ for osd in self.computed['osds']:
+ vg = lvm.create_vg(osd['data']['path'])
+ osd_vgs.append(vg)
+
+ # create the lvs from the vgs captured in the beginning
+ for vg in osd_vgs:
+ # XXX needs to read `osd journal size` from ceph.conf
+ journal_lv = lvm.create_lv('osd-journal', vg.name, size='5G')
+ # no extents or size means it will use 100%FREE
+ data_lv = lvm.create_lv('osd-data', vg.name)
+
+ command = ['--filestore', '--data']
+ command.append('%s/%s' % (vg.name, data_lv.name))
+ command.extend(['--journal', '%s/%s' % (vg.name, journal_lv.name)])
+ if self.args.dmcrypt:
+ command.append('--dmcrypt')
+ if self.args.no_systemd:
+ command.append('--no-systemd')
+ if self.args.crush_device_class:
+ command.extend(['--crush-device-class', self.args.crush_device_class])
+
+ Create(command).main()
class MixedType(object):