]>
git.proxmox.com Git - ceph.git/blob - ceph/qa/tasks/nvme_loop.py
4 from io
import StringIO
5 from teuthology
import misc
as teuthology
6 from teuthology
import contextutil
7 from teuthology
.orchestra
import run
10 log
= logging
.getLogger(__name__
)
13 @contextlib.contextmanager
14 def task(ctx
, config
):
15 log
.info('Setting up nvme_loop on scratch devices...')
19 old_scratch_by_remote
= {}
20 for remote
, roles
in ctx
.cluster
.remotes
.items():
21 devs
= teuthology
.get_scratch_devices(remote
)
22 devs_by_remote
[remote
] = devs
23 base
= '/sys/kernel/config/nvmet'
26 'sudo', 'modprobe', 'nvme_loop',
28 'sudo', 'mkdir', '-p', f
'{base}/hosts/{host}',
30 'sudo', 'mkdir', '-p', f
'{base}/ports/{port}',
32 'echo', 'loop', run
.Raw('|'),
33 'sudo', 'tee', f
'{base}/ports/{port}/addr_trtype',
37 short
= dev
.split('/')[-1]
38 log
.info(f
'Connecting nvme_loop {remote.shortname}:{dev}...')
41 'sudo', 'mkdir', '-p', f
'{base}/subsystems/{short}',
43 'echo', '1', run
.Raw('|'),
44 'sudo', 'tee', f
'{base}/subsystems/{short}/attr_allow_any_host',
46 'sudo', 'mkdir', '-p', f
'{base}/subsystems/{short}/namespaces/1',
48 'echo', dev
, run
.Raw('|'),
49 'sudo', 'tee', f
'{base}/subsystems/{short}/namespaces/1/device_path',
51 'echo', '1', run
.Raw('|'),
52 'sudo', 'tee', f
'{base}/subsystems/{short}/namespaces/1/enable',
54 'sudo', 'ln', '-s', f
'{base}/subsystems/{short}',
55 f
'{base}/ports/{port}/subsystems/{short}',
57 'sudo', 'nvme', 'connect', '-t', 'loop', '-n', short
, '-q', host
,
61 # identify nvme_loops devices
62 old_scratch_by_remote
[remote
] = remote
.read_file('/scratch_devs')
64 with contextutil
.safe_while(sleep
=1, tries
=15) as proceed
:
66 p
= remote
.run(args
=['sudo', 'nvme', 'list'], stdout
=StringIO())
68 for line
in p
.stdout
.getvalue().splitlines():
69 dev
, _
, vendor
= line
.split()[0:3]
70 if dev
.startswith('/dev/') and vendor
== 'Linux':
72 log
.info(f
'new_devs {new_devs}')
73 assert len(new_devs
) <= len(devs
)
74 if len(new_devs
) == len(devs
):
79 data
='\n'.join(new_devs
) + '\n',
87 for remote
, devs
in devs_by_remote
.items():
89 short
= dev
.split('/')[-1]
90 log
.info(f
'Disconnecting nvme_loop {remote.shortname}:{dev}...')
93 'sudo', 'nvme', 'disconnect', '-n', short
99 data
=old_scratch_by_remote
[remote
],