]>
Commit | Line | Data |
---|---|---|
1adf2230 AA |
1 | from ceph_volume.util import disk |
2 | from ceph_volume.api import lvm | |
3 | ||
4 | ||
91327a77 | 5 | def minimum_device_size(devices, osds_per_device=1): |
1adf2230 AA |
6 | """ |
7 | Ensure that the minimum requirements for this type of scenario is | |
8 | met, raise an error if the provided devices would not work | |
9 | """ | |
91327a77 | 10 | msg = 'Unable to use device %s %s, LVs would be smaller than 5GB' |
1adf2230 AA |
11 | for device in devices: |
12 | device_size = disk.Size(b=device.sys_api['size']) | |
91327a77 AA |
13 | lv_size = device_size / osds_per_device |
14 | if lv_size < disk.Size(gb=5): | |
15 | raise RuntimeError(msg % (device_size, device.path)) | |
16 | ||
17 | ||
18 | def minimum_device_collocated_size(devices, journal_size, osds_per_device=1): | |
19 | """ | |
20 | Similar to ``minimum_device_size``, but take into account that the size of | |
21 | the journal affects the size left of the device | |
22 | """ | |
23 | msg = 'Unable to use device %s %s, LVs would be smaller than 5GB' | |
24 | for device in devices: | |
25 | device_size = disk.Size(b=device.sys_api['size']) | |
26 | lv_size = (device_size / osds_per_device) - journal_size | |
27 | if lv_size < disk.Size(gb=5): | |
28 | raise RuntimeError(msg % (device_size, device.path)) | |
1adf2230 AA |
29 | |
30 | ||
31 | def no_lvm_membership(devices): | |
32 | """ | |
33 | Do not allow devices that are part of LVM | |
34 | """ | |
35 | msg = 'Unable to use device, already a member of LVM: %s' | |
36 | for device in devices: | |
37 | if device.is_lvm_member: | |
38 | raise RuntimeError(msg % device.abspath) | |
39 | ||
40 | ||
41 | def has_common_vg(ssd_devices): | |
42 | """ | |
43 | Ensure that devices have a common VG between them | |
44 | """ | |
45 | msg = 'Could not find a common VG between devices: %s' | |
46 | system_vgs = lvm.VolumeGroups() | |
47 | ssd_vgs = {} | |
48 | ||
49 | for ssd_device in ssd_devices: | |
50 | for pv in ssd_device.pvs_api: | |
51 | vg = system_vgs.get(vg_name=pv.vg_name) | |
52 | if not vg: | |
53 | continue | |
54 | try: | |
55 | ssd_vgs[vg.name].append(ssd_device.abspath) | |
56 | except KeyError: | |
57 | ssd_vgs[vg.name] = [ssd_device.abspath] | |
58 | # len of 1 means they all have a common vg, and len of 0 means that these | |
59 | # are blank | |
60 | if len(ssd_vgs) <= 1: | |
61 | return | |
62 | raise RuntimeError(msg % ', '.join(ssd_vgs.keys())) |