#!/usr/bin/env bash

source $CEPH_ROOT/qa/standalone/ceph-helpers.sh

set -e

function run() {
    local dir=$1
    shift

    export CEPH_MON="127.0.0.1:$(get_unused_port)"
    export CEPH_ARGS
    CEPH_ARGS+="--fsid=$(uuidgen) --auth-supported=none "
    CEPH_ARGS+="--mon-host=$CEPH_MON "
    set -e

    local funcs=${@:-$(set | sed -n -e 's/^\(TEST_[0-9a-z_]*\) .*/\1/p')}
    for func in $funcs ; do
        setup $dir || return 1
	$func $dir || return 1
        teardown $dir || return 1
    done
}

function TEST_safe_to_destroy() {
    local dir=$1

    run_mon $dir a
    run_mgr $dir x
    run_osd $dir 0
    run_osd $dir 1
    run_osd $dir 2
    run_osd $dir 3

    flush_pg_stats

    ceph osd safe-to-destroy 0
    ceph osd safe-to-destroy 1
    ceph osd safe-to-destroy 2
    ceph osd safe-to-destroy 3

    ceph osd pool create foo 128
    sleep 2
    flush_pg_stats
    wait_for_clean

    expect_failure $dir 'pgs currently' ceph osd safe-to-destroy 0
    expect_failure $dir 'pgs currently' ceph osd safe-to-destroy 1
    expect_failure $dir 'pgs currently' ceph osd safe-to-destroy 2
    expect_failure $dir 'pgs currently' ceph osd safe-to-destroy 3

    ceph osd out 0
    sleep 2
    flush_pg_stats
    wait_for_clean

    ceph osd safe-to-destroy 0

    # even osds without osd_stat are ok if all pgs are active+clean
    id=`ceph osd create`
    ceph osd safe-to-destroy $id
}

function TEST_ok_to_stop() {
    local dir=$1

    run_mon $dir a
    run_mgr $dir x
    run_osd $dir 0
    run_osd $dir 1
    run_osd $dir 2
    run_osd $dir 3

    ceph osd pool create foo 128
    ceph osd pool set foo size 3
    ceph osd pool set foo min_size 2
    sleep 1
    flush_pg_stats
    wait_for_clean

    ceph osd ok-to-stop 0
    ceph osd ok-to-stop 1
    ceph osd ok-to-stop 2
    ceph osd ok-to-stop 3
    expect_failure $dir bad_become_inactive ceph osd ok-to-stop 0 1

    ceph osd pool set foo min_size 1
    sleep 1
    flush_pg_stats
    wait_for_clean
    ceph osd ok-to-stop 0 1
    ceph osd ok-to-stop 1 2
    ceph osd ok-to-stop 2 3
    ceph osd ok-to-stop 3 4
    expect_failure $dir bad_become_inactive ceph osd ok-to-stop 0 1 2
    expect_failure $dir bad_become_inactive ceph osd ok-to-stop 0 1 2 3
}

main safe-to-destroy "$@"
