Charm: oneiric/nova-compute   Revision: 49   Hook: amqp-relation-changed
#!/bin/bash
FORMULA_DIR=$(dirname $0)
ARG0=${0##*/}

if [[ -e $FORMULA_DIR/nova-compute-common ]] ; then
  . $FORMULA_DIR/nova-compute-common
else
  echo "ERROR: Could not load nova-compute-common from $FORMULA_DIR"
fi

function install_hook {
  [[ -z $VIRT_TYPE ]] && VIRT_TYPE="kvm"
  case $VIRT_TYPE in
    "kvm") COMPUTE_PKG="nova-compute-kvm";;
    "xen") COMPUTE_PKG="nova-compute-xen";;
    "uml") COMPUTE_PKG="nova-compute-uml";;
    "lxc") COMPUTE_PKG="nova-compute-lxc";;
    *) juju-log "ERROR: Unsupported VIRT_TYPE=$VIRT_TYPE";;
  esac
  apt-get -y install python-software-properties || exit 1
  add_ppa
  apt-get update || exit 1
  apt-get -y install $COMPUTE_PKG nova-network || exit 1

  # XXX sudo on the juju sample AMI doesnt function
  # as it should (doesn't include suoders.d/*). do this
  # manually until we can use any AMI
  echo "nova ALL=(ALL) NOPASSWD:ALL" >>/etc/sudoers

  # DISABLED till SSL cert stuff is done (otherwise libvirt wont start)
  # update /etc/default/libvirt-bin to listen on tcp
  # for live migration purposes
  #DEFAULT_OPTS=$(grep "^libvirtd_opts" /etc/default/libvirt-bin | cut -d= -f2)
  #if ! echo $DEFAULT_OPTS | grep '\-l' >/dev/null ; then
  #  juju-log "Updating /etc/default/libvirt-bin"
  #  sed -i "s/\(^libvirtd_opts=\"\)/\1-l /g" /etc/default/libvirt-bin
  #  service libvirt-bin restart
  #fi
  nova_ctl all stop
}

function amqp_joined {
  juju-log "amqp_joined: requesting credentials for $RABBIT_USER"
  echo "amqp_joined: requesting credentials for $RABBIT_USER"
  relation-set username=$RABBIT_USER
  relation-set vhost=$RABBIT_VHOST
}

function amqp_changed {
  RABBIT_HOST=`relation-get private-address`
  RABBIT_PASSWORD=`relation-get password` 
  if [[ -z $RABBIT_HOST ]] || [[ -z $RABBIT_PASSWORD ]] ; then
    echo "amqp_changed: RABBIT_HOST||RABBIT_PASSWORD not set. Peer not ready? Exit 0 and retry"
    exit 0
  fi
  echo "amqp_changed: Setting rabbit config in nova.conf: $RABBIT_HOST $RABBIT_USER $RABBIT_PASSWORD"
  set_or_update rabbit_host $RABBIT_HOST
  set_or_update rabbit_user $RABBIT_USER
  set_or_update rabbit_password $RABBIT_PASSWORD
  set_or_update rabbit_virtual_host $RABBIT_VHOST
  nova_ctl all restart
}

function db_joined {
  # tell mysql provider which database we want. it will create it and give us
  # credentials
  juju-log "db_joined: requesting database access to $NOVA_DB for $DB_USER@`unit-get private-address`"
  relation-set database=$NOVA_DB
  relation-set username=$DB_USER
  relation-set hostname=`unit-get private-address`
}

function db_changed {
  DB_HOST=`relation-get db_host`
  DB_PASSWORD=`relation-get password`
  if [[ -z $DB_HOST ]] || [[ -z $DB_PASSWORD ]] ; then
    echo "db_changed: DB_HOST || DB_PASSWORD not yet set. Exit 0 and retry"
    exit 0
  fi
  echo "db_changed: Configuring nova.conf for access to $NOVA_DB"
  set_or_update sql_connection "mysql://$DB_USER:$DB_PASSWORD@$DB_HOST/$NOVA_DB"
  nova_ctl all restart
  # this works around lp #855971 until (ideally) we can add some functionality
  # to nova/nova-manage to do this for us. reserve the IP of this host in the dhcp
  # pool and assign it to this host
  #DEFAULT_ETH=$(ip route  | grep default | awk '{ print $5 }')
  #IP=$(ifconfig  $DEFAULT_ETH | grep 'inet addr' | awk '{ print $2 }' | cut -d: -f2)
  #apt-get -y install mysql-client
  #mysql -u $DB_USER -h $DB_HOST -p$DB_PASSWORD -e \
  #  "UPDATE fixed_ips SET reserved='1', host='$(hostname)' \
  #     WHERE address='$IP'" $NOVA_DB
}

function nova-network_changed {
  MANAGER=`relation-get network_manager`
  if [[ -z $MANAGER ]] ; then
    echo "nova-network_changed: MANAGER not yet set. Exit 0 and retry"
    exit 0
  fi
  configure_network_manager $MANAGER
  nova_ctl all restart
}

function image-service_changed {
  GLANCE_API_SERVER=`relation-get glance-api-server`
  if [[ -z $GLANCE_API_SERVER ]] ; then
    echo "image-service_changed: GLANCE_API_SERVER not yet set. Exit 0 and retry"
    exit 0
  fi
  set_or_update glance_api_servers $GLANCE_API_SERVER
  nova_ctl all restart
}

case $ARG0 in
  "install") install_hook ;;
  "start"|"stop") exit 0 ;;
  "amqp-relation-joined") amqp_joined ;;
  "amqp-relation-changed") amqp_changed ;;
  "shared-db-relation-joined") db_joined ;;
  "shared-db-relation-changed") db_changed ;;
  "nova-network-relation-joined") exit 0 ;;
  "nova-network-relation-changed") nova-network_changed ;;
  "image-service-relation-joined") exit 0 ;;
  "image-service-relation-changed") image-service_changed ;;
esac