#!/bin/bash

cvmfs_test_name="Query Geo-API for server and fallback proxy order"
cvmfs_test_suites="quick"

get_first_proxyname() {
    sudo cvmfs_talk -i grid.cern.ch proxy info|sed -n 's/^\[0\] //p'|sed 's/.*(//;s/,.*//'
}

get_second_proxyname() {
    sudo cvmfs_talk -i grid.cern.ch proxy info|sed -n 's/^\[1\] //p'|sed 's/.*(//;s/,.*//'
}

cvmfs_run_test() {
  logfile=$1

  # Make sure that the stratum 1s have large geographical distance
  #   between them.  Use cvmfs.fnal.gov as one of them because it is
  #   a high-availability system.
  sudo sh -c 'echo "CVMFS_SERVER_URL=\"http://cvmfs-stratum-one.ihep.ac.cn:8000/cvmfs/@fqrn@;http://cvmfs-stratum-one.cern.ch/cvmfs/@fqrn@;http://cvmfs.fnal.gov:8000/cvmfs/@fqrn@\"" > /etc/cvmfs/config.d/grid.cern.ch.local' || return 100
  sudo sh -c 'echo "CVMFS_HTTP_PROXY=DIRECT" >> /etc/cvmfs/config.d/grid.cern.ch.local' || return 101
  sudo sh -c 'echo "CVMFS_FALLBACK_PROXY=" >> /etc/cvmfs/config.d/grid.cern.ch.local' || return 102
  cvmfs_mount grid.cern.ch || return 1

  sudo cvmfs_talk -i grid.cern.ch host probe geo || return 10
  local geo_probe=$(get_xattr host_list /cvmfs/grid.cern.ch)

  sudo cvmfs_talk -i grid.cern.ch host probe || return 2
  local normal_probe=$(get_xattr host_list /cvmfs/grid.cern.ch)

  echo "geo_probe: $geo_probe"
  echo "normal_probe: $normal_probe"

  local country=""
  case `hostname -f` in
    *.cern.ch) country=ch;;
    *.fnal.gov|*.unl.edu) country=us;;
  esac

  if [ "x$country" = "xch" ]; then
    if [ "$geo_probe" != "http://cvmfs-stratum-one.cern.ch/cvmfs/grid.cern.ch;http://cvmfs.fnal.gov:8000/cvmfs/grid.cern.ch;http://cvmfs-stratum-one.ihep.ac.cn:8000/cvmfs/grid.cern.ch" ]; then
      return 20;
    fi
  elif [ "x$country" = "xus" ]; then
    if [ "$geo_probe" != "http://cvmfs.fnal.gov:8000/cvmfs/grid.cern.ch;http://cvmfs-stratum-one.cern.ch/cvmfs/grid.cern.ch;http://cvmfs-stratum-one.ihep.ac.cn:8000/cvmfs/grid.cern.ch" ]; then
      return 21;
    fi
  else
    echo "Warning: cannot check correct ordering of stratum 1s outside recognized domain"
    CVMFS_GENERAL_WARNING_FLAG=1
  fi

  # also test ordering of fallback proxies
  local non_fallback_proxy=$(get_first_proxyname)
  if [ "$non_fallback_proxy" != "DIRECT" ]; then
    return 30
  fi

  cvmfs_umount grid.cern.ch

  local us_fbp="http://cvmfsbproxy.fnal.gov:3126"
  local ch_fbp="http://cvmfsbproxy.cern.ch:3126"
  sudo sh -c 'echo "CVMFS_FALLBACK_PROXY=\"'"$ch_fbp;$us_fbp"'\"" >> /etc/cvmfs/config.d/grid.cern.ch.local' || return 301
  cvmfs_mount grid.cern.ch || return 3

  sudo cvmfs_talk -i grid.cern.ch proxy info
  sudo cvmfs_talk -i grid.cern.ch host probe geo || return 31
  sudo cvmfs_talk -i grid.cern.ch proxy info
  local first_fallback_proxy=$(get_first_proxyname)
  echo "first_fallback_proxy: $first_fallback_proxy"
  if [ -z "$first_fallback_proxy" ]; then
    return 32
  fi
  if [ "$first_fallback_proxy" = "DIRECT" ]; then
    # DIRECT is supposed to be removed when there's a fallback proxy
    return 33
  fi

  # make sure that the same one comes up as first no matter which order
  #   they started in
  sudo cvmfs_talk -i grid.cern.ch proxy fallback "$us_fbp;$ch_fbp" || return 34
  sudo cvmfs_talk -i grid.cern.ch proxy info
  sudo cvmfs_talk -i grid.cern.ch host probe geo || return 35
  sudo cvmfs_talk -i grid.cern.ch proxy info
  local second_fallback_proxy=$(get_first_proxyname)
  echo "second_fallback_proxy: $second_fallback_proxy"
  if [ "$first_fallback_proxy" != "$second_fallback_proxy" ]; then
    return 36
  fi

  # Use the fallback proxy also as a regular proxy here because it's one
  #  of the few proxies that are accessible from anywhere in the world.
  #  This is not a use it is intended for, but one client doesn't hurt.
  local close_fbp=""
  if [ "$country" = "ch" ]; then
    close_fbp=$ch_fbp
  elif [ "$country" = "us" ]; then
    close_fbp=$us_fbp
  fi
  if [ -n "$close_fbp" ]; then
    # make sure that the ordering is unaffected by regular proxies
    sudo cvmfs_talk -i grid.cern.ch proxy set "$close_fbp" || return 37
    sudo cvmfs_talk -i grid.cern.ch proxy info
    sudo cvmfs_talk -i grid.cern.ch host probe geo || return 38
    sudo cvmfs_talk -i grid.cern.ch proxy info
    local third_fallback_proxy=$(get_second_proxyname)
    echo "third_fallback_proxy: $third_fallback_proxy"
    if [ "$third_fallback_proxy" != "$second_fallback_proxy" ]; then
      return 39
    fi
  fi

  sudo rm -f /etc/cvmfs/config.d/grid.cern.ch.local
  return 0
}
