X-Git-Url: https://gerrit.opnfv.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fceph%2Fsrc%2Fceph-disk%2Ftests%2Fceph-disk.sh;fp=src%2Fceph%2Fsrc%2Fceph-disk%2Ftests%2Fceph-disk.sh;h=5bf1470da180f10bea9b9d63cb46b6ba4cc7356a;hb=812ff6ca9fcd3e629e49d4328905f33eee8ca3f5;hp=0000000000000000000000000000000000000000;hpb=15280273faafb77777eab341909a3f495cf248d9;p=stor4nfv.git diff --git a/src/ceph/src/ceph-disk/tests/ceph-disk.sh b/src/ceph/src/ceph-disk/tests/ceph-disk.sh new file mode 100755 index 0000000..5bf1470 --- /dev/null +++ b/src/ceph/src/ceph-disk/tests/ceph-disk.sh @@ -0,0 +1,486 @@ +#!/bin/bash +# +# Copyright (C) 2014 Cloudwatt +# Copyright (C) 2014, 2015, 2016, 2017 Red Hat +# +# Author: Loic Dachary +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU Library Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Library Public License for more details. +# + +# ceph-disk.sh is launched by tox which expects tox.ini in current +# directory. so we cannot run ceph-disk.sh in build directory directly, +# and hence not able to use detect-build-env-vars.sh to set the build +# env vars. +if [ -z "$CEPH_ROOT" ] || [ -z "$CEPH_BIN" ] || [ -z "$CEPH_LIB" ]; then + CEPH_ROOT=`readlink -f $(dirname $0)/../../..` + CEPH_BIN=$CEPH_ROOT + CEPH_LIB=$CEPH_ROOT/.libs +fi +source $CEPH_ROOT/qa/standalone/ceph-helpers.sh + +set -x + +PS4='${BASH_SOURCE[0]}:$LINENO: ${FUNCNAME[0]}: ' + +export PATH=$CEPH_BIN:.:$PATH # make sure program from sources are preferred +export LD_LIBRARY_PATH=$CEPH_LIB +: ${CEPH_DISK:=ceph-disk} +CEPH_DISK_ARGS= +CEPH_DISK_ARGS+=" --verbose" +CEPH_DISK_ARGS+=" --prepend-to-path=" +: ${CEPH_DISK_TIMEOUT:=360} +if [ `uname` != FreeBSD ]; then + PROCDIR="" +else + PROCDIR="/compat/linux" +fi + +cat=$(which cat) +diff=$(which diff) +mkdir=$(which mkdir) +rm=$(which rm) +uuidgen=$(which uuidgen) +if [ `uname` = FreeBSD ]; then + # for unknown reasons FreeBSD timeout does not return sometimes + timeout="" +else + timeout="$(which timeout) $CEPH_DISK_TIMEOUT" +fi + +function setup() { + local dir=$1 + teardown $dir + mkdir -p $dir/osd + mkdir -p $(get_asok_dir) + touch $dir/ceph.conf # so ceph-disk think ceph is the cluster +} + +function teardown() { + local dir=$1 + if ! test -e $dir ; then + return + fi + kill_daemons $dir + if [ `uname` != FreeBSD ] && \ + [ $(stat -f -c '%T' .) == "btrfs" ]; then + rm -fr $dir/*/*db + __teardown_btrfs $dir + fi + grep " $(pwd)/$dir/" < ${PROCDIR}/proc/mounts | while read mounted rest ; do + umount $mounted + done + rm -fr $dir + rm -rf $(get_asok_dir) +} + +function command_fixture() { + local dir=$1 + shift + local command=$1 + shift + local fpath=`readlink -f $(which $command)` + [ "$fpath" = `readlink -f $CEPH_BIN/$command` ] || [ "$fpath" = `readlink -f $(pwd)/$command` ] || return 1 + + cat > $dir/$command <&1 | grep -q 'not full block device' || return 1 + + $rm -fr $osd_data +} + +# ceph-disk prepare returns immediately on success if the magic file +# exists in the --osd-data directory. +function test_activate_dir_magic() { + local dir=$1 + local uuid=$($uuidgen) + local osd_data=$dir/osd + + echo a failure to create the fsid file implies the magic file is not created + + mkdir -p $osd_data/fsid + CEPH_ARGS="--fsid $uuid" \ + ${CEPH_DISK} $CEPH_DISK_ARGS prepare --filestore $osd_data > $dir/out 2>&1 + grep --quiet 'Is a directory' $dir/out || return 1 + ! [ -f $osd_data/magic ] || return 1 + rmdir $osd_data/fsid + + echo successfully prepare the OSD + + CEPH_ARGS="--fsid $uuid" \ + ${CEPH_DISK} $CEPH_DISK_ARGS prepare --filestore $osd_data 2>&1 | tee $dir/out + grep --quiet 'Preparing osd data dir' $dir/out || return 1 + grep --quiet $uuid $osd_data/ceph_fsid || return 1 + [ -f $osd_data/magic ] || return 1 + + echo will not override an existing OSD + + CEPH_ARGS="--fsid $($uuidgen)" \ + ${CEPH_DISK} $CEPH_DISK_ARGS prepare --filestore $osd_data 2>&1 | tee $dir/out + grep --quiet 'Data dir .* already exists' $dir/out || return 1 + grep --quiet $uuid $osd_data/ceph_fsid || return 1 +} + +function read_write() { + local dir=$1 + local file=${2:-$(uuidgen)} + local pool=rbd + + echo FOO > $dir/$file + $timeout rados --pool $pool put $file $dir/$file || return 1 + $timeout rados --pool $pool get $file $dir/$file.copy || return 1 + $diff $dir/$file $dir/$file.copy || return 1 +} + +function test_pool_read_write() { + local dir=$1 + local pool=rbd + + $timeout ceph osd pool set $pool size 1 || return 1 + read_write $dir || return 1 +} + +function test_activate() { + local dir=$1 + shift + local osd_data=$1 + shift + + mkdir -p $osd_data + + ${CEPH_DISK} $CEPH_DISK_ARGS \ + prepare --filestore "$@" $osd_data || return 1 + + $timeout ${CEPH_DISK} $CEPH_DISK_ARGS \ + activate \ + --mark-init=none \ + $osd_data || return 1 + + test_pool_read_write $dir || return 1 +} + +function test_reuse_osd_id() { + local dir=$1 + + run_mon $dir a || return 1 + run_mgr $dir x || return 1 + create_rbd_pool + + test_activate $dir $dir/dir1 --osd-uuid $(uuidgen) || return 1 + + # + # add a new OSD with a given OSD id (13) + # + local osd_uuid=$($uuidgen) + local osd_id=13 + test_activate $dir $dir/dir2 --osd-id $osd_id --osd-uuid $osd_uuid || return 1 + test $osd_id = $(ceph osd new $osd_uuid) || return 1 + + # + # make sure the OSD is in use by the PGs + # + wait_osd_id_used_by_pgs $osd_id $PG_NUM || return 1 + read_write $dir SOMETHING || return 1 + + # + # set the OSD out and verify it is no longer used by the PGs + # + ceph osd out osd.$osd_id || return 1 + wait_osd_id_used_by_pgs $osd_id 0 || return 1 + + # + # kill the OSD and destroy it (do not purge, retain its place in the crushmap) + # + kill_daemons $dir TERM osd.$osd_id || return 1 + ceph osd destroy osd.$osd_id --yes-i-really-mean-it || return 1 + + # + # add a new OSD with the same id as the destroyed OSD + # + osd_uuid=$($uuidgen) + test_activate $dir $dir/dir3 --osd-id $osd_id --osd-uuid $osd_uuid || return 1 + test $osd_id = $(ceph osd new $osd_uuid) || return 1 +} + +function test_activate_dir() { + local dir=$1 + shift + + run_mon $dir a || return 1 + run_mgr $dir x || return 1 + create_rbd_pool + $@ + + test_activate $dir $dir/dir || return 1 +} + +function test_activate_dir_bluestore() { + local dir=$1 + + run_mon $dir a || return 1 + run_mgr $dir x || return 1 + create_rbd_pool + + local osd_data=$dir/dir + $mkdir -p $osd_data + local to_prepare=$osd_data + local to_activate=$osd_data + local osd_uuid=$($uuidgen) + + CEPH_ARGS=" --bluestore-block-size=10737418240 $CEPH_ARGS" \ + ${CEPH_DISK} $CEPH_DISK_ARGS \ + prepare --bluestore --block-file --osd-uuid $osd_uuid $to_prepare || return 1 + + CEPH_ARGS=" --osd-objectstore=bluestore --bluestore-fsck-on-mount=true --bluestore-block-db-size=67108864 --bluestore-block-wal-size=134217728 --bluestore-block-size=10737418240 $CEPH_ARGS" \ + $timeout ${CEPH_DISK} $CEPH_DISK_ARGS \ + activate \ + --mark-init=none \ + $to_activate || return 1 + + test_pool_read_write $dir || return 1 +} + +function test_find_cluster_by_uuid() { + local dir=$1 + test_activate_dir $dir 2>&1 | tee $dir/test_find + ! grep "No cluster conf found in $dir" $dir/test_find || return 1 + teardown $dir + + setup $dir + test_activate_dir $dir "rm $dir/ceph.conf" > $dir/test_find 2>&1 + cp $dir/test_find /tmp + grep --quiet "No cluster conf found in $dir" $dir/test_find || return 1 +} + +# http://tracker.ceph.com/issues/9653 +function test_keyring_path() { + local dir=$1 + test_activate_dir $dir 2>&1 | tee $dir/test_keyring + grep --quiet "keyring $dir/bootstrap-osd/ceph.keyring" $dir/test_keyring || return 1 +} + +function test_crush_device_class() { + local dir=$1 + shift + + run_mon $dir a + create_rbd_pool + + local osd_data=$dir/dir + $mkdir -p $osd_data + + local osd_uuid=$($uuidgen) + + $mkdir -p $osd_data + + ${CEPH_DISK} $CEPH_DISK_ARGS \ + prepare --filestore --osd-uuid $osd_uuid \ + --crush-device-class CRUSH_CLASS \ + $osd_data || return 1 + test -f $osd_data/crush_device_class || return 1 + test $(cat $osd_data/crush_device_class) = CRUSH_CLASS || return 1 + + CEPH_ARGS="--crush-location=root=default $CEPH_ARGS" \ + ${CEPH_DISK} $CEPH_DISK_ARGS \ + --verbose \ + activate \ + --mark-init=none \ + $osd_data || return 1 + + ok=false + for delay in 2 4 8 16 32 64 128 256 ; do + if ceph osd crush dump | grep --quiet 'CRUSH_CLASS' ; then + ok=true + break + fi + sleep $delay + ceph osd crush dump # for debugging purposes + done + $ok || return 1 +} + +function run() { + local dir=$1 + shift + CEPH_DISK_ARGS+=" --statedir=$dir" + CEPH_DISK_ARGS+=" --sysconfdir=$dir" + + export CEPH_MON="127.0.0.1:7451" # git grep '\<7451\>' : there must be only one + export CEPH_ARGS + CEPH_ARGS+=" --fsid=$(uuidgen)" + CEPH_ARGS+=" --auth-supported=none" + CEPH_ARGS+=" --mon-host=$CEPH_MON" + CEPH_ARGS+=" --chdir=" + CEPH_ARGS+=" --journal-dio=false" + CEPH_ARGS+=" --erasure-code-dir=$CEPH_LIB" + CEPH_ARGS+=" --plugin-dir=$CEPH_LIB" + CEPH_ARGS+=" --log-file=$dir/\$name.log" + CEPH_ARGS+=" --pid-file=$dir/\$name.pidfile" + CEPH_ARGS+=" --osd-class-dir=$CEPH_LIB" + CEPH_ARGS+=" --run-dir=$dir" + CEPH_ARGS+=" --osd-failsafe-full-ratio=.99" + CEPH_ARGS+=" --osd-journal-size=100" + CEPH_ARGS+=" --debug-osd=20" + CEPH_ARGS+=" --debug-bdev=20" + CEPH_ARGS+=" --debug-bluestore=20" + CEPH_ARGS+=" --osd-max-object-name-len=460" + CEPH_ARGS+=" --osd-max-object-namespace-len=64 " + local default_actions + default_actions+="test_path " + default_actions+="test_no_path " + default_actions+="test_find_cluster_by_uuid " + default_actions+="test_prepend_to_path " + default_actions+="test_activate_dir_magic " + default_actions+="test_activate_dir " + default_actions+="test_keyring_path " + [ `uname` != FreeBSD ] && \ + default_actions+="test_mark_init " + default_actions+="test_zap " + [ `uname` != FreeBSD ] && \ + default_actions+="test_activate_dir_bluestore " + default_actions+="test_crush_device_class " + default_actions+="test_reuse_osd_id " + local actions=${@:-$default_actions} + for action in $actions ; do + setup $dir || return 1 + set -x + $action $dir || return 1 + set +x + teardown $dir || return 1 + done +} + +main test-ceph-disk "$@" + +# Local Variables: +# compile-command: "cd .. ; test/ceph-disk.sh # test_activate_dir" +# End: