#!/bin/bash
# test
set -eu

HOOKS_DIR="$CHARM_DIR/hooks"
ARG0=${0##*/}

if [[ -e $HOOKS_DIR/swift-storage-node-common ]] ; then
  . $HOOKS_DIR/swift-storage-node-common
else
  echo "ERROR: Could not load swift-storage-node-common from $HOOKS_DIR"
fi

function config_changed {
  # perform openstack upgrade if openstack-origin has been bumped.
  local install_src=$(config-get openstack-origin)
  local cur=$(get_os_codename_package "python-swift")
  local available=$(get_os_codename_install_source "$install_src")
  if [[ "$available" != "unknown" ]] ; then
    if dpkg --compare-versions $(get_os_version_codename "$cur") lt \
                               $(get_os_version_codename "$available") ; then
      juju-log "$CHARM: Upgrading OpenStack release: $cur -> $available."
      do_openstack_upgrade "$install_src" $PACKAGES
    fi
  fi
  declare -a env_vars=()
  for i in account container object ; do
    port=$(config-get ${i}-server-port)
    local url="http://$STORAGE_LOCAL_NET_IP:$port/recon/diskusage"
    # append to env_vars
    env_vars+=("OPENSTACK_PORT_${i^^}=$port")
    env_vars+=("OPENSTACK_SWIFT_SERVICE_${i^^}=${i}-server")

    # Ensure we have at least one device mounted as reported by swift-recon
    env_vars+=('OPENSTACK_URL_'${i^^}'="'$url'|\"mounted\":+true"')

    create_server_conf $i "$port"
  done

  # Save our scriptrc env variables for health checks
  save_script_rc ${env_vars[@]}
}

function install_hook {
  apt-get -y --force-yes install python-software-properties || exit 1

  configure_install_source "$OPENSTACK_ORIGIN"
  apt-get update

  DEBIAN_FRONTEND=noninteractive apt-get -y \
    install --no-install-recommends $PACKAGES || exit 1

  [[ ! -d /etc/swift ]] && mkdir /etc/swift
  [[ ! -d /var/cache/swift ]] && mkdir /var/cache/swift
  chown swift:swift /etc/swift
  chown -R swift:swift /var/cache/swift
  configure_rsyncd
  swift-init all stop || true
  setup_storage
  config_changed
}

function storage_joined {
  local devs=$(determine_block_devs)
  local reldevices=""
  for dev in $devs ; do
    local srvnodename=$(basename $dev)
    if [[ -n "$reldevices" ]] ; then
      reldevices="$reldevices:$srvnodename"
    else
      reldevices="$srvnodename"
    fi
  done
  relation-set zone="$(config-get zone)" \
               device="$reldevices" \
               object_port="$(config-get object-server-port)" \
               container_port="$(config-get container-server-port)" \
               account_port="$(config-get account-server-port)"
}

function storage_changed {
  local rings_url=`relation-get rings_url`
  local swift_hash=`relation-get swift_hash`
  [[ -z $rings_url ]] || [[ -z $swift_hash ]] && exit 0

  set_swift_hash $swift_hash
  for i in account object container ; do
    echo "Fetching $rings_url/$i.ring.gz"
    wget "$rings_url/$i.ring.gz" -O /etc/swift/$i.ring.gz
  done
  set_swift_hash $swift_hash
  chown swift -R /etc/swift
  swift-init all start || true
}

case $ARG0 in
  "install") install_hook ;;
  "start"|"stop") exit 0 ;;
  "config-changed") config_changed ;;
  "swift-storage-relation-joined") storage_joined ;;
  "swift-storage-relation-changed") storage_changed ;;
  "config-changed") config_changed ;;
esac