#!/bin/bash
#
# MinIO Cloud Storage, (C) 2017, 2018 MinIO, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
set -e
set -E
set -o pipefail
if [ ! -x " $PWD /minio " ] ; then
echo "minio executable binary not found in current directory"
exit 1
fi
WORK_DIR = " $PWD /.verify- $RANDOM "
export MINT_MODE = core
export MINT_DATA_DIR = " $WORK_DIR /data "
export SERVER_ENDPOINT = "127.0.0.1:9000"
export ACCESS_KEY = "minio"
export SECRET_KEY = "minio123"
export ENABLE_HTTPS = 0
export GO111MODULE = on
MINIO_CONFIG_DIR = " $WORK_DIR /.minio "
MINIO = ( " $PWD /minio " --config-dir " $MINIO_CONFIG_DIR " )
FILE_1_MB = " $MINT_DATA_DIR /datafile-1-MB "
FILE_65_MB = " $MINT_DATA_DIR /datafile-65-MB "
FUNCTIONAL_TESTS = " $WORK_DIR /functional-tests.sh "
function start_minio_fs( )
{
" ${ MINIO [@] } " server " ${ WORK_DIR } /fs-disk " >" $WORK_DIR /fs-minio.log " 2>& 1 &
minio_pid = $!
sleep 10
echo " $minio_pid "
}
function start_minio_erasure( )
{
" ${ MINIO [@] } " server " ${ WORK_DIR } /erasure-disk1 " " ${ WORK_DIR } /erasure-disk2 " " ${ WORK_DIR } /erasure-disk3 " " ${ WORK_DIR } /erasure-disk4 " >" $WORK_DIR /erasure-minio.log " 2>& 1 &
minio_pid = $!
sleep 15
echo " $minio_pid "
}
function start_minio_erasure_sets( )
{
" ${ MINIO [@] } " server " ${ WORK_DIR } /erasure-disk-sets{1...32} " >" $WORK_DIR /erasure-minio-sets.log " 2>& 1 &
minio_pid = $!
sleep 15
echo " $minio_pid "
}
function start_minio_zone_erasure_sets( )
{
declare -a minio_pids
export MINIO_ACCESS_KEY = $ACCESS_KEY
export MINIO_SECRET_KEY = $SECRET_KEY
" ${ MINIO [@] } " server --address= :9000 " http://127.0.0.1:9000 ${ WORK_DIR } /zone-disk-sets{1...4} " " http://127.0.0.1:9001 ${ WORK_DIR } /zone-disk-sets{5...8} " >" $WORK_DIR /zone-minio-9000.log " 2>& 1 &
minio_pids[ 0] = $!
" ${ MINIO [@] } " server --address= :9001 " http://127.0.0.1:9000 ${ WORK_DIR } /zone-disk-sets{1...4} " " http://127.0.0.1:9001 ${ WORK_DIR } /zone-disk-sets{5...8} " >" $WORK_DIR /zone-minio-9001.log " 2>& 1 &
minio_pids[ 1] = $!
sleep 40
echo " ${ minio_pids [@] } "
}
function start_minio_zone_erasure_sets_ipv6( )
{
declare -a minio_pids
export MINIO_ACCESS_KEY = $ACCESS_KEY
export MINIO_SECRET_KEY = $SECRET_KEY
" ${ MINIO [@] } " server --address= "[::1]:9000" " http://[::1]:9000 ${ WORK_DIR } /zone-disk-sets{1...4} " " http://[::1]:9001 ${ WORK_DIR } /zone-disk-sets{5...8} " >" $WORK_DIR /zone-minio-9000.log " 2>& 1 &
minio_pids[ 0] = $!
" ${ MINIO [@] } " server --address= "[::1]:9001" " http://[::1]:9000 ${ WORK_DIR } /zone-disk-sets{1...4} " " http://[::1]:9001 ${ WORK_DIR } /zone-disk-sets{5...8} " >" $WORK_DIR /zone-minio-9001.log " 2>& 1 &
minio_pids[ 1] = $!
sleep 40
echo " ${ minio_pids [@] } "
}
function start_minio_dist_erasure( )
{
declare -a minio_pids
export MINIO_ACCESS_KEY = $ACCESS_KEY
export MINIO_SECRET_KEY = $SECRET_KEY
" ${ MINIO [@] } " server --address= :9000 " http://127.0.0.1:9000 ${ WORK_DIR } /dist-disk1 " " http://127.0.0.1:9001 ${ WORK_DIR } /dist-disk2 " " http://127.0.0.1:9002 ${ WORK_DIR } /dist-disk3 " " http://127.0.0.1:9003 ${ WORK_DIR } /dist-disk4 " >" $WORK_DIR /dist-minio-9000.log " 2>& 1 &
minio_pids[ 0] = $!
" ${ MINIO [@] } " server --address= :9001 " http://127.0.0.1:9000 ${ WORK_DIR } /dist-disk1 " " http://127.0.0.1:9001 ${ WORK_DIR } /dist-disk2 " " http://127.0.0.1:9002 ${ WORK_DIR } /dist-disk3 " " http://127.0.0.1:9003 ${ WORK_DIR } /dist-disk4 " >" $WORK_DIR /dist-minio-9001.log " 2>& 1 &
minio_pids[ 1] = $!
" ${ MINIO [@] } " server --address= :9002 " http://127.0.0.1:9000 ${ WORK_DIR } /dist-disk1 " " http://127.0.0.1:9001 ${ WORK_DIR } /dist-disk2 " " http://127.0.0.1:9002 ${ WORK_DIR } /dist-disk3 " " http://127.0.0.1:9003 ${ WORK_DIR } /dist-disk4 " >" $WORK_DIR /dist-minio-9002.log " 2>& 1 &
minio_pids[ 2] = $!
" ${ MINIO [@] } " server --address= :9003 " http://127.0.0.1:9000 ${ WORK_DIR } /dist-disk1 " " http://127.0.0.1:9001 ${ WORK_DIR } /dist-disk2 " " http://127.0.0.1:9002 ${ WORK_DIR } /dist-disk3 " " http://127.0.0.1:9003 ${ WORK_DIR } /dist-disk4 " >" $WORK_DIR /dist-minio-9003.log " 2>& 1 &
minio_pids[ 3] = $!
sleep 40
echo " ${ minio_pids [@] } "
}
function run_test_fs( )
{
minio_pid = " $( start_minio_fs) "
( cd " $WORK_DIR " && " $FUNCTIONAL_TESTS " )
rv = $?
kill " $minio_pid "
sleep 3
if [ " $rv " -ne 0 ] ; then
cat " $WORK_DIR /fs-minio.log "
fi
rm -f " $WORK_DIR /fs-minio.log "
return " $rv "
}
function run_test_erasure_sets( ) {
minio_pid = " $( start_minio_erasure_sets) "
( cd " $WORK_DIR " && " $FUNCTIONAL_TESTS " )
rv = $?
kill " $minio_pid "
sleep 3
if [ " $rv " -ne 0 ] ; then
cat " $WORK_DIR /erasure-minio-sets.log "
fi
rm -f " $WORK_DIR /erasure-minio-sets.log "
return " $rv "
}
function run_test_dist_erasure_sets_ipv6( )
{
minio_pids = ( $( start_minio_dist_erasure_sets_ipv6) )
export SERVER_ENDPOINT = "[::1]:9000"
( cd " $WORK_DIR " && " $FUNCTIONAL_TESTS " )
rv = $?
for pid in " ${ minio_pids [@] } " ; do
kill " $pid "
done
sleep 3
if [ " $rv " -ne 0 ] ; then
for i in $( seq 0 9) ; do
echo " server $i log: "
cat " $WORK_DIR /dist-minio-v6-900 $i .log "
done
fi
for i in $( seq 0 9) ; do
rm -f " $WORK_DIR /dist-minio-v6-900 $i .log "
done
return " $rv "
}
function run_test_zone_erasure_sets( )
{
minio_pids = ( $( start_minio_zone_erasure_sets) )
( cd " $WORK_DIR " && " $FUNCTIONAL_TESTS " )
rv = $?
for pid in " ${ minio_pids [@] } " ; do
kill " $pid "
done
sleep 3
if [ " $rv " -ne 0 ] ; then
for i in $( seq 0 1) ; do
echo " server $i log: "
cat " $WORK_DIR /zone-minio-900 $i .log "
done
fi
for i in $( seq 0 1) ; do
rm -f " $WORK_DIR /zone-minio-900 $i .log "
done
return " $rv "
}
function run_test_zone_erasure_sets_ipv6( )
{
minio_pids = ( $( start_minio_zone_erasure_sets_ipv6) )
export SERVER_ENDPOINT = "[::1]:9000"
( cd " $WORK_DIR " && " $FUNCTIONAL_TESTS " )
rv = $?
for pid in " ${ minio_pids [@] } " ; do
kill " $pid "
done
sleep 3
if [ " $rv " -ne 0 ] ; then
for i in $( seq 0 1) ; do
echo " server $i log: "
cat " $WORK_DIR /zone-minio-ipv6-900 $i .log "
done
fi
for i in $( seq 0 1) ; do
rm -f " $WORK_DIR /zone-minio-ipv6-900 $i .log "
done
return " $rv "
}
function run_test_erasure( )
{
minio_pid = " $( start_minio_erasure) "
( cd " $WORK_DIR " && " $FUNCTIONAL_TESTS " )
rv = $?
kill " $minio_pid "
sleep 3
if [ " $rv " -ne 0 ] ; then
cat " $WORK_DIR /erasure-minio.log "
fi
rm -f " $WORK_DIR /erasure-minio.log "
return " $rv "
}
function run_test_dist_erasure( )
{
minio_pids = ( $( start_minio_dist_erasure) )
( cd " $WORK_DIR " && " $FUNCTIONAL_TESTS " )
rv = $?
for pid in " ${ minio_pids [@] } " ; do
kill " $pid "
done
sleep 3
if [ " $rv " -ne 0 ] ; then
echo "server1 log:"
cat " $WORK_DIR /dist-minio-9000.log "
echo "server2 log:"
cat " $WORK_DIR /dist-minio-9001.log "
echo "server3 log:"
cat " $WORK_DIR /dist-minio-9002.log "
echo "server4 log:"
cat " $WORK_DIR /dist-minio-9003.log "
fi
rm -f " $WORK_DIR /dist-minio-9000.log " " $WORK_DIR /dist-minio-9001.log " " $WORK_DIR /dist-minio-9002.log " " $WORK_DIR /dist-minio-9003.log "
return " $rv "
}
function purge( )
{
rm -rf " $1 "
}
function __init__( )
{
echo "Initializing environment"
mkdir -p " $WORK_DIR "
mkdir -p " $MINIO_CONFIG_DIR "
mkdir -p " $MINT_DATA_DIR "
MC_BUILD_DIR = " mc- $RANDOM "
if ! git clone --quiet https://github.com/minio/mc " $MC_BUILD_DIR " ; then
echo "failed to download https://github.com/minio/mc"
purge " ${ MC_BUILD_DIR } "
exit 1
fi
( cd " ${ MC_BUILD_DIR } " && go build -o " $WORK_DIR /mc " )
# remove mc source.
purge " ${ MC_BUILD_DIR } "
shred -n 1 -s 1M - 1>" $FILE_1_MB " 2>/dev/null
shred -n 1 -s 65M - 1>" $FILE_65_MB " 2>/dev/null
## version is purposefully set to '3' for minio to migrate configuration file
echo '{"version": "3", "credential": {"accessKey": "minio", "secretKey": "minio123"}, "region": "us-east-1"}' > " $MINIO_CONFIG_DIR /config.json "
if ! wget -q -O " $FUNCTIONAL_TESTS " https://raw.githubusercontent.com/minio/mc/master/functional-tests.sh; then
echo "failed to download https://raw.githubusercontent.com/minio/mc/master/functional-tests.sh"
exit 1
fi
sed -i 's|-sS|-sSg|g' " $FUNCTIONAL_TESTS "
chmod a+x " $FUNCTIONAL_TESTS "
}
function main( )
{
echo "Testing in FS setup"
if ! run_test_fs; then
echo "FAILED"
purge " $WORK_DIR "
exit 1
fi
echo "Testing in Erasure setup"
if ! run_test_erasure; then
echo "FAILED"
purge " $WORK_DIR "
exit 1
fi
echo "Testing in Distributed Erasure setup"
if ! run_test_dist_erasure; then
echo "FAILED"
purge " $WORK_DIR "
exit 1
fi
echo "Testing in Erasure setup as sets"
if ! run_test_erasure_sets; then
echo "FAILED"
purge " $WORK_DIR "
exit 1
fi
echo "Testing in Distributed Eraure expanded setup"
if ! run_test_zone_erasure_sets; then
echo "FAILED"
purge " $WORK_DIR "
exit 1
fi
echo "Testing in Distributed Erasure expanded setup with ipv6"
if ! run_test_zone_erasure_sets_ipv6; then
echo "FAILED"
purge " $WORK_DIR "
exit 1
fi
purge " $WORK_DIR "
}
( __init__ " $@ " && main " $@ " )
rv = $?
purge " $WORK_DIR "
exit " $rv "