]>
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
),
48 def mount(self
, mount_path
=None, mount_fs_name
=None):
49 log
.info('Mounting kclient client.{id} at {remote} {mnt}...'.format(
50 id=self
.client_id
, remote
=self
.client_remote
, mnt
=self
.mountpoint
))
52 keyring
= self
.get_keyring_path()
53 secret
= '{tdir}/ceph.data/client.{id}.secret'.format(tdir
=self
.test_dir
, id=self
.client_id
)
54 self
.write_secret_file(self
.client_remote
, 'client.{id}'.format(id=self
.client_id
),
57 self
.client_remote
.run(
65 if mount_path
is None:
68 opts
= 'name={id},secretfile={secret},norequire_active_mds'.format(id=self
.client_id
,
71 if mount_fs_name
is not None:
72 opts
+= ",mds_namespace={0}".format(mount_fs_name
)
74 self
.client_remote
.run(
79 '{tdir}/archive/coverage'.format(tdir
=self
.test_dir
),
81 '{mons}:{mount_path}'.format(mons
=','.join(self
.mons
), mount_path
=mount_path
),
89 self
.client_remote
.run(
90 args
=['sudo', 'chmod', '1777', self
.mountpoint
])
94 def umount(self
, force
=False):
95 log
.debug('Unmounting client client.{id}...'.format(id=self
.client_id
))
97 cmd
=['sudo', 'umount', self
.mountpoint
]
102 self
.client_remote
.run(args
=cmd
)
103 except Exception as e
:
104 self
.client_remote
.run(args
=[
106 run
.Raw('PATH=/usr/sbin:$PATH'),
113 rproc
= self
.client_remote
.run(
121 run
.wait([rproc
], UMOUNT_TIMEOUT
)
127 def umount_wait(self
, force
=False, require_clean
=False):
129 Unlike the fuse client, the kernel client's umount is immediate
131 if not self
.is_mounted():
136 except (CommandFailedError
, MaxWhileTries
):
145 def is_mounted(self
):
148 def wait_until_mounted(self
):
150 Unlike the fuse client, the kernel client is up and running as soon
151 as the initial mount() function returns.
156 super(KernelMount
, self
).teardown()
162 The Ceph kernel client doesn't have a mechanism to kill itself (doing
163 that in side the kernel would be weird anyway), so we reboot the whole node
164 to get the same effect.
166 We use IPMI to reboot, because we don't want the client to send any
167 releases of capabilities.
170 con
= orchestra_remote
.getRemoteConsole(self
.client_remote
.hostname
,
178 def kill_cleanup(self
):
179 assert not self
.mounted
181 con
= orchestra_remote
.getRemoteConsole(self
.client_remote
.hostname
,
187 # Wait for node to come back up after reboot
188 misc
.reconnect(None, 300, [self
.client_remote
])
190 # Remove mount directory
191 self
.client_remote
.run(
199 def _find_debug_dir(self
):
201 Find the debugfs folder for this mount
203 pyscript
= dedent("""
210 for dir in glob.glob("/sys/kernel/debug/ceph/*"):
211 mds_sessions_lines = open(os.path.join(dir, "mds_sessions")).readlines()
212 client_id = mds_sessions_lines[1].split()[1].strip('"')
214 result[client_id] = dir
217 print json.dumps(get_id_to_dir())
220 p
= self
.client_remote
.run(args
=[
221 'sudo', 'python', '-c', pyscript
222 ], stdout
=StringIO())
223 client_id_to_dir
= json
.loads(p
.stdout
.getvalue())
226 return client_id_to_dir
[self
.client_id
]
228 log
.error("Client id '{0}' debug dir not found (clients seen were: {1})".format(
229 self
.client_id
, ",".join(client_id_to_dir
.keys())
233 def _read_debug_file(self
, filename
):
234 debug_dir
= self
._find
_debug
_dir
()
236 pyscript
= dedent("""
239 print open(os.path.join("{debug_dir}", "{filename}")).read()
240 """).format(debug_dir
=debug_dir
, filename
=filename
)
242 p
= self
.client_remote
.run(args
=[
243 'sudo', 'python', '-c', pyscript
244 ], stdout
=StringIO())
245 return p
.stdout
.getvalue()
247 def get_global_id(self
):
249 Look up the CephFS client ID for this mount, using debugfs.
254 mds_sessions
= self
._read
_debug
_file
("mds_sessions")
255 lines
= mds_sessions
.split("\n")
256 return int(lines
[0].split()[1])
258 def get_osd_epoch(self
):
260 Return 2-tuple of osd_epoch, osd_epoch_barrier
262 osd_map
= self
._read
_debug
_file
("osdmap")
263 lines
= osd_map
.split("\n")
264 first_line_tokens
= lines
[0].split()
265 epoch
, barrier
= int(first_line_tokens
[1]), int(first_line_tokens
[3])
267 return epoch
, barrier