#!/bin/bash
cvmfs_test_name="Migrate repository to newer version"
cvmfs_test_autofs_on_startup=false
MIGRATIONTEST_500_REPO="migrationtest.cern.ch"
MIGRATIONTEST_500_REPLICA="migrationtest-stratum1.cern.ch"


cleanup() {
  echo "running cleanup()"
  destroy_repo $MIGRATIONTEST_500_REPO
  destroy_repo $MIGRATIONTEST_500_REPLICA
}

cvmfs_run_test() {
  local logfile=$1
  local script_location=$2

  . ${script_location}/../../common/migration_tests/common.sh

  trap cleanup EXIT HUP INT TERM || return $?

  # download upstream client package
  current_version=$(package_version $(find_new_package cvmfs-server))
  echo "Version of testee:        $current_version"
  # FIX ME: We want to test upgrading from more than just one base version
  # previous_version=$(decrement_version $current_version)
  # Use 2.13.3 as the base because that's when the geo DB began being an
  # unencumbered download
  previous_version="2.13.3"
  echo "Version to be downloaded: $previous_version"
  upstream_packages=""
  for name in cvmfs-server cvmfs cvmfs-libs cvmfs-fuse3; do
    upstream_package_url=$(guess_package_url $name ${previous_version})
    echo "Download URL:             $upstream_package_url"
    wget --no-check-certificate --quiet $upstream_package_url || return 2
    upstream_packages="$upstream_packages $(basename $upstream_package_url)"
  done
  echo "Upstream Packages:         $upstream_packages"

  # make sure that there is no version of CernVM-FS server installed
  if is_installed "cvmfs-libs"; then
    installed_version=$(installed_package_version "cvmfs-libs")
    echo "uninstalling CernVM-FS libs $installed_version"
    uninstall_package "cvmfs-libs" || return 3
  fi
  if is_installed "cvmfs-server"; then
    installed_version=$(installed_package_version "cvmfs-server")
    echo "uninstalling CernVM-FS $installed_version"
    uninstall_package "cvmfs-server" || return 3
  fi
  if is_installed "cvmfs"; then
    installed_version=$(installed_package_version "cvmfs")
    echo "uninstalling CernVM-FS client $installed_version"
    uninstall_package "cvmfs" || return 3
  fi

  # install the upstream CernVM-FS package
  echo "installing CernVM-FS server $previous_version"
  install_packages $upstream_packages || return 4

  # make sure that autofs is not running
  echo "switching off autofs"
  autofs_switch off || return 6

  # create a testing repository
  create_empty_repo $MIGRATIONTEST_500_REPO $CVMFS_TEST_USER || return 7

  start_transaction $MIGRATIONTEST_500_REPO || return 8
  echo "testfile" > /cvmfs/$MIGRATIONTEST_500_REPO/testfile || return 9
  publish_repo $MIGRATIONTEST_500_REPO || return 10


  # create a stratum1
  load_repo_config $MIGRATIONTEST_500_REPO
  create_stratum1 $MIGRATIONTEST_500_REPLICA \
                  $CVMFS_TEST_USER           \
                  $CVMFS_STRATUM0            \
                  /etc/cvmfs/keys/${MIGRATIONTEST_500_REPO}.pub || return 11

  # synchronize stratum1 with stratum0
  cvmfs_server snapshot $MIGRATIONTEST_500_REPLICA || return 12

  export CVMFS_SERVER_DEBUG=3
  start_transaction $MIGRATIONTEST_500_REPO || return 13
  echo "testfile2" > /cvmfs/$MIGRATIONTEST_500_REPO/testfile2 || return 14
  publish_repo $MIGRATIONTEST_500_REPO || return 15

  # do the CernVM-FS package update
  echo "updating CernVM-FS server package to version $current_version"
  install_new_packages || return 16

  # migrate repositories created under old version
  sudo cvmfs_server migrate $MIGRATIONTEST_500_REPO || return 17
  sudo cvmfs_server migrate $MIGRATIONTEST_500_REPLICA || return 18

  # do some ordinary stuff with the repository
  start_transaction $MIGRATIONTEST_500_REPO || return 19
  echo "testfile3" > /cvmfs/$MIGRATIONTEST_500_REPO/testfile3
  sudo rm -f /cvmfs/$MIGRATIONTEST_500_REPO/testfile
  publish_repo $MIGRATIONTEST_500_REPO || return 20

  # synchronize stratum1 with stratum0
  cvmfs_server snapshot $MIGRATIONTEST_500_REPLICA || return 21

  # check that test files were successfully replicated
  testfile2_object="c8e126bfcef0d8b8dce3daf99cf0219c8ba3011a"
  testfile3_object="903122d5ce97886bb5331af7d0a615a0720dafd0"
  peek_backend $MIGRATIONTEST_500_REPLICA $testfile2_object || return 22
  peek_backend $MIGRATIONTEST_500_REPLICA $testfile3_object || return 23

  # check repositories integrity
  check_repository $MIGRATIONTEST_500_REPO || return 24
  check_repository $MIGRATIONTEST_500_REPLICA || return 25
}
