]>
git.proxmox.com Git - ceph.git/blob - ceph/qa/tasks/cephfs/kernel_mount.py
1 from StringIO
import StringIO
4 from textwrap
import dedent
5 from teuthology
.orchestra
.run
import CommandFailedError
6 from teuthology
import misc
8 from teuthology
.orchestra
import remote
as orchestra_remote
9 from teuthology
.orchestra
import run
10 from teuthology
.contextutil
import MaxWhileTries
11 from .mount
import CephFSMount
13 log
= logging
.getLogger(__name__
)
19 class KernelMount(CephFSMount
):
20 def __init__(self
, mons
, test_dir
, client_id
, client_remote
,
21 ipmi_user
, ipmi_password
, ipmi_domain
):
22 super(KernelMount
, self
).__init
__(test_dir
, client_id
, client_remote
)
26 self
.ipmi_user
= ipmi_user
27 self
.ipmi_password
= ipmi_password
28 self
.ipmi_domain
= ipmi_domain
30 def write_secret_file(self
, remote
, role
, keyring
, filename
):
32 Stash the keyring in the filename specified.
38 '{tdir}/archive/coverage'.format(tdir
=self
.test_dir
),
40 '--name={role}'.format(role
=role
),
49 def mount(self
, mount_path
=None, mount_fs_name
=None):
50 log
.info('Mounting kclient client.{id} at {remote} {mnt}...'.format(
51 id=self
.client_id
, remote
=self
.client_remote
, mnt
=self
.mountpoint
))
53 keyring
= self
.get_keyring_path()
54 secret
= '{tdir}/ceph.data/client.{id}.secret'.format(tdir
=self
.test_dir
, id=self
.client_id
)
55 self
.write_secret_file(self
.client_remote
, 'client.{id}'.format(id=self
.client_id
),
58 self
.client_remote
.run(
67 if mount_path
is None:
70 opts
= 'name={id},secretfile={secret},norequire_active_mds'.format(id=self
.client_id
,
73 if mount_fs_name
is not None:
74 opts
+= ",mds_namespace={0}".format(mount_fs_name
)
76 self
.client_remote
.run(
81 '{tdir}/archive/coverage'.format(tdir
=self
.test_dir
),
83 '{mons}:{mount_path}'.format(mons
=','.join(self
.mons
), mount_path
=mount_path
),
92 self
.client_remote
.run(
93 args
=['sudo', 'chmod', '1777', self
.mountpoint
], timeout
=(5*60))
97 def umount(self
, force
=False):
98 log
.debug('Unmounting client client.{id}...'.format(id=self
.client_id
))
100 cmd
=['sudo', 'umount', self
.mountpoint
]
105 self
.client_remote
.run(args
=cmd
, timeout
=(15*60))
106 except Exception as e
:
107 self
.client_remote
.run(args
=[
109 run
.Raw('PATH=/usr/sbin:$PATH'),
116 rproc
= self
.client_remote
.run(
124 run
.wait([rproc
], UMOUNT_TIMEOUT
)
130 def umount_wait(self
, force
=False, require_clean
=False, timeout
=900):
132 Unlike the fuse client, the kernel client's umount is immediate
134 if not self
.is_mounted():
139 except (CommandFailedError
, MaxWhileTries
):
148 def is_mounted(self
):
151 def wait_until_mounted(self
):
153 Unlike the fuse client, the kernel client is up and running as soon
154 as the initial mount() function returns.
159 super(KernelMount
, self
).teardown()
165 The Ceph kernel client doesn't have a mechanism to kill itself (doing
166 that in side the kernel would be weird anyway), so we reboot the whole node
167 to get the same effect.
169 We use IPMI to reboot, because we don't want the client to send any
170 releases of capabilities.
173 con
= orchestra_remote
.getRemoteConsole(self
.client_remote
.hostname
,
181 def kill_cleanup(self
):
182 assert not self
.mounted
184 con
= orchestra_remote
.getRemoteConsole(self
.client_remote
.hostname
,
190 # Wait for node to come back up after reboot
191 misc
.reconnect(None, 300, [self
.client_remote
])
193 # Remove mount directory
194 self
.client_remote
.run(
203 def _find_debug_dir(self
):
205 Find the debugfs folder for this mount
207 pyscript
= dedent("""
214 for dir in glob.glob("/sys/kernel/debug/ceph/*"):
215 mds_sessions_lines = open(os.path.join(dir, "mds_sessions")).readlines()
216 client_id = mds_sessions_lines[1].split()[1].strip('"')
218 result[client_id] = dir
221 print json.dumps(get_id_to_dir())
224 p
= self
.client_remote
.run(args
=[
225 'sudo', 'python', '-c', pyscript
226 ], stdout
=StringIO(), timeout
=(5*60))
227 client_id_to_dir
= json
.loads(p
.stdout
.getvalue())
230 return client_id_to_dir
[self
.client_id
]
232 log
.error("Client id '{0}' debug dir not found (clients seen were: {1})".format(
233 self
.client_id
, ",".join(client_id_to_dir
.keys())
237 def _read_debug_file(self
, filename
):
238 debug_dir
= self
._find
_debug
_dir
()
240 pyscript
= dedent("""
243 print open(os.path.join("{debug_dir}", "{filename}")).read()
244 """).format(debug_dir
=debug_dir
, filename
=filename
)
246 p
= self
.client_remote
.run(args
=[
247 'sudo', 'python', '-c', pyscript
248 ], stdout
=StringIO(), timeout
=(5*60))
249 return p
.stdout
.getvalue()
251 def get_global_id(self
):
253 Look up the CephFS client ID for this mount, using debugfs.
258 mds_sessions
= self
._read
_debug
_file
("mds_sessions")
259 lines
= mds_sessions
.split("\n")
260 return int(lines
[0].split()[1])
262 def get_osd_epoch(self
):
264 Return 2-tuple of osd_epoch, osd_epoch_barrier
266 osd_map
= self
._read
_debug
_file
("osdmap")
267 lines
= osd_map
.split("\n")
268 first_line_tokens
= lines
[0].split()
269 epoch
, barrier
= int(first_line_tokens
[1]), int(first_line_tokens
[3])
271 return epoch
, barrier