]>
Commit | Line | Data |
---|---|---|
181888fb | 1 | import pytest |
3efd9988 FG |
2 | from ceph_volume.devices.lvm import activate |
3 | from ceph_volume.api import lvm as api | |
94b18763 | 4 | from ceph_volume.tests.conftest import Capture |
181888fb FG |
5 | |
6 | ||
7 | class Args(object): | |
8 | ||
9 | def __init__(self, **kw): | |
3efd9988 FG |
10 | # default flags |
11 | self.bluestore = False | |
12 | self.filestore = False | |
94b18763 | 13 | self.no_systemd = False |
3efd9988 | 14 | self.auto_detect_objectstore = None |
181888fb FG |
15 | for k, v in kw.items(): |
16 | setattr(self, k, v) | |
17 | ||
18 | ||
19 | class TestActivate(object): | |
20 | ||
21 | # these tests are very functional, hence the heavy patching, it is hard to | |
22 | # test the negative side effect with an actual functional run, so we must | |
23 | # setup a perfect scenario for this test to check it can really work | |
24 | # with/without osd_id | |
25 | def test_no_osd_id_matches_fsid(self, is_root, volumes, monkeypatch, capture): | |
26 | FooVolume = api.Volume(lv_name='foo', lv_path='/dev/vg/foo', lv_tags="ceph.osd_fsid=1234") | |
27 | volumes.append(FooVolume) | |
28 | monkeypatch.setattr(api, 'Volumes', lambda: volumes) | |
29 | monkeypatch.setattr(activate, 'activate_filestore', capture) | |
3efd9988 FG |
30 | args = Args(osd_id=None, osd_fsid='1234', filestore=True) |
31 | activate.Activate([]).activate(args) | |
32 | assert capture.calls[0]['args'][0] == [FooVolume] | |
33 | ||
34 | def test_no_osd_id_matches_fsid_bluestore(self, is_root, volumes, monkeypatch, capture): | |
35 | FooVolume = api.Volume(lv_name='foo', lv_path='/dev/vg/foo', lv_tags="ceph.osd_fsid=1234") | |
36 | volumes.append(FooVolume) | |
37 | monkeypatch.setattr(api, 'Volumes', lambda: volumes) | |
38 | monkeypatch.setattr(activate, 'activate_bluestore', capture) | |
39 | args = Args(osd_id=None, osd_fsid='1234', bluestore=True) | |
181888fb FG |
40 | activate.Activate([]).activate(args) |
41 | assert capture.calls[0]['args'][0] == [FooVolume] | |
42 | ||
43 | def test_no_osd_id_no_matching_fsid(self, is_root, volumes, monkeypatch, capture): | |
44 | FooVolume = api.Volume(lv_name='foo', lv_path='/dev/vg/foo', lv_tags="ceph.osd_fsid=11234") | |
45 | volumes.append(FooVolume) | |
46 | monkeypatch.setattr(api, 'Volumes', lambda: volumes) | |
47 | monkeypatch.setattr(activate, 'activate_filestore', capture) | |
48 | args = Args(osd_id=None, osd_fsid='1234') | |
49 | with pytest.raises(RuntimeError): | |
50 | activate.Activate([]).activate(args) | |
3efd9988 | 51 | |
94b18763 FG |
52 | def test_filestore_no_systemd(self, is_root, volumes, monkeypatch, capture): |
53 | fake_enable = Capture() | |
54 | fake_start_osd = Capture() | |
55 | monkeypatch.setattr('ceph_volume.util.system.device_is_mounted', lambda *a, **kw: True) | |
56 | monkeypatch.setattr('ceph_volume.util.system.chown', lambda *a, **kw: True) | |
57 | monkeypatch.setattr('ceph_volume.process.run', lambda *a, **kw: True) | |
58 | monkeypatch.setattr(activate.systemctl, 'enable_volume', fake_enable) | |
59 | monkeypatch.setattr(activate.systemctl, 'start_osd', fake_start_osd) | |
60 | JournalVolume = api.Volume( | |
61 | lv_name='journal', | |
62 | lv_path='/dev/vg/journal', | |
63 | lv_uuid='000', | |
64 | lv_tags=','.join([ | |
65 | "ceph.cluster_name=ceph", "ceph.journal_device=/dev/vg/journal", | |
66 | "ceph.journal_uuid=000", "ceph.type=journal", | |
67 | "ceph.osd_id=0","ceph.osd_fsid=1234"]) | |
68 | ) | |
69 | DataVolume = api.Volume( | |
70 | lv_name='data', | |
71 | lv_path='/dev/vg/data', | |
72 | lv_tags="ceph.cluster_name=ceph,ceph.journal_device=/dev/vg/journal,ceph.journal_uuid=000,ceph.type=data,ceph.osd_id=0,ceph.osd_fsid=1234") | |
73 | volumes.append(DataVolume) | |
74 | volumes.append(JournalVolume) | |
75 | monkeypatch.setattr(api, 'Volumes', lambda: volumes) | |
76 | args = Args(osd_id=None, osd_fsid='1234', no_systemd=True, filestore=True) | |
77 | activate.Activate([]).activate(args) | |
78 | assert fake_enable.calls == [] | |
79 | assert fake_start_osd.calls == [] | |
80 | ||
81 | def test_filestore_systemd(self, is_root, volumes, monkeypatch, capture): | |
82 | fake_enable = Capture() | |
83 | fake_start_osd = Capture() | |
84 | monkeypatch.setattr('ceph_volume.util.system.device_is_mounted', lambda *a, **kw: True) | |
85 | monkeypatch.setattr('ceph_volume.util.system.chown', lambda *a, **kw: True) | |
86 | monkeypatch.setattr('ceph_volume.process.run', lambda *a, **kw: True) | |
87 | monkeypatch.setattr(activate.systemctl, 'enable_volume', fake_enable) | |
88 | monkeypatch.setattr(activate.systemctl, 'start_osd', fake_start_osd) | |
89 | JournalVolume = api.Volume( | |
90 | lv_name='journal', | |
91 | lv_path='/dev/vg/journal', | |
92 | lv_uuid='000', | |
93 | lv_tags=','.join([ | |
94 | "ceph.cluster_name=ceph", "ceph.journal_device=/dev/vg/journal", | |
95 | "ceph.journal_uuid=000", "ceph.type=journal", | |
96 | "ceph.osd_id=0","ceph.osd_fsid=1234"]) | |
97 | ) | |
98 | DataVolume = api.Volume( | |
99 | lv_name='data', | |
100 | lv_path='/dev/vg/data', | |
101 | lv_tags="ceph.cluster_name=ceph,ceph.journal_device=/dev/vg/journal,ceph.journal_uuid=000,ceph.type=data,ceph.osd_id=0,ceph.osd_fsid=1234") | |
102 | volumes.append(DataVolume) | |
103 | volumes.append(JournalVolume) | |
104 | monkeypatch.setattr(api, 'Volumes', lambda: volumes) | |
105 | args = Args(osd_id=None, osd_fsid='1234', no_systemd=False, filestore=True) | |
106 | activate.Activate([]).activate(args) | |
107 | assert fake_enable.calls != [] | |
108 | assert fake_start_osd.calls != [] | |
109 | ||
110 | def test_bluestore_no_systemd(self, is_root, volumes, monkeypatch, capture): | |
111 | fake_enable = Capture() | |
112 | fake_start_osd = Capture() | |
113 | monkeypatch.setattr('ceph_volume.util.system.path_is_mounted', lambda *a, **kw: True) | |
114 | monkeypatch.setattr('ceph_volume.util.system.chown', lambda *a, **kw: True) | |
115 | monkeypatch.setattr('ceph_volume.process.run', lambda *a, **kw: True) | |
116 | monkeypatch.setattr(activate.systemctl, 'enable_volume', fake_enable) | |
117 | monkeypatch.setattr(activate.systemctl, 'start_osd', fake_start_osd) | |
118 | DataVolume = api.Volume( | |
119 | lv_name='data', | |
120 | lv_path='/dev/vg/data', | |
121 | lv_tags="ceph.cluster_name=ceph,,ceph.journal_uuid=000,ceph.type=block,ceph.osd_id=0,ceph.osd_fsid=1234") | |
122 | volumes.append(DataVolume) | |
123 | monkeypatch.setattr(api, 'Volumes', lambda: volumes) | |
124 | args = Args(osd_id=None, osd_fsid='1234', no_systemd=True, bluestore=True) | |
125 | activate.Activate([]).activate(args) | |
126 | assert fake_enable.calls == [] | |
127 | assert fake_start_osd.calls == [] | |
128 | ||
129 | def test_bluestore_systemd(self, is_root, volumes, monkeypatch, capture): | |
130 | fake_enable = Capture() | |
131 | fake_start_osd = Capture() | |
132 | monkeypatch.setattr('ceph_volume.util.system.path_is_mounted', lambda *a, **kw: True) | |
133 | monkeypatch.setattr('ceph_volume.util.system.chown', lambda *a, **kw: True) | |
134 | monkeypatch.setattr('ceph_volume.process.run', lambda *a, **kw: True) | |
135 | monkeypatch.setattr(activate.systemctl, 'enable_volume', fake_enable) | |
136 | monkeypatch.setattr(activate.systemctl, 'start_osd', fake_start_osd) | |
137 | DataVolume = api.Volume( | |
138 | lv_name='data', | |
139 | lv_path='/dev/vg/data', | |
140 | lv_tags="ceph.cluster_name=ceph,,ceph.journal_uuid=000,ceph.type=block,ceph.osd_id=0,ceph.osd_fsid=1234") | |
141 | volumes.append(DataVolume) | |
142 | monkeypatch.setattr(api, 'Volumes', lambda: volumes) | |
143 | args = Args(osd_id=None, osd_fsid='1234', no_systemd=False, bluestore=True) | |
144 | activate.Activate([]).activate(args) | |
145 | assert fake_enable.calls != [] | |
146 | assert fake_start_osd.calls != [] | |
147 | ||
3efd9988 FG |
148 | |
149 | class TestActivateFlags(object): | |
150 | ||
151 | def test_default_objectstore(self, capture): | |
152 | args = ['0', 'asdf-ljh-asdf'] | |
153 | activation = activate.Activate(args) | |
154 | activation.activate = capture | |
155 | activation.main() | |
156 | parsed_args = capture.calls[0]['args'][0] | |
157 | assert parsed_args.filestore is False | |
158 | assert parsed_args.bluestore is True | |
159 | ||
160 | def test_uses_filestore(self, capture): | |
161 | args = ['--filestore', '0', 'asdf-ljh-asdf'] | |
162 | activation = activate.Activate(args) | |
163 | activation.activate = capture | |
164 | activation.main() | |
165 | parsed_args = capture.calls[0]['args'][0] | |
166 | assert parsed_args.filestore is True | |
167 | assert parsed_args.bluestore is False | |
168 | ||
169 | def test_uses_bluestore(self, capture): | |
170 | args = ['--bluestore', '0', 'asdf-ljh-asdf'] | |
171 | activation = activate.Activate(args) | |
172 | activation.activate = capture | |
173 | activation.main() | |
174 | parsed_args = capture.calls[0]['args'][0] | |
175 | assert parsed_args.filestore is False | |
176 | assert parsed_args.bluestore is True | |
94b18763 FG |
177 | |
178 | ||
179 | class TestActivateAll(object): | |
180 | ||
181 | def test_does_not_detect_osds(self, capsys, is_root, capture, monkeypatch): | |
182 | monkeypatch.setattr('ceph_volume.devices.lvm.activate.direct_report', lambda: {}) | |
183 | args = ['--all'] | |
184 | activation = activate.Activate(args) | |
185 | activation.main() | |
186 | out, err = capsys.readouterr() | |
187 | assert 'Was unable to find any OSDs to activate' in out | |
188 | assert 'Verify OSDs are present with ' in out | |
189 | ||
190 | def test_detects_running_osds(self, capsys, is_root, capture, monkeypatch): | |
191 | monkeypatch.setattr('ceph_volume.devices.lvm.activate.direct_report', lambda: direct_report) | |
192 | monkeypatch.setattr('ceph_volume.devices.lvm.activate.systemctl.osd_is_active', lambda x: True) | |
193 | args = ['--all'] | |
194 | activation = activate.Activate(args) | |
195 | activation.main() | |
196 | out, err = capsys.readouterr() | |
197 | assert 'a8789a96ce8b process is active. Skipping activation' in out | |
198 | assert 'b8218eaa1634 process is active. Skipping activation' in out | |
199 | ||
200 | def test_detects_osds_to_activate(self, is_root, capture, monkeypatch): | |
201 | monkeypatch.setattr('ceph_volume.devices.lvm.activate.direct_report', lambda: direct_report) | |
202 | monkeypatch.setattr('ceph_volume.devices.lvm.activate.systemctl.osd_is_active', lambda x: False) | |
203 | args = ['--all'] | |
204 | activation = activate.Activate(args) | |
205 | activation.activate = capture | |
206 | activation.main() | |
207 | calls = sorted(capture.calls, key=lambda x: x['kwargs']['osd_id']) | |
208 | assert calls[0]['kwargs']['osd_id'] == '0' | |
209 | assert calls[0]['kwargs']['osd_fsid'] == '957d22b7-24ce-466a-9883-b8218eaa1634' | |
210 | assert calls[1]['kwargs']['osd_id'] == '1' | |
211 | assert calls[1]['kwargs']['osd_fsid'] == 'd0f3e4ad-e52a-4520-afc0-a8789a96ce8b' | |
212 | ||
213 | # | |
214 | # Activate All fixture | |
215 | # | |
216 | ||
217 | direct_report = { | |
218 | "0": [ | |
219 | { | |
220 | "lv_name": "osd-block-957d22b7-24ce-466a-9883-b8218eaa1634", | |
221 | "lv_path": "/dev/ceph-d4962338-46ff-4cd5-8ea6-c033dbdc5b44/osd-block-957d22b7-24ce-466a-9883-b8218eaa1634", | |
222 | "lv_tags": "ceph.block_device=/dev/ceph-d4962338-46ff-4cd5-8ea6-c033dbdc5b44/osd-block-957d22b7-24ce-466a-9883-b8218eaa1634,ceph.block_uuid=6MixOd-2Q1I-f8K3-PPOq-UJGV-L3A0-0XwUm4,ceph.cephx_lockbox_secret=,ceph.cluster_fsid=d4962338-46ff-4cd5-8ea6-c033dbdc5b44,ceph.cluster_name=ceph,ceph.crush_device_class=None,ceph.encrypted=0,ceph.osd_fsid=957d22b7-24ce-466a-9883-b8218eaa1634,ceph.osd_id=0,ceph.type=block", | |
223 | "lv_uuid": "6MixOd-2Q1I-f8K3-PPOq-UJGV-L3A0-0XwUm4", | |
224 | "name": "osd-block-957d22b7-24ce-466a-9883-b8218eaa1634", | |
225 | "path": "/dev/ceph-d4962338-46ff-4cd5-8ea6-c033dbdc5b44/osd-block-957d22b7-24ce-466a-9883-b8218eaa1634", | |
226 | "tags": { | |
227 | "ceph.block_device": "/dev/ceph-d4962338-46ff-4cd5-8ea6-c033dbdc5b44/osd-block-957d22b7-24ce-466a-9883-b8218eaa1634", | |
228 | "ceph.block_uuid": "6MixOd-2Q1I-f8K3-PPOq-UJGV-L3A0-0XwUm4", | |
229 | "ceph.cephx_lockbox_secret": "", | |
230 | "ceph.cluster_fsid": "d4962338-46ff-4cd5-8ea6-c033dbdc5b44", | |
231 | "ceph.cluster_name": "ceph", | |
232 | "ceph.crush_device_class": "None", | |
233 | "ceph.encrypted": "0", | |
234 | "ceph.osd_fsid": "957d22b7-24ce-466a-9883-b8218eaa1634", | |
235 | "ceph.osd_id": "0", | |
236 | "ceph.type": "block" | |
237 | }, | |
238 | "type": "block", | |
239 | "vg_name": "ceph-d4962338-46ff-4cd5-8ea6-c033dbdc5b44" | |
240 | } | |
241 | ], | |
242 | "1": [ | |
243 | { | |
244 | "lv_name": "osd-block-d0f3e4ad-e52a-4520-afc0-a8789a96ce8b", | |
245 | "lv_path": "/dev/ceph-7538bcf0-f155-4d3f-a9fd-d8b15905e532/osd-block-d0f3e4ad-e52a-4520-afc0-a8789a96ce8b", | |
246 | "lv_tags": "ceph.block_device=/dev/ceph-7538bcf0-f155-4d3f-a9fd-d8b15905e532/osd-block-d0f3e4ad-e52a-4520-afc0-a8789a96ce8b,ceph.block_uuid=1igwLb-ZlmV-eLgp-hapx-c1Hr-M5gz-sHjnyW,ceph.cephx_lockbox_secret=,ceph.cluster_fsid=d4962338-46ff-4cd5-8ea6-c033dbdc5b44,ceph.cluster_name=ceph,ceph.crush_device_class=None,ceph.encrypted=0,ceph.osd_fsid=d0f3e4ad-e52a-4520-afc0-a8789a96ce8b,ceph.osd_id=1,ceph.type=block", | |
247 | "lv_uuid": "1igwLb-ZlmV-eLgp-hapx-c1Hr-M5gz-sHjnyW", | |
248 | "name": "osd-block-d0f3e4ad-e52a-4520-afc0-a8789a96ce8b", | |
249 | "path": "/dev/ceph-7538bcf0-f155-4d3f-a9fd-d8b15905e532/osd-block-d0f3e4ad-e52a-4520-afc0-a8789a96ce8b", | |
250 | "tags": { | |
251 | "ceph.block_device": "/dev/ceph-7538bcf0-f155-4d3f-a9fd-d8b15905e532/osd-block-d0f3e4ad-e52a-4520-afc0-a8789a96ce8b", | |
252 | "ceph.block_uuid": "1igwLb-ZlmV-eLgp-hapx-c1Hr-M5gz-sHjnyW", | |
253 | "ceph.cephx_lockbox_secret": "", | |
254 | "ceph.cluster_fsid": "d4962338-46ff-4cd5-8ea6-c033dbdc5b44", | |
255 | "ceph.cluster_name": "ceph", | |
256 | "ceph.crush_device_class": "None", | |
257 | "ceph.encrypted": "0", | |
258 | "ceph.osd_fsid": "d0f3e4ad-e52a-4520-afc0-a8789a96ce8b", | |
259 | "ceph.osd_id": "1", | |
260 | "ceph.type": "block" | |
261 | }, | |
262 | "type": "block", | |
263 | "vg_name": "ceph-7538bcf0-f155-4d3f-a9fd-d8b15905e532" | |
264 | } | |
265 | ] | |
266 | } |