]> git.proxmox.com Git - ceph.git/blame - ceph/src/python-common/ceph/deployment/translate.py
import ceph quincy 17.2.1
[ceph.git] / ceph / src / python-common / ceph / deployment / translate.py
CommitLineData
9f95a23c
TL
1import logging
2
3try:
1911f103 4 from typing import Optional, List
9f95a23c
TL
5except ImportError:
6 pass
7
9f95a23c
TL
8from ceph.deployment.drive_selection.selector import DriveSelection
9
10logger = logging.getLogger(__name__)
11
12
f6b5b4d7 13# TODO refactor this to a DriveSelection method
9f95a23c
TL
14class to_ceph_volume(object):
15
16 def __init__(self,
1911f103
TL
17 selection, # type: DriveSelection
18 osd_id_claims=None, # type: Optional[List[str]]
19 preview=False # type: bool
9f95a23c
TL
20 ):
21
9f95a23c 22 self.selection = selection
f6b5b4d7 23 self.spec = selection.spec
1911f103
TL
24 self.preview = preview
25 self.osd_id_claims = osd_id_claims
9f95a23c
TL
26
27 def run(self):
33c7a0ef 28 # type: () -> List[str]
9f95a23c
TL
29 """ Generate ceph-volume commands based on the DriveGroup filters """
30 data_devices = [x.path for x in self.selection.data_devices()]
31 db_devices = [x.path for x in self.selection.db_devices()]
32 wal_devices = [x.path for x in self.selection.wal_devices()]
33 journal_devices = [x.path for x in self.selection.journal_devices()]
34
35 if not data_devices:
33c7a0ef 36 return []
9f95a23c 37
33c7a0ef 38 cmds: List[str] = []
20effc67
TL
39 if self.spec.method == 'raw':
40 assert self.spec.objectstore == 'bluestore'
33c7a0ef
TL
41 # ceph-volume raw prepare only support 1:1 ratio of data to db/wal devices
42 if data_devices and db_devices:
43 if len(data_devices) != len(db_devices):
44 raise ValueError('Number of data devices must match number of '
45 'db devices for raw mode osds')
46 if data_devices and wal_devices:
47 if len(data_devices) != len(wal_devices):
48 raise ValueError('Number of data devices must match number of '
49 'wal devices for raw mode osds')
50 # for raw prepare each data device needs its own prepare command
51 dev_counter = 0
52 while dev_counter < len(data_devices):
53 cmd = "raw prepare --bluestore"
54 cmd += " --data {}".format(data_devices[dev_counter])
55 if db_devices:
56 cmd += " --block.db {}".format(db_devices[dev_counter])
57 if wal_devices:
58 cmd += " --block.wal {}".format(wal_devices[dev_counter])
59 cmds.append(cmd)
60 dev_counter += 1
20effc67
TL
61
62 elif self.spec.objectstore == 'filestore':
33c7a0ef 63 # for lvm batch we can just do all devices in one command
9f95a23c
TL
64 cmd = "lvm batch --no-auto"
65
66 cmd += " {}".format(" ".join(data_devices))
67
68 if self.spec.journal_size:
69 cmd += " --journal-size {}".format(self.spec.journal_size)
70
71 if journal_devices:
72 cmd += " --journal-devices {}".format(
73 ' '.join(journal_devices))
74
75 cmd += " --filestore"
33c7a0ef 76 cmds.append(cmd)
9f95a23c 77
20effc67 78 elif self.spec.objectstore == 'bluestore':
33c7a0ef 79 # for lvm batch we can just do all devices in one command
9f95a23c
TL
80 cmd = "lvm batch --no-auto {}".format(" ".join(data_devices))
81
82 if db_devices:
83 cmd += " --db-devices {}".format(" ".join(db_devices))
84
85 if wal_devices:
86 cmd += " --wal-devices {}".format(" ".join(wal_devices))
87
88 if self.spec.block_wal_size:
89 cmd += " --block-wal-size {}".format(self.spec.block_wal_size)
90
91 if self.spec.block_db_size:
92 cmd += " --block-db-size {}".format(self.spec.block_db_size)
33c7a0ef 93 cmds.append(cmd)
9f95a23c 94
33c7a0ef
TL
95 for i in range(len(cmds)):
96 if self.spec.encrypted:
97 cmds[i] += " --dmcrypt"
9f95a23c 98
33c7a0ef
TL
99 if self.spec.osds_per_device:
100 cmds[i] += " --osds-per-device {}".format(self.spec.osds_per_device)
9f95a23c 101
33c7a0ef
TL
102 if self.spec.data_allocate_fraction:
103 cmds[i] += " --data-allocate-fraction {}".format(self.spec.data_allocate_fraction)
20effc67 104
33c7a0ef
TL
105 if self.osd_id_claims:
106 cmds[i] += " --osd-ids {}".format(" ".join(self.osd_id_claims))
1911f103 107
33c7a0ef
TL
108 if self.spec.method != 'raw':
109 cmds[i] += " --yes"
110 cmds[i] += " --no-systemd"
9f95a23c 111
33c7a0ef
TL
112 if self.preview:
113 cmds[i] += " --report"
114 cmds[i] += " --format json"
1911f103 115
33c7a0ef 116 return cmds