]> git.proxmox.com Git - ceph.git/blob - ceph/src/python-common/ceph/deployment/translate.py
bump version to 15.2.4-pve1
[ceph.git] / ceph / src / python-common / ceph / deployment / translate.py
1 import logging
2
3 try:
4 from typing import Optional, List
5 except ImportError:
6 pass
7
8 from ceph.deployment.drive_group import DriveGroupSpec
9 from ceph.deployment.drive_selection.selector import DriveSelection
10
11 logger = logging.getLogger(__name__)
12
13
14 class to_ceph_volume(object):
15
16 def __init__(self,
17 spec, # type: DriveGroupSpec
18 selection, # type: DriveSelection
19 osd_id_claims=None, # type: Optional[List[str]]
20 preview=False # type: bool
21 ):
22
23 self.spec = spec
24 self.selection = selection
25 self.preview = preview
26 self.osd_id_claims = osd_id_claims
27
28 def run(self):
29 # type: () -> Optional[str]
30 """ Generate ceph-volume commands based on the DriveGroup filters """
31 data_devices = [x.path for x in self.selection.data_devices()]
32 db_devices = [x.path for x in self.selection.db_devices()]
33 wal_devices = [x.path for x in self.selection.wal_devices()]
34 journal_devices = [x.path for x in self.selection.journal_devices()]
35
36 if not data_devices:
37 return None
38
39 cmd = ""
40 if self.spec.objectstore == 'filestore':
41 cmd = "lvm batch --no-auto"
42
43 cmd += " {}".format(" ".join(data_devices))
44
45 if self.spec.journal_size:
46 cmd += " --journal-size {}".format(self.spec.journal_size)
47
48 if journal_devices:
49 cmd += " --journal-devices {}".format(
50 ' '.join(journal_devices))
51
52 cmd += " --filestore"
53
54 # HORRIBLE HACK
55 if self.spec.objectstore == 'bluestore' and \
56 not self.spec.encrypted and \
57 not self.spec.osds_per_device and \
58 len(data_devices) == 1 and \
59 not db_devices and \
60 not wal_devices:
61 cmd = "lvm prepare --bluestore --data %s --no-systemd" % (' '.join(data_devices))
62 if self.osd_id_claims:
63 cmd += " --osd-id {}".format(str(self.osd_id_claims[0]))
64 if self.preview:
65 # Like every horrible hack, this has sideffects on other features.
66 # In this case, 'lvm prepare' has neither a '--report' nor a '--format json' option
67 # which essentially doesn't allow for a proper previews here.
68 # Fall back to lvm batch in order to get a preview.
69 return f"lvm batch --no-auto {' '.join(data_devices)} --report --format json"
70 return cmd
71
72 if self.spec.objectstore == 'bluestore':
73
74 cmd = "lvm batch --no-auto {}".format(" ".join(data_devices))
75
76 if db_devices:
77 cmd += " --db-devices {}".format(" ".join(db_devices))
78
79 if wal_devices:
80 cmd += " --wal-devices {}".format(" ".join(wal_devices))
81
82 if self.spec.block_wal_size:
83 cmd += " --block-wal-size {}".format(self.spec.block_wal_size)
84
85 if self.spec.block_db_size:
86 cmd += " --block-db-size {}".format(self.spec.block_db_size)
87
88 if self.spec.encrypted:
89 cmd += " --dmcrypt"
90
91 if self.spec.osds_per_device:
92 cmd += " --osds-per-device {}".format(self.spec.osds_per_device)
93
94 if self.osd_id_claims:
95 cmd += " --osd-ids {}".format(" ".join(self.osd_id_claims))
96
97 cmd += " --yes"
98 cmd += " --no-systemd"
99
100 if self.preview:
101 cmd += " --report"
102 cmd += " --format json"
103
104 return cmd