Charm: oneiric/zookeeper   Revision: 12   Hook: quorum-relation-departed
#!/bin/bash

set -e

# By default we install from the main Ubuntu archive.
source=`config-get source`
case $source in
    archive)
        juju-log "Configuring zookeeper using the Ubuntu archive packages..."
        zk_package="zookeeperd"
        zk_service="zookeeper"
        zk_conf="/etc/zookeeper/conf/zoo.cfg"
        zk_myid="/etc/zookeeper/conf/myid"
        zk_install="/etc/init/zookeeper.conf"
        ;;
    dev|testing|stable)
        juju-log "Configuring zookeeper using the Hadoop Ubuntu Team PPA..."
        zk_package="hadoop-zookeeper-server"
        zk_service="hadoop-zookeeper-server"
        zk_conf="/etc/hadoop-zookeeper/conf/zoo.cfg"
        zk_myid="/etc/hadoop-zookeeper/conf/myid"
        zk_install="/etc/init/hadoop-zookeeper-server.conf"
        ;;
    *)
        juju-log "Unsupported source..."
        exit 1
        ;;
esac

base_packages="ntp"
zk_port="`config-get zk-port`"

configure_sources () {
    source=`config-get source`
    case $source in
        archive)
            juju-log "Configuring zookeeper using the Ubuntu archive packages..."
            ;;
        dev|testing|stable)
            juju-log "Configuring zookeeper using the Hadoop Ubuntu Team PPA..."
            add-apt-repository ppa:hadoop-ubuntu/$source
            apt-get update
            ;;
        *)
            juju-log "Unsupported source..."
            exit 1
            ;;
    esac
}

install_zookeeper () {
    juju-log "Installing ZooKeeper..."
    apt-get install -y $zk_package $base_packages
}

configure_zookeeper () {
    juju-log "Purging any standalone configuration..."
    # This is found in the bigtop default configuration
    sed -i "/^server.0/d" $zk_conf
    juju-log "Generating unique ID for this instance..."
    unit_no=`echo $JUJU_UNIT_NAME | cut -d / -f 2`
    echo $unit_no > $zk_myid
    juju-log "Adding this unit to the quorum..."
    hostname=`unit-get private-address`
    # Purge and re-add as required
    sed -i "/^server.${unit_no}/d" $zk_conf
    echo "server.${unit_no}=${hostname}:2888:3888" >> $zk_conf
    # Expose port as required
    open-port $zk_port
}

# Service Control Commands
restart_zookeeper () {
    juju-log "Restarting ZooKeeper"
    service $zk_service status && service $zk_service restart || :
}

start_zookeeper() {
    juju-log "Starting ZooKeeper"
    service $zk_service status || service $zk_service start
}

stop_zookeeper() {
    juju-log "Stopping ZooKeeper"
    service $zk_service stop || :
}

update_quorum() {
    # Purge out existing quorum config to deal with departure of
    # ZK nodes
    sed -i "/^server./d" $zk_conf
    # Add this node back into the list
    juju-log "Adding this unit to the quorum..."
    unit_no=`echo $JUJU_UNIT_NAME | cut -d / -f 2`
    hostname=`unit-get private-address`
    echo "server.${unit_no}=${hostname}:2888:3888" >> $zk_conf
    # Re-create based on current relations
    for member in `relation-list`
    do  
        juju-log "Adding $member to quorum"
        member_id=`echo ${member} | cut -d / -f 2`
        member_hostname=`relation-get private-address ${member}`
        echo "server.${member_id}=${member_hostname}:2888:3888" >> $zk_conf
    done
}

setup_zk_interface() {
    juju-log "Setup ZooKeeper Client"
    relation-set port=$zk_port
}

COMMAND=`basename $0`

case $COMMAND in
    install)
        configure_sources
        install_zookeeper
        configure_zookeeper
        restart_zookeeper
        ;;
    start)
        start_zookeeper
        ;;
    stop)
        stop_zookeeper
        ;;
    quorum-relation-joined)
        ;;
    quorum-relation-changed|quorum-relation-departed)
        update_quorum
        restart_zookeeper
        ;;
    zookeeper-relation-joined)
        setup_zk_interface
        ;;
    upgrade-charm)
        configure_zookeeper
        restart_zookeeper
        ;;
    *)
        juju-log "Command not recognised"
        ;;
esac