def dev_create(ctx, config): """ Map block devices to rbd images. For example:: tasks: - ceph: - rbd.create_image: [client.0] - rbd.modprobe: [client.0] - rbd.dev_create: client.0: testimage.client.0 """ assert isinstance(config, dict) or isinstance(config, list), \ "task dev_create only supports a list or dictionary for configuration" if isinstance(config, dict): role_images = config.items() else: role_images = [(role, None) for role in config] log.info('Creating rbd block devices...') testdir = teuthology.get_testdir(ctx) for role, image in role_images: if image is None: image = default_image_name(role) (remote,) = ctx.cluster.only(role).remotes.keys() remote.run( args=[ 'sudo', 'adjust-ulimits', 'ceph-coverage', '{tdir}/archive/coverage'.format(tdir=testdir), 'rbd', '--user', role.rsplit('.')[-1], '-p', 'rbd', 'map', image, run.Raw('&&'), # wait for the symlink to be created by udev 'while', 'test', '!', '-e', '/dev/rbd/rbd/{image}'.format(image=image), run.Raw(';'), 'do', 'sleep', '1', run.Raw(';'), 'done', ], ) try: yield finally: log.info('Unmapping rbd devices...') for role, image in role_images: if image is None: image = default_image_name(role) (remote,) = ctx.cluster.only(role).remotes.keys() remote.run( args=[ 'LD_LIBRARY_PATH={tdir}/binary/usr/local/lib'.format(tdir=testdir), 'sudo', 'adjust-ulimits', 'ceph-coverage', '{tdir}/archive/coverage'.format(tdir=testdir), 'rbd', '-p', 'rbd', 'unmap', '/dev/rbd/rbd/{imgname}'.format(imgname=image), run.Raw('&&'), # wait for the symlink to be deleted by udev 'while', 'test', '-e', '/dev/rbd/rbd/{image}'.format(image=image), run.Raw(';'), 'do', 'sleep', '1', run.Raw(';'), 'done', ], )
def create_image(ctx, config): """ Create an rbd image. For example:: tasks: - ceph: - rbd.create_image: client.0: image_name: testimage image_size: 100 image_format: 1 client.1: Image size is expressed as a number of megabytes; default value is 10240. Image format value must be either 1 or 2; default value is 1. """ assert isinstance(config, dict) or isinstance(config, list), \ "task create_image only supports a list or dictionary for configuration" if isinstance(config, dict): images = config.items() else: images = [(role, None) for role in config] testdir = teuthology.get_testdir(ctx) for role, properties in images: if properties is None: properties = {} name = properties.get('image_name', default_image_name(role)) size = properties.get('image_size', 10240) fmt = properties.get('image_format', 1) (remote,) = ctx.cluster.only(role).remotes.keys() log.info('Creating image {name} with size {size}'.format(name=name, size=size)) args = [ 'adjust-ulimits', 'ceph-coverage'.format(tdir=testdir), '{tdir}/archive/coverage'.format(tdir=testdir), 'rbd', '-p', 'rbd', 'create', '--size', str(size), name, ] # omit format option if using the default (format 1) # since old versions of don't support it if int(fmt) != 1: args += ['--image-format', str(fmt)] remote.run(args=args) try: yield finally: log.info('Deleting rbd images...') for role, properties in images: if properties is None: properties = {} name = properties.get('image_name', default_image_name(role)) (remote,) = ctx.cluster.only(role).remotes.keys() remote.run( args=[ 'adjust-ulimits', 'ceph-coverage', '{tdir}/archive/coverage'.format(tdir=testdir), 'rbd', '-p', 'rbd', 'rm', name, ], )
def clone_image(ctx, config): """ Clones a parent imag For example:: tasks: - ceph: - rbd.clone_image: client.0: parent_name: testimage image_name: cloneimage """ assert isinstance(config, dict) or isinstance(config, list), \ "task clone_image only supports a list or dictionary for configuration" if isinstance(config, dict): images = config.items() else: images = [(role, None) for role in config] testdir = teuthology.get_testdir(ctx) for role, properties in images: if properties is None: properties = {} name = properties.get('image_name', default_image_name(role)) parent_name = properties.get('parent_name') assert parent_name is not None, \ "parent_name is required" parent_spec = '{name}@{snap}'.format(name=parent_name, snap=name) (remote,) = ctx.cluster.only(role).remotes.keys() log.info('Clone image {parent} to {child}'.format(parent=parent_name, child=name)) for cmd in [('snap', 'create', parent_spec), ('snap', 'protect', parent_spec), ('clone', parent_spec, name)]: args = [ 'adjust-ulimits', 'ceph-coverage'.format(tdir=testdir), '{tdir}/archive/coverage'.format(tdir=testdir), 'rbd', '-p', 'rbd' ] args.extend(cmd) remote.run(args=args) try: yield finally: log.info('Deleting rbd clones...') for role, properties in images: if properties is None: properties = {} name = properties.get('image_name', default_image_name(role)) parent_name = properties.get('parent_name') parent_spec = '{name}@{snap}'.format(name=parent_name, snap=name) (remote,) = ctx.cluster.only(role).remotes.keys() for cmd in [('rm', name), ('snap', 'unprotect', parent_spec), ('snap', 'rm', parent_spec)]: args = [ 'adjust-ulimits', 'ceph-coverage'.format(tdir=testdir), '{tdir}/archive/coverage'.format(tdir=testdir), 'rbd', '-p', 'rbd' ] args.extend(cmd) remote.run(args=args)
def create_image(ctx, config): """ Create an rbd image. For example:: tasks: - ceph: - rbd.create_image: client.0: image_name: testimage image_size: 100 image_format: 1 client.1: Image size is expressed as a number of megabytes; default value is 10240. Image format value must be either 1 or 2; default value is 1. """ assert isinstance(config, dict) or isinstance(config, list), \ "task create_image only supports a list or dictionary for configuration" if isinstance(config, dict): images = config.items() else: images = [(role, None) for role in config] testdir = teuthology.get_testdir(ctx) for role, properties in images: if properties is None: properties = {} name = properties.get('image_name', default_image_name(role)) size = properties.get('image_size', 10240) fmt = properties.get('image_format', 1) (remote,) = ctx.cluster.only(role).remotes.keys() log.info('Creating image {name} with size {size}'.format(name=name, size=size)) args = [ 'adjust-ulimits', 'ceph-coverage'.format(tdir=testdir), '{tdir}/archive/coverage'.format(tdir=testdir), 'rbd', '-p', 'rbd', 'create', '--size', str(size), name, ] # omit format option if using the default (format 1) # since old versions of don't support it if int(fmt) != 1: args += ['--format', str(fmt)] remote.run(args=args) try: yield finally: log.info('Deleting rbd images...') for role, properties in images: if properties is None: properties = {} name = properties.get('image_name', default_image_name(role)) (remote,) = ctx.cluster.only(role).remotes.keys() remote.run( args=[ 'adjust-ulimits', 'ceph-coverage', '{tdir}/archive/coverage'.format(tdir=testdir), 'rbd', '-p', 'rbd', 'rm', name, ], )
def dev_create(ctx, config): """ Map block devices to rbd images. For example:: tasks: - ceph: - rbd.create_image: [client.0] - rbd.modprobe: [client.0] - rbd.dev_create: client.0: image_name: testimage.client.0 encryption_format: luks2 """ assert isinstance(config, dict) or isinstance(config, list), \ "task dev_create only supports a list or dictionary for configuration" if isinstance(config, dict): images = config.items() else: images = [(role, None) for role in config] log.info('Creating rbd block devices...') testdir = teuthology.get_testdir(ctx) passphrase_file = '{tdir}/passphrase'.format(tdir=testdir) device_path = {} for role, properties in images: if properties is None: properties = {} name = properties.get('image_name', default_image_name(role)) encryption_format = properties.get('encryption_format', 'none') (remote, ) = ctx.cluster.only(role).remotes.keys() if encryption_format == 'none': device_path[role] = '/dev/rbd/rbd/{image}'.format(image=name) device_specific_args = [] else: remote.run(args=[ 'echo', ENCRYPTION_PASSPHRASE, run.Raw('>'), passphrase_file ]) device_specific_args = [ '-t', 'nbd', '-o', 'encryption-format=%s,encryption-passphrase-file=%s' % (encryption_format, passphrase_file) ] map_fp = StringIO() remote.run( args=[ 'sudo', 'adjust-ulimits', 'ceph-coverage', '{tdir}/archive/coverage'.format(tdir=testdir), 'rbd', '--id', role.rsplit('.')[-1], '-p', 'rbd', 'map', name ] + device_specific_args, stdout=map_fp, ) if encryption_format != 'none': device_path[role] = map_fp.getvalue().rstrip() properties['device_path'] = device_path[role] remote.run(args=['sudo', 'chmod', '666', device_path[role]]) try: yield finally: log.info('Unmapping rbd devices...') remote.run(args=['rm', '-f', passphrase_file]) for role, properties in images: if not device_path.get(role): continue if properties is None: properties = {} encryption_format = properties.get('encryption_format', 'none') (remote, ) = ctx.cluster.only(role).remotes.keys() if encryption_format == 'none': device_specific_args = [] else: device_specific_args = ['-t', 'nbd'] remote.run(args=[ 'LD_LIBRARY_PATH={tdir}/binary/usr/local/lib'.format( tdir=testdir), 'sudo', 'adjust-ulimits', 'ceph-coverage', '{tdir}/archive/coverage'.format(tdir=testdir), 'rbd', '-p', 'rbd', 'unmap', device_path[role], ] + device_specific_args, )