--- /dev/null
+import contextlib
+import logging
+import os
+import re
+
+from teuthology import misc as teuthology
+
+log = logging.getLogger(__name__)
+
+@contextlib.contextmanager
+def task(ctx, config):
+ """
+ Mount nfs client (requires nfs server export like knfsd or ganesh)
+
+ Example that mounts a single nfs client::
+
+ tasks:
+ - ceph:
+ - kclient: [client.0]
+ - knfsd: [client.0]
+ - nfs:
+ client.1:
+ server: client.0
+ - interactive:
+
+ Example that mounts multiple nfs clients with options::
+
+ tasks:
+ - ceph:
+ - kclient: [client.0, client.1]
+ - knfsd: [client.0, client.1]
+ - nfs:
+ client.2:
+ server: client.0
+ options: [rw,hard,intr,nfsvers=3]
+ client.3:
+ server: client.1
+ options: [ro]
+ - workunit:
+ clients:
+ client.2:
+ - suites/dbench.sh
+ client.3:
+ - suites/blogbench.sh
+
+ It is not recommended that the nfs client and nfs server reside on the same node. So in the example above client.0-3 should be on 4 distinct
+ nodes. The client nfs testing would be using only client.2 and client.3.
+ """
+ log.info('Mounting nfs clients...')
+ assert isinstance(config, dict)
+
+ clients = list(teuthology.get_clients(ctx=ctx, roles=config.keys()))
+
+ for id_, remote in clients:
+ mnt = os.path.join('/tmp/cephtest', 'mnt.{id}'.format(id=id_))
+ client_config = config.get("client.%s" % id_)
+ if client_config is None:
+ client_config = {}
+ log.debug("Client client.%s config is %s" % (id_, client_config))
+
+ assert client_config.get('server') is not None
+ server = client_config.get('server');
+
+ svr_id = server[len('client.'):]
+ svr_mnt = os.path.join('/tmp/cephtest', 'mnt.{id}'.format(id=svr_id))
+
+ svr_remote = None
+ all_config = ['client.{id}'.format(id=tmpid)
+ for tmpid in teuthology.all_roles_of_type(ctx.cluster, 'client')]
+ all_clients = list(teuthology.get_clients(ctx=ctx, roles=all_config))
+ for tmpid, tmpremote in all_clients:
+ if tmpid == svr_id:
+ svr_remote = tmpremote
+ break
+
+ assert svr_remote is not None
+ svr_remote = svr_remote.name.split('@', 2)[1]
+
+ if client_config.get('options') is not None:
+ opts = ','.join(client_config.get('options'))
+ else:
+ opts = 'rw'
+
+ log.info('Mounting client.{id} from client.{sid}'.format(id=id_, sid=svr_id))
+ log.debug('mount -o {opts} {remote}:{svr_mnt} {mnt}'.format(
+ remote=svr_remote, svr_mnt=svr_mnt, opts=opts, mnt=mnt))
+
+ remote.run(
+ args=[
+ 'mkdir',
+ '--',
+ mnt,
+ ],
+ )
+
+ remote.run(
+ args=[
+ 'sudo',
+ "mount",
+ "-o",
+ opts,
+ '{remote}:{mnt}'.format(remote=svr_remote, mnt=svr_mnt),
+ mnt
+ ],
+ )
+
+ try:
+ yield
+ finally:
+ log.info('Unmounting nfs clients...')
+ for id_, remote in clients:
+ log.debug('Unmounting nfs client client.{id}...'.format(id=id_))
+ mnt = os.path.join('/tmp/cephtest', 'mnt.{id}'.format(id=id_))
+ remote.run(
+ args=[
+ 'sudo',
+ 'umount',
+ mnt,
+ ],
+ )
+ remote.run(
+ args=[
+ 'rmdir',
+ '--',
+ mnt,
+ ],
+ )