]>
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
]
101 self
.client_remote
.run(args
=cmd
)
103 rproc
= self
.client_remote
.run(
111 run
.wait([rproc
], UMOUNT_TIMEOUT
)
117 def umount_wait(self
, force
=False, require_clean
=False):
119 Unlike the fuse client, the kernel client's umount is immediate
121 if not self
.is_mounted():
126 except (CommandFailedError
, MaxWhileTries
):
135 def is_mounted(self
):
138 def wait_until_mounted(self
):
140 Unlike the fuse client, the kernel client is up and running as soon
141 as the initial mount() function returns.
146 super(KernelMount
, self
).teardown()
152 The Ceph kernel client doesn't have a mechanism to kill itself (doing
153 that in side the kernel would be weird anyway), so we reboot the whole node
154 to get the same effect.
156 We use IPMI to reboot, because we don't want the client to send any
157 releases of capabilities.
160 con
= orchestra_remote
.getRemoteConsole(self
.client_remote
.hostname
,
168 def kill_cleanup(self
):
169 assert not self
.mounted
171 con
= orchestra_remote
.getRemoteConsole(self
.client_remote
.hostname
,
177 # Wait for node to come back up after reboot
178 misc
.reconnect(None, 300, [self
.client_remote
])
180 # Remove mount directory
181 self
.client_remote
.run(
189 def _find_debug_dir(self
):
191 Find the debugfs folder for this mount
193 pyscript
= dedent("""
200 for dir in glob.glob("/sys/kernel/debug/ceph/*"):
201 mds_sessions_lines = open(os.path.join(dir, "mds_sessions")).readlines()
202 client_id = mds_sessions_lines[1].split()[1].strip('"')
204 result[client_id] = dir
207 print json.dumps(get_id_to_dir())
210 p
= self
.client_remote
.run(args
=[
211 'sudo', 'python', '-c', pyscript
212 ], stdout
=StringIO())
213 client_id_to_dir
= json
.loads(p
.stdout
.getvalue())
216 return client_id_to_dir
[self
.client_id
]
218 log
.error("Client id '{0}' debug dir not found (clients seen were: {1})".format(
219 self
.client_id
, ",".join(client_id_to_dir
.keys())
223 def _read_debug_file(self
, filename
):
224 debug_dir
= self
._find
_debug
_dir
()
226 pyscript
= dedent("""
229 print open(os.path.join("{debug_dir}", "{filename}")).read()
230 """).format(debug_dir
=debug_dir
, filename
=filename
)
232 p
= self
.client_remote
.run(args
=[
233 'sudo', 'python', '-c', pyscript
234 ], stdout
=StringIO())
235 return p
.stdout
.getvalue()
237 def get_global_id(self
):
239 Look up the CephFS client ID for this mount, using debugfs.
244 mds_sessions
= self
._read
_debug
_file
("mds_sessions")
245 lines
= mds_sessions
.split("\n")
246 return int(lines
[0].split()[1])
248 def get_osd_epoch(self
):
250 Return 2-tuple of osd_epoch, osd_epoch_barrier
252 osd_map
= self
._read
_debug
_file
("osdmap")
253 lines
= osd_map
.split("\n")
254 first_line_tokens
= lines
[0].split()
255 epoch
, barrier
= int(first_line_tokens
[1]), int(first_line_tokens
[3])
257 return epoch
, barrier