Skip to content

Commit dd14904

Browse files
authored
Merge pull request ceph#65029 from guits/drop-udevadm-subprocess-calls
ceph-volume: drop udevadm subprocess calls Reviewed-by: Adam King <[email protected]>
2 parents 19d47e2 + 727e69d commit dd14904

File tree

10 files changed

+120
-182
lines changed

10 files changed

+120
-182
lines changed

src/ceph-volume/ceph_volume/tests/conftest.py

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -289,7 +289,6 @@ def disable_kernel_queries(monkeypatch):
289289
This speeds up calls to Device and Disk
290290
'''
291291
monkeypatch.setattr("ceph_volume.util.device.disk.get_devices", lambda device='': {})
292-
monkeypatch.setattr("ceph_volume.util.disk.udevadm_property", lambda *a, **kw: {})
293292

294293

295294
@pytest.fixture(params=[
@@ -357,17 +356,22 @@ def patch_bluestore_label():
357356
yield p
358357

359358
@pytest.fixture
360-
def device_info(monkeypatch, patch_bluestore_label):
361-
def apply(devices=None, lsblk=None, lv=None, blkid=None, udevadm=None,
362-
has_bluestore_label=False):
359+
def patch_udevdata(monkeypatch):
360+
fake_udevdata = MagicMock()
361+
fake_udevdata.environment = {k:k for k in ['ID_VENDOR', 'ID_MODEL', 'ID_SCSI_SERIAL']}
362+
monkeypatch.setattr("ceph_volume.util.disk.UdevData", lambda path: fake_udevdata)
363+
yield
364+
365+
@pytest.fixture
366+
def device_info(monkeypatch, patch_bluestore_label, patch_udevdata):
367+
def apply(devices=None, lsblk=None, lv=None, blkid=None):
363368
if devices:
364369
for dev in devices.keys():
365370
devices[dev]['device_nodes'] = [os.path.basename(dev)]
366371
else:
367372
devices = {}
368373
lsblk = lsblk if lsblk else {}
369374
blkid = blkid if blkid else {}
370-
udevadm = udevadm if udevadm else {}
371375
lv = Factory(**lv) if lv else None
372376
monkeypatch.setattr("ceph_volume.sys_info.devices", {})
373377
monkeypatch.setattr("ceph_volume.util.device.disk.get_devices", lambda device='': devices)
@@ -378,7 +382,6 @@ def apply(devices=None, lsblk=None, lv=None, blkid=None, udevadm=None,
378382
lambda path: [lv])
379383
monkeypatch.setattr("ceph_volume.util.device.disk.lsblk", lambda path: lsblk)
380384
monkeypatch.setattr("ceph_volume.util.device.disk.blkid", lambda path: blkid)
381-
monkeypatch.setattr("ceph_volume.util.disk.udevadm_property", lambda *a, **kw: udevadm)
382385
return apply
383386

384387
@pytest.fixture(params=[0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.95, 0.999, 1.0])
@@ -387,12 +390,23 @@ def data_allocate_fraction(request):
387390

388391
@pytest.fixture
389392
def fake_filesystem(fs):
390-
393+
fs.create_dir('/dev')
391394
fs.create_dir('/sys/block/sda/slaves')
392395
fs.create_dir('/sys/block/sda/queue')
393396
fs.create_dir('/sys/block/rbd0')
394397
fs.create_dir('/var/log/ceph')
395398
fs.create_dir('/tmp/osdpath')
399+
fs.create_file('/sys/block/sda/dev', contents='8:0')
400+
fs.create_dir('/run/udev/data')
401+
fs.create_file('/run/udev/data/b8:0', contents="""
402+
P:8:0
403+
E:DEVNAME=/dev/sda
404+
E:DEVTYPE=disk
405+
E:ID_MODEL=
406+
E:ID_SERIAL=
407+
E:ID_VENDOR=
408+
""".strip())
409+
396410
yield fs
397411

398412
@pytest.fixture

src/ceph-volume/ceph_volume/tests/devices/lvm/data_zap.py

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -65,17 +65,3 @@
6565
'NAME="/dev/sdz" KNAME="/dev/sdz" PKNAME="" PARTLABEL=""']
6666

6767
blkid_output = ['/dev/ceph-1172bba3-3e0e-45e5-ace6-31ae8401221f/osd-block-5050a85c-d1a7-4d66-b4ba-2e9b1a2970ae: TYPE="ceph_bluestore" USAGE="other"']
68-
69-
udevadm_property = '''DEVNAME=/dev/sdb
70-
DEVTYPE=disk
71-
ID_ATA=1
72-
ID_BUS=ata
73-
ID_MODEL=SK_hynix_SC311_SATA_512GB
74-
ID_PART_TABLE_TYPE=gpt
75-
ID_PART_TABLE_UUID=c8f91d57-b26c-4de1-8884-0c9541da288c
76-
ID_PATH=pci-0000:00:17.0-ata-3
77-
ID_PATH_TAG=pci-0000_00_17_0-ata-3
78-
ID_REVISION=70000P10
79-
ID_SERIAL=SK_hynix_SC311_SATA_512GB_MS83N71801150416A
80-
TAGS=:systemd:
81-
USEC_INITIALIZED=16117769'''.split('\n')

src/ceph-volume/ceph_volume/tests/devices/lvm/test_migrate.py

Lines changed: 37 additions & 31 deletions
Large diffs are not rendered by default.

src/ceph-volume/ceph_volume/tests/devices/lvm/test_zap.py

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,6 @@
1212

1313
def process_call(command, **kw):
1414
result: Tuple[List[str], List[str], int] = ''
15-
if 'udevadm' in command:
16-
result = data_zap.udevadm_property, [], 0
1715
if 'ceph-bluestore-tool' in command:
1816
result = data_zap.ceph_bluestore_tool_output, [], 0
1917
if 'is-active' in command:
@@ -120,7 +118,7 @@ def test_no_ceph_lvs_and_no_ceph_raw_found(self, is_root, monkeypatch):
120118

121119
@patch('ceph_volume.devices.lvm.zap.Zap.zap')
122120
@patch('ceph_volume.process.call', Mock(side_effect=process_call))
123-
def test_lv_is_matched_id(self, mock_zap, monkeypatch, is_root):
121+
def test_lv_is_matched_id(self, mock_zap, monkeypatch, is_root, patch_udevdata):
124122
tags = 'ceph.osd_id=0,ceph.journal_uuid=x,ceph.type=data'
125123
osd = api.Volume(lv_name='volume1', lv_uuid='y', vg_name='',
126124
lv_path='/dev/VolGroup/lv', lv_tags=tags)
@@ -137,7 +135,7 @@ def test_lv_is_matched_id(self, mock_zap, monkeypatch, is_root):
137135
@patch('ceph_volume.devices.lvm.zap.Zap.zap')
138136
@patch('ceph_volume.devices.raw.list.List.filter_lvm_osd_devices', Mock(return_value='/dev/sdb'))
139137
@patch('ceph_volume.process.call', Mock(side_effect=process_call))
140-
def test_raw_is_matched_id(self, mock_zap, monkeypatch, is_root):
138+
def test_raw_is_matched_id(self, mock_zap, monkeypatch, is_root, patch_udevdata):
141139
volumes = []
142140
monkeypatch.setattr(zap.api, 'get_lvs', lambda **kw: volumes)
143141

@@ -147,7 +145,7 @@ def test_raw_is_matched_id(self, mock_zap, monkeypatch, is_root):
147145
mock_zap.assert_called_once()
148146

149147
@patch('ceph_volume.devices.lvm.zap.Zap.zap')
150-
def test_lv_is_matched_fsid(self, mock_zap, monkeypatch, is_root):
148+
def test_lv_is_matched_fsid(self, mock_zap, monkeypatch, is_root, patch_udevdata):
151149
tags = 'ceph.osd_id=0,ceph.osd_fsid=asdf-lkjh,ceph.journal_uuid=x,' +\
152150
'ceph.type=data'
153151
osd = api.Volume(lv_name='volume1', lv_uuid='y', vg_name='',
@@ -166,7 +164,7 @@ def test_lv_is_matched_fsid(self, mock_zap, monkeypatch, is_root):
166164
@patch('ceph_volume.devices.lvm.zap.Zap.zap')
167165
@patch('ceph_volume.devices.raw.list.List.filter_lvm_osd_devices', Mock(return_value='/dev/sdb'))
168166
@patch('ceph_volume.process.call', Mock(side_effect=process_call))
169-
def test_raw_is_matched_fsid(self, mock_zap, monkeypatch, is_root):
167+
def test_raw_is_matched_fsid(self, mock_zap, monkeypatch, is_root, patch_udevdata):
170168
volumes = []
171169
monkeypatch.setattr(zap.api, 'get_lvs', lambda **kw: volumes)
172170

@@ -177,7 +175,7 @@ def test_raw_is_matched_fsid(self, mock_zap, monkeypatch, is_root):
177175
mock_zap.assert_called_once
178176

179177
@patch('ceph_volume.devices.lvm.zap.Zap.zap')
180-
def test_lv_is_matched_id_fsid(self, mock_zap, monkeypatch, is_root):
178+
def test_lv_is_matched_id_fsid(self, mock_zap, monkeypatch, is_root, patch_udevdata):
181179
tags = 'ceph.osd_id=0,ceph.osd_fsid=asdf-lkjh,ceph.journal_uuid=x,' +\
182180
'ceph.type=data'
183181
osd = api.Volume(lv_name='volume1', lv_uuid='y', vg_name='',
@@ -197,7 +195,7 @@ def test_lv_is_matched_id_fsid(self, mock_zap, monkeypatch, is_root):
197195
@patch('ceph_volume.devices.lvm.zap.Zap.zap')
198196
@patch('ceph_volume.devices.raw.list.List.filter_lvm_osd_devices', Mock(return_value='/dev/sdb'))
199197
@patch('ceph_volume.process.call', Mock(side_effect=process_call))
200-
def test_raw_is_matched_id_fsid(self, mock_zap, monkeypatch, is_root):
198+
def test_raw_is_matched_id_fsid(self, mock_zap, monkeypatch, is_root, patch_udevdata):
201199
volumes = []
202200
monkeypatch.setattr(zap.api, 'get_lvs', lambda **kw: volumes)
203201

@@ -211,7 +209,7 @@ def test_raw_is_matched_id_fsid(self, mock_zap, monkeypatch, is_root):
211209
@patch('ceph_volume.devices.lvm.zap.Zap.zap')
212210
@patch('ceph_volume.devices.raw.list.List.filter_lvm_osd_devices', Mock(side_effect=['/dev/vdx', '/dev/vdy', '/dev/vdz', None]))
213211
@patch('ceph_volume.process.call', Mock(side_effect=process_call))
214-
def test_raw_multiple_devices(self, mock_zap, monkeypatch, is_root):
212+
def test_raw_multiple_devices(self, mock_zap, monkeypatch, is_root, patch_udevdata):
215213
volumes = []
216214
monkeypatch.setattr(zap.api, 'get_lvs', lambda **kw: volumes)
217215
z = zap.Zap(['--osd-id', '5'])

src/ceph-volume/ceph_volume/tests/objectstore/test_lvm.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -450,7 +450,7 @@ def test__activate_raises_exception(self):
450450
@pytest.mark.parametrize("encrypted", ["ceph.encrypted=0", "ceph.encrypted=1"])
451451
def test__activate(self,
452452
m_success, m_create_osd_path,
453-
monkeypatch, fake_run, fake_call, encrypted, conf_ceph_stub):
453+
monkeypatch, fake_run, fake_call, encrypted, conf_ceph_stub, patch_udevdata):
454454
conf_ceph_stub('[global]\nfsid=asdf-lkjh')
455455
monkeypatch.setattr(system, 'chown', lambda path: 0)
456456
monkeypatch.setattr('ceph_volume.configuration.load', lambda: None)

src/ceph-volume/ceph_volume/tests/test_inventory.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88

99

1010
@pytest.fixture
11-
@patch("ceph_volume.util.disk.has_bluestore_label", lambda x: False)
1211
def device_report_keys(device_info):
1312
device_info(devices={
1413
# example output of disk.get_devices()

src/ceph-volume/ceph_volume/tests/util/test_device.py

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -202,22 +202,22 @@ def test_is_not_mapper_device(self, fake_call, device_info):
202202
@pytest.mark.usefixtures("lsblk_ceph_disk_member",
203203
"disable_kernel_queries")
204204
@patch("ceph_volume.util.disk.has_bluestore_label", lambda x: False)
205-
def test_is_ceph_disk_lsblk(self, fake_call, monkeypatch, patch_bluestore_label):
205+
def test_is_ceph_disk_lsblk(self, patch_udevdata, fake_call, monkeypatch, patch_bluestore_label):
206206
disk = device.Device("/dev/sda")
207207
assert disk.is_ceph_disk_member
208208

209209
@pytest.mark.usefixtures("blkid_ceph_disk_member",
210210
"lsblk_ceph_disk_member",
211211
"disable_kernel_queries")
212212
@patch("ceph_volume.util.disk.has_bluestore_label", lambda x: False)
213-
def test_is_ceph_disk_blkid(self, fake_call, monkeypatch, patch_bluestore_label):
213+
def test_is_ceph_disk_blkid(self, patch_udevdata, fake_call, monkeypatch, patch_bluestore_label):
214214
disk = device.Device("/dev/sda")
215215
assert disk.is_ceph_disk_member
216216

217217
@pytest.mark.usefixtures("lsblk_ceph_disk_member",
218218
"disable_kernel_queries")
219219
@patch("ceph_volume.util.disk.has_bluestore_label", lambda x: False)
220-
def test_is_ceph_disk_member_not_available_lsblk(self, fake_call, monkeypatch, patch_bluestore_label):
220+
def test_is_ceph_disk_member_not_available_lsblk(self, patch_udevdata, fake_call, monkeypatch, patch_bluestore_label):
221221
disk = device.Device("/dev/sda")
222222
assert disk.is_ceph_disk_member
223223
assert not disk.available
@@ -227,7 +227,7 @@ def test_is_ceph_disk_member_not_available_lsblk(self, fake_call, monkeypatch, p
227227
"lsblk_ceph_disk_member",
228228
"disable_kernel_queries")
229229
@patch("ceph_volume.util.disk.has_bluestore_label", lambda x: False)
230-
def test_is_ceph_disk_member_not_available_blkid(self, fake_call, monkeypatch, patch_bluestore_label):
230+
def test_is_ceph_disk_member_not_available_blkid(self, patch_udevdata, fake_call, monkeypatch, patch_bluestore_label):
231231
disk = device.Device("/dev/sda")
232232
assert disk.is_ceph_disk_member
233233
assert not disk.available
@@ -366,7 +366,7 @@ def test_reject_device_with_oserror(self, fake_call, monkeypatch, patch_bluestor
366366
"device_info_not_ceph_disk_member",
367367
"disable_kernel_queries")
368368
@patch("ceph_volume.util.disk.has_bluestore_label", lambda x: False)
369-
def test_is_not_ceph_disk_member_lsblk(self, fake_call, patch_bluestore_label):
369+
def test_is_not_ceph_disk_member_lsblk(self, patch_udevdata, fake_call, patch_bluestore_label):
370370
disk = device.Device("/dev/sda")
371371
assert disk.is_ceph_disk_member is False
372372

@@ -456,9 +456,8 @@ def test_not_used_by_ceph(self, fake_call, device_info, monkeypatch):
456456

457457
@patch("ceph_volume.util.disk.has_bluestore_label", lambda x: False)
458458
def test_get_device_id(self, fake_call, device_info):
459-
udev = {k:k for k in ['ID_VENDOR', 'ID_MODEL', 'ID_SCSI_SERIAL']}
460459
lsblk = {"TYPE": "disk", "NAME": "sda"}
461-
device_info(udevadm=udev,lsblk=lsblk)
460+
device_info(lsblk=lsblk)
462461
disk = device.Device("/dev/sda")
463462
assert disk._get_device_id() == 'ID_VENDOR_ID_MODEL_ID_SCSI_SERIAL'
464463

@@ -676,7 +675,7 @@ def test_partlabel_blkid(self, fake_call, device_info):
676675
"blkid_ceph_disk_member",
677676
"disable_kernel_queries")
678677
@patch("ceph_volume.util.disk.has_bluestore_label", lambda x: False)
679-
def test_is_member_blkid(self, fake_call, monkeypatch):
678+
def test_is_member_blkid(self, patch_udevdata, fake_call, monkeypatch):
680679
disk = device.CephDiskDevice(device.Device("/dev/sda"))
681680

682681
assert disk.is_member is True

src/ceph-volume/ceph_volume/tests/util/test_disk.py

Lines changed: 8 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -102,34 +102,6 @@ def test_parses_translated(self, stub_call):
102102
assert result['UUID'] == '62416664-cbaf-40bd-9689-10bd337379c3'
103103
assert result['TYPE'] == 'xfs'
104104

105-
class TestUdevadmProperty(object):
106-
107-
def test_good_output(self, stub_call):
108-
output = """ID_MODEL=SK_hynix_SC311_SATA_512GB
109-
ID_PART_TABLE_TYPE=gpt
110-
ID_SERIAL_SHORT=MS83N71801150416A""".split()
111-
stub_call((output, [], 0))
112-
result = disk.udevadm_property('dev/sda')
113-
assert result['ID_MODEL'] == 'SK_hynix_SC311_SATA_512GB'
114-
assert result['ID_PART_TABLE_TYPE'] == 'gpt'
115-
assert result['ID_SERIAL_SHORT'] == 'MS83N71801150416A'
116-
117-
def test_property_filter(self, stub_call):
118-
output = """ID_MODEL=SK_hynix_SC311_SATA_512GB
119-
ID_PART_TABLE_TYPE=gpt
120-
ID_SERIAL_SHORT=MS83N71801150416A""".split()
121-
stub_call((output, [], 0))
122-
result = disk.udevadm_property('dev/sda', ['ID_MODEL',
123-
'ID_SERIAL_SHORT'])
124-
assert result['ID_MODEL'] == 'SK_hynix_SC311_SATA_512GB'
125-
assert 'ID_PART_TABLE_TYPE' not in result
126-
127-
def test_fail_on_broken_output(self, stub_call):
128-
output = ["ID_MODEL:SK_hynix_SC311_SATA_512GB"]
129-
stub_call((output, [], 0))
130-
with pytest.raises(ValueError):
131-
disk.udevadm_property('dev/sda')
132-
133105

134106
class TestDeviceFamily(object):
135107

@@ -281,8 +253,7 @@ def test_no_devices_are_found(self, tmpdir, patched_get_block_devs_sysfs):
281253
result = disk.get_devices(_sys_block_path=str(tmpdir))
282254
assert result == {}
283255

284-
@patch('ceph_volume.util.disk.udevadm_property')
285-
def test_sda_block_is_found(self, m_udev_adm_property, patched_get_block_devs_sysfs, fake_filesystem):
256+
def test_sda_block_is_found(self, patched_get_block_devs_sysfs, fake_filesystem):
286257
sda_path = '/dev/sda'
287258
patched_get_block_devs_sysfs.return_value = [[sda_path, sda_path, 'disk', sda_path]]
288259
result = disk.get_devices()
@@ -291,17 +262,15 @@ def test_sda_block_is_found(self, m_udev_adm_property, patched_get_block_devs_sy
291262
assert result[sda_path]['model'] == ''
292263
assert result[sda_path]['partitions'] == {}
293264

294-
@patch('ceph_volume.util.disk.udevadm_property')
295-
def test_sda_size(self, m_udev_adm_property, patched_get_block_devs_sysfs, fake_filesystem):
265+
def test_sda_size(self, patched_get_block_devs_sysfs, fake_filesystem):
296266
sda_path = '/dev/sda'
297267
patched_get_block_devs_sysfs.return_value = [[sda_path, sda_path, 'disk', sda_path]]
298268
fake_filesystem.create_file('/sys/block/sda/size', contents = '1024')
299269
result = disk.get_devices()
300270
assert list(result.keys()) == [sda_path]
301271
assert result[sda_path]['human_readable_size'] == '512.00 KB'
302272

303-
@patch('ceph_volume.util.disk.udevadm_property')
304-
def test_sda_sectorsize_fallsback(self, m_udev_adm_property, patched_get_block_devs_sysfs, fake_filesystem):
273+
def test_sda_sectorsize_fallsback(self, patched_get_block_devs_sysfs, fake_filesystem):
305274
# if no sectorsize, it will use queue/hw_sector_size
306275
sda_path = '/dev/sda'
307276
patched_get_block_devs_sysfs.return_value = [[sda_path, sda_path, 'disk', sda_path]]
@@ -310,40 +279,35 @@ def test_sda_sectorsize_fallsback(self, m_udev_adm_property, patched_get_block_d
310279
assert list(result.keys()) == [sda_path]
311280
assert result[sda_path]['sectorsize'] == '1024'
312281

313-
@patch('ceph_volume.util.disk.udevadm_property')
314-
def test_sda_sectorsize_from_logical_block(self, m_udev_adm_property, patched_get_block_devs_sysfs, fake_filesystem):
282+
def test_sda_sectorsize_from_logical_block(self, patched_get_block_devs_sysfs, fake_filesystem):
315283
sda_path = '/dev/sda'
316284
patched_get_block_devs_sysfs.return_value = [[sda_path, sda_path, 'disk', sda_path]]
317285
fake_filesystem.create_file('/sys/block/sda/queue/logical_block_size', contents = '99')
318286
result = disk.get_devices()
319287
assert result[sda_path]['sectorsize'] == '99'
320288

321-
@patch('ceph_volume.util.disk.udevadm_property')
322-
def test_sda_sectorsize_does_not_fallback(self, m_udev_adm_property, patched_get_block_devs_sysfs, fake_filesystem):
289+
def test_sda_sectorsize_does_not_fallback(self, patched_get_block_devs_sysfs, fake_filesystem):
323290
sda_path = '/dev/sda'
324291
patched_get_block_devs_sysfs.return_value = [[sda_path, sda_path, 'disk', sda_path]]
325292
fake_filesystem.create_file('/sys/block/sda/queue/logical_block_size', contents = '99')
326293
fake_filesystem.create_file('/sys/block/sda/queue/hw_sector_size', contents = '1024')
327294
result = disk.get_devices()
328295
assert result[sda_path]['sectorsize'] == '99'
329296

330-
@patch('ceph_volume.util.disk.udevadm_property')
331-
def test_is_rotational(self, m_udev_adm_property, patched_get_block_devs_sysfs, fake_filesystem):
297+
def test_is_rotational(self, patched_get_block_devs_sysfs, fake_filesystem):
332298
sda_path = '/dev/sda'
333299
patched_get_block_devs_sysfs.return_value = [[sda_path, sda_path, 'disk', sda_path]]
334300
fake_filesystem.create_file('/sys/block/sda/queue/rotational', contents = '1')
335301
result = disk.get_devices()
336302
assert result[sda_path]['rotational'] == '1'
337303

338-
@patch('ceph_volume.util.disk.udevadm_property')
339-
def test_is_ceph_rbd(self, m_udev_adm_property, patched_get_block_devs_sysfs, fake_filesystem):
304+
def test_is_ceph_rbd(self, patched_get_block_devs_sysfs, fake_filesystem):
340305
rbd_path = '/dev/rbd0'
341306
patched_get_block_devs_sysfs.return_value = [[rbd_path, rbd_path, 'disk', rbd_path]]
342307
result = disk.get_devices()
343308
assert rbd_path not in result
344309

345-
@patch('ceph_volume.util.disk.udevadm_property')
346-
def test_actuator_device(self, m_udev_adm_property, patched_get_block_devs_sysfs, fake_filesystem):
310+
def test_actuator_device(self, patched_get_block_devs_sysfs, fake_filesystem):
347311
sda_path = '/dev/sda'
348312
fake_actuator_nb = 2
349313
patched_get_block_devs_sysfs.return_value = [[sda_path, sda_path, 'disk', sda_path]]

0 commit comments

Comments
 (0)