Charm: ~openstack-ubuntu-testing:precise/quantal   Revision: 37   Hook: image-service-relation-changed
#!/bin/bash

FORMULA_DIR=$(dirname $0)
ARG0=${0##*/}

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

function install_hook {
  juju-log "Installing glance packages"
  apt-get -y install python-software-properties || exit 1

  add_ppa

  apt-get update
  # retry after a hash mismatch
  if [[ $? != 0 ]] ; then
    juju-log "WARN: First apt-get update failed, trying again...."
    rm -rf /var/cache/apt/*
    rm -rf /var/lib/apt/lists/*
    sleep 5
    apt-get update
    [[ $? != 0 ]] && juju-log"ERROR: Second attempt to apt-get update FAILED." && exit 1
  fi
  apt-get -y install $PACKAGES || exit 1

  glance_ctl all stop

  # work around LP #784837 until its fixed.
  [[ ! -d /var/log/glance ]] && mkdir /var/log/glance
  chown glance /var/log/glance
  [[ ! -e /var/log/glance/api.log ]] && touch /var/log/glance/api.log
  [[ ! -e /var/log/glance/registry.log ]] && touch /var/log/glance/registry.log
  chown glance /var/log/glance/*.log

  # XXX turn up the logging for now.
  set_or_update verbose True api
  set_or_update debug True api
  set_or_update verbose True registry
  set_or_update debug True registry

  # give ubuntu user passwd-less sudo for log access 
  echo "ubuntu ALL=(ALL) NOPASSWD:ALL" >/etc/sudoers.d/ubuntu-qa
  chmod 0440 /etc/sudoers.d/ubuntu-qa

# remove this out once packaging has been updated. adam 01/23
cat >/etc/glance/policy.json <<END
{
    "default": []
}
END
chmod 755 /etc/glance/policy.json

  # drop version info to be picked up by interested jenkins jobs
  dpkg -l | grep glance | awk '{ print $2","$3 }' > /tmp/versions_tested

}

function db_joined {
  juju-log "glance: db_joined: requesting access to $GLANCE_DB for $DB_USER@`unit-get private-address`"
  relation-set database=$GLANCE_DB
  relation-set username=$DB_USER
  relation-set hostname=`unit-get private-address`
}

function db_changed {
  DB_HOST=`relation-get private-address`
  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
  else
    echo "db_changed: Received password from $DB_HOST"
  fi
  juju-log "glance: db_changed: Configuring registry for access to $GLANCE_DB@$DB_HOST"
  glance_ctl all stop
  set_or_update sql_connection "mysql://$DB_USER:$DB_PASSWORD@$DB_HOST/$GLANCE_DB" registry
  set_or_update sql_connection "mysql://$DB_USER:$DB_PASSWORD@$DB_HOST/$GLANCE_DB" api 
  # Set the db version to 0 if its not under version control. We assume that any existing
  # database we are being related to was created WITH version control.
  if ! glance-manage db_version ; then
    juju-log "Setting glance database version to 0"
    glance-manage version_control 0
  fi
  glance-manage db_sync
  glance_ctl all restart
}

function image-service_joined {
  bind_host=$(cat /etc/glance/glance-api.conf | grep bind_host | cut -d= -f2 | sed -e 's/ //g')
  bind_port=$(cat /etc/glance/glance-api.conf | grep bind_port | cut -d= -f2 | sed -e 's/ //g')
  [[ $bind_host == "0.0.0.0" ]] && bind_host=`unit-get private-address`
  juju-log "glance: image-service_joined: To peer glance-api-server=$bind_host:$bind_port"
  relation-set glance-api-server="$bind_host:$bind_port"
}

function object-store_changed {
  URL=`relation-get url`
  USER=`relation-get user`
  PASSWORD=`relation-get password`
  [[ -z $URL ]] || [[ -z $USER ]] || [[ -z $PASSWORD ]] && \
    echo "URL||USER||PASSWORD not set, peer not ready?" && exit 0
  set_or_update default_store swift api
  set_or_update swift_store_user system:$USER api
  set_or_update swift_store_key $PASSWORD api
  set_or_update swift_store_auth_address $URL api
  set_or_update swift_store_create_container_on_put true api
  glance_ctl glance-api restart
}

function keystone_joined {
  # advertise our API endpoint to keystone
  url="http://$(unit-get private-address):9292/v1"
  relation-set service="glance" \
    region="RegionOne" public_url=$url admin_url=$url internal_url=$url
}

function keystone_changed {
  # we hopefully get a token in return.  configure middleware accordingly
  token=$(relation-get admin_token)
  service_port=$(relation-get service_port)
  auth_port=$(relation-get auth_port)
  service_username=$(relation-get service_username)
  service_password=$(relation-get service_password)
  service_tenant=$(relation-get service_tenant)
  [[ -z "$token" ]] || [[ -z "$service_port" ]] || [[ -z "$auth_port" ]] ||
    [[ -z "$service_username" ]] || [[ -z "$service_password" ]] ||
    [[ -z "$service_tenant" ]] && juju-log "keystone_changed: Peer not ready" &&
      exit 0
  [[ "$token" == "-1" ]] &&
     juju-log "keystone_changed: admin token error" && exit 1
  juju-log "keystone_changed: Acquired admin. token"
  keystone_host=$(relation-get private-address)

  set_paste_deploy_flavor "keystone" "api" || exit 1
  set_paste_deploy_flavor "keystone" "registry" || exit 1

  for i in api-paste registry-paste ; do
    set_or_update "service_host" "$keystone_host" $i
    set_or_update "service_port" "$service_port" $i
    set_or_update "auth_host" "$keystone_host" $i
    set_or_update "auth_port" "$auth_port" $i
    set_or_update "auth_uri" "http://$keystone_host:$service_port/" $i
    set_or_update "admin_token" "$token" $i
    set_or_update "admin_tenant_name" "$service_tenant" $i
    set_or_update "admin_user" "$service_username" $i
    set_or_update "admin_password" "$service_password" $i 
  done 
  glance_ctl all restart
}

case $ARG0 in
  "start"|"stop") glance_ctl all $ARG0 ;;
  "install") install_hook ;;
  "shared-db-relation-joined") db_joined ;;
  "shared-db-relation-changed") db_changed;;
  "image-service-relation-joined") image-service_joined ;;
  "image-service-relation-changed") exit 0 ;;
  "object-store-relation-joined") exit 0 ;;
  "object-store-relation-changed") object-store_changed ;;
  "identity-service-relation-joined") keystone_joined ;;
  "identity-service-relation-changed") keystone_changed ;;
esac