#!/bin/bash -e # ****************************************************************************** # EOS - the CERN Disk Storage System # Copyright (C) 2020 CERN/Switzerland # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, 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 General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # ****************************************************************************** SCRIPTPATH="$( cd "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )" source ${SCRIPTPATH}/eos-test-utils function usage() { echo "usage: $(basename $0) [--max-delay ] [--root-dir ] --type docker/k8s " echo " --max-delay : optional max delay in seconds" echo " --root-dir : eos root test directory " echo " docker : script runs in a Docker based setup" echo " k8s : script runs in a Kubernetes setup and requires a namespace argument" } function cleanup() { rm -rf /tmp/conv_test_file.dat exec_cmd eos-cli1 "eos rm -rF $EOS_CONVERTER_DIR" exec_cmd eos-cli1 "eos rmdir $(dirname $EOS_CONVERTER_DIR)" } # Set up global variables IS_DOCKER=false IS_KUBERNETES=false IS_LOCAL=true K8S_NAMESPACE="" MAX_DELAY=120 EOS_ROOT=/eos/dockertest/ while [[ $# -gt 1 ]]; do if [[ "$1" == "--help" || "$1" == "-h" ]]; then usage exit 0 elif [[ "$1" == "--max-delay" ]]; then MAX_DELAY=$2 shift # past argument shift # past value elif [[ "$1" == "--root-dir" ]]; then EOS_ROOT=$2 shift shift elif [[ "$1" == "--type" ]]; then if [[ "$2" == "docker" ]]; then IS_DOCKER=true IS_LOCAL=false shift elif [[ "$2" == "k8s" ]]; then IS_KUBERNETES=true IS_LOCAL=false # For the Kubernetes setup we also need a namespace argument if [[ $# -lt 3 ]]; then echo "error: missing Kubernetes namespace argument" usage exit 1 fi K8S_NAMESPACE="$3" shift shift fi else echo "error: unknown argument \"$1\"" usage exit 1 fi done EOS_CONVERTER_DIR=${EOS_ROOT}/converter_dir/test_dir/ exec_cmd eos-cli1 "dd if=/dev/urandom of=/tmp/conv_test_file.dat bs=1M count=30 && eos -r 0 0 space config default space.converter=on eos -r 0 0 mkdir -p ${EOS_CONVERTER_DIR} && eos -r 0 0 attr set default=replica ${EOS_CONVERTER_DIR} && eos cp /tmp/conv_test_file.dat ${EOS_CONVERTER_DIR}/test_replica.dat && eos cp /tmp/conv_test_file.dat ${EOS_CONVERTER_DIR}/test_raiddp.dat" # Wait for the conversion to be done START_TIME=$(date +%s) for TEST_FILE in ${EOS_CONVERTER_DIR}/test_replica.dat ${EOS_CONVERTER_DIR}/test_raiddp.dat; do # Note we use xargs to trim the output ORIG_FINFO=$(exec_cmd eos-cli1 "eos fileinfo ${TEST_FILE} -m | \ sed -e '{ s/fsid=[[:digit:]]//g; s/fsdel=[[:digit:]]//g; s/layout=[[:alnum:]]\+[[:space:]]//g; s/nstripes=[[:digit:]]\+[[:space:]]//g; s/lid=[[:digit:]]\+[[:space:]]//g; s/nrep=[[:digit:]]\+[[:space:]]//g; s/xattrn=sys.fs.tracking xattrv=[-/+[:digit:]]\+[[:space:]]//g }' | xargs") ORIG_LOCATIONS=$(exec_cmd eos-cli1 "eos -j fileinfo ${TEST_FILE} | jq -r .locations[].fsid | tr '\n' ' ' | xargs") if [[ "${TEST_FILE}" == *raiddp* ]]; then exec_cmd eos-cli1 "eos file convert ${TEST_FILE} raiddp:6" else exec_cmd eos-cli1 "eos file convert --rewrite ${TEST_FILE}" fi while CURRENT_TIME=$(date +%s) NEW_LOCATIONS=$(exec_cmd eos-cli1 "eos -j fileinfo ${TEST_FILE} | jq -r .locations[].fsid | tr '\n' ' ' | xargs") if [[ "${ORIG_LOCATIONS}" != "${NEW_LOCATIONS}" ]]; then echo "info: file successfully converted" break fi if (( $((${CURRENT_TIME} - ${START_TIME})) >= ${MAX_DELAY} )); then echo "error: conversion failed" cleanup exit 1 else echo "info: sleep for 2 seconds waiting for conversion, `secs_to_human $((${CURRENT_TIME} - ${START_TIME}))` passed" sleep 2 fi do : done NEW_FINFO=$(exec_cmd eos-cli1 "eos fileinfo ${TEST_FILE} -m | \ sed -e '{ s/fsid=[[:digit:]]//g; s/fsdel=[[:digit:]]//g; s/layout=[[:alnum:]]\+[[:space:]]//g; s/nstripes=[[:digit:]]\+[[:space:]]//g; s/lid=[[:digit:]]\+[[:space:]]//g; s/nrep=[[:digit:]]\+[[:space:]]//g; s/xattrn=sys.fs.tracking xattrv=[-/+[:digit:]]\+[[:space:]]//g }' | xargs") if [[ "${ORIG_FINFO}" != "${NEW_FINFO}" ]]; then echo "error: converted file metadata does not match the original one" echo "original finfo: \"${ORIG_FINFO}\"" echo "new finfo : \"${NEW_FINFO}\"" cleanup exit 1 fi done cleanup exit 0