#
# Test case for operation when gfmd network interface is down
#

#
# Test parameters
#
# GFARM_HOME:	A directory path of Gfarm which this test will be executed
#
setup_operation_in_gfmd_ifdown()
{
	# define mount point
	MOUNT_POINT=mnt_$TEST_EXEC_ID

	# default parameter
	GFARM_HOME=${GFARM_HOME-"/"}

	# miscellaneous parameters
	GFARM_FILE1=$GFARM_HOME/${TEST_EXEC_ID}_1
	GFARM_FILE2=$GFARM_HOME/${TEST_EXEC_ID}_2
	GFARM_FILE3=$MOUNT_POINT/${TEST_EXEC_ID}_3

	# prepare: check whether required host is defined
	$GFSERVICE systest::gfarm_v2::check_hostids_defined - \
		"gfmd1 gfmd2 gfsd1 gfsd2 client1"
	[ $? -ne 0 ] && return $RESULT_UNSUPPORTED

	# prepare: create mount point
	$GFSERVICE systest::gfarm2fs::exec_ssh client1 mkdir $MOUNT_POINT

	# prepare: write file with gfreg
	echo $TEST_EXEC_ID | $GFSERVICE systest::gfarm_v2::read_and_register client1 \
		$GFARM_FILE1 gfmd1 gfsd2

	# prepare: stop gfsd
	$GFSERVICE stop-gfsd gfsd1

	# prepare: make network interface down
	$GFSERVICE systest::gfarm2fs::ifdown gfmd1
	if [ $? -ne 0 ]; then
		log_warn "$TESTNAME: failed to execute ifdown on gfmd1"
		return $RESULT_FATAL
	fi

	# prepare: make network interface down
	$GFSERVICE systest::gfarm2fs::ifdown gfmd2
	if [ $? -ne 0 ]; then
		log_warn "$TESTNAME: failed to execute ifdown on gfmd2"
		return $RESULT_FATAL
	fi

	return $RESULT_PASS
}

test_operation_in_gfmd_ifdown()
{
	RESULT=$RESULT_PASS

	# step: write file with gfreg
	echo $TEST_EXEC_ID | $GFSERVICE systest::gfarm_v2::read_and_register client1 \
		$GFARM_FILE2 gfmd1
	if [ $? -eq 0 ]; then
		log_warn "$TESTNAME: unexpectedly suceeded to write a file"
		set_result RESULT $RESULT_XPASS
	fi

	# step: read file with gfexport
	$GFSERVICE systest::gfarm2fs::export_file client1 $GFARM_FILE1 gfmd1
	if [ $? -eq 0 ]; then
		log_warn "$TESTNAME: unexpectedly suceeded to read a file"
		set_result RESULT $RESULT_XPASS
	fi

	# step: add an user with gfuser
	$GFSERVICE gfcmd client1 gfuser -c $TEST_EXEC_ID \
		user-create-by-test "/home/$TEST_EXEC_ID" -
	if [ $? -eq 0 ]; then
		log_warn "$TESTNAME: unexpectedly suceeded to create a user"
		set_result RESULT $RESULT_XPASS
	fi

	# step: show users with gfuser
	$GFSERVICE gfcmd client1 gfuser -l
	if [ $? -eq 0 ]; then
		log_warn "$TESTNAME: unexpectedly suceeded to list users"
		set_result RESULT $RESULT_XPASS
	fi

	# step: start gfsd
	$GFSERVICE start-gfsd gfsd1
	if [ $? -ne 0 ]; then
		log_warn "$TESTNAME: failed to start gfsd"
		set_result RESULT $RESULT_FAIL
	fi

	# step: mount
	$GFSERVICE mount client1 $MOUNT_POINT
	if [ $? -ne 0 ]; then
		log_warn "$TESTNAME: failed to mount Gfarm file system"
		set_result RESULT $RESULT_FAIL
	fi

	# step: make network interface up
	$GFSERVICE systest::gfarm2fs::ifup gfmd1
	if [ $? -ne 0 ]; then
		log_warn "$TESTNAME: failed to execute ifup on gfmd1"
		return $RESULT_FATAL
	fi

	# step: make network interface up
	$GFSERVICE systest::gfarm2fs::ifup gfmd2
	if [ $? -ne 0 ]; then
		log_warn "$TESTNAME: failed to execute ifup on gfmd2"
		return $RESULT_FATAL
	fi

	# step: unmount
	$GFSERVICE umount client1 $MOUNT_POINT

	# step: write file with gfreg
	echo $TEST_EXEC_ID | $GFSERVICE systest::gfarm_v2::read_and_register client1 \
		$GFARM_FILE2 gfmd1
	if [ $? -ne 0 ]; then
		log_warn "$TESTNAME: failed to write files"
		set_result RESULT $RESULT_FAIL
	fi

	# step: read file with gfexport
	$GFSERVICE systest::gfarm2fs::export_file client1 $GFARM_FILE1 gfmd1
	if [ $? -ne 0 ]; then
		log_warn "$TESTNAME: failed to read files"
		set_result RESULT $RESULT_FAIL
	fi

	# step: add an user with gfuser
	$GFSERVICE gfcmd client1 gfuser -c $TEST_EXEC_ID \
		user-create-by-test "/home/$TEST_EXEC_ID" -
	if [ $? -ne 0 ]; then
		log_warn "$TESTNAME: failed to add user"
		set_result RESULT $RESULT_FAIL
	fi

	# step: show users with gfuser
	$GFSERVICE gfcmd client1 gfuser -l
	if [ $? -ne 0 ]; then
		log_warn "$TESTNAME: failed to show user"
		set_result RESULT $RESULT_FAIL
	fi

	# step: restart gfsd
	$GFSERVICE restart-gfsd gfsd1
	if [ $? -ne 0 ]; then
		log_warn "$TESTNAME: failed to start gfsd"
		set_result RESULT $RESULT_FAIL
	fi

	# step: mount
	$GFSERVICE mount client1 $MOUNT_POINT
	if [ $? -ne 0 ]; then
		log_warn "$TESTNAME: failed to mount gfarm"
		set_result RESULT $RESULT_FAIL
	fi

	# step: create file
	$GFSERVICE systest::gfarm2fs::exec_ssh client1 "echo $TEST_EXEC_ID > $GFARM_FILE3"
	if [ $? -ne 0 ]; then
		log_warn "$TESTNAME: failed to create file"
		set_result RESULT $RESULT_FAIL
	fi

	return $RESULT
}

teardown_operation_in_gfmd_ifdown()
{
	# cleanup: make network interface up
	$GFSERVICE systest::gfarm2fs::ifup gfmd1
	$GFSERVICE systest::gfarm2fs::ifup gfmd2

	# cleanup: remove files
	$GFSERVICE gfcmd client1 gfrm -f $GFARM_FILE1 $GFARM_FILE2
	$GFSERVICE systest::gfarm2fs::exec_ssh client1 rm -f $GFARM_FILE3

	# cleanup: delete user
	$GFSERVICE gfcmd client1 gfuser -d $TEST_EXEC_ID

	# cleanup: unmount
	$GFSERVICE umount client1 $MOUNT_POINT

	# cleanup: remove mount point
	$GFSERVICE systest::gfarm2fs::exec_ssh client1 rmdir $MOUNT_POINT

	return $RESULT_PASS
}
