# lib/nova_plugins/hypervisor-docker
# Configure the Docker hypervisor

# Enable with:
#
#   VIRT_DRIVER=docker

# Dependencies:
#
# - ``functions`` file
# - ``nova`` and ``glance`` configurations

# install_nova_hypervisor - install any external requirements
# configure_nova_hypervisor - make configuration changes, including those to other services
# start_nova_hypervisor - start any external services
# stop_nova_hypervisor - stop any external services
# cleanup_nova_hypervisor - remove transient data and cache

# Save trace setting
MY_XTRACE=$(set +o | grep xtrace)
set -o xtrace


# Defaults
# --------

# Set up default repos
NOVA_DOCKER_REPO=${NOVA_DOCKER_REPO:-${GIT_BASE}/openstack/nova-docker.git}
NOVA_DOCKER_BRANCH=${NOVA_DOCKER_BRANCH:-master}

# Set up default directories
DOCKER_DIR=$DEST/nova-docker


DOCKER_UNIX_SOCKET=/var/run/docker.sock
DOCKER_PID_FILE=/var/run/docker.pid
DOCKER_REGISTRY_PORT=${DOCKER_REGISTRY_PORT:-5042}

DOCKER_IMAGE_NAME=${DOCKER_IMAGE_NAME:-cirros}
DOCKER_REGISTRY_IMAGE=${DOCKER_REGISTRY_IMAGE:-registry}
DOCKER_REGISTRY_IMAGE_NAME=registry

DOCKER_APT_REPO=${DOCKER_APT_REPO:-https://apt.dockerproject.org/repo}


# Entry Points
# ------------

# clean_nova_hypervisor - Clean up an installation
function cleanup_nova_hypervisor {
    stop_service docker

    # Clean out work area
    sudo rm -rf /var/lib/docker

    # remove docker bits from nova
    rm $NOVA_DIR/nova/virt/docker
    rm $NOVA_DIR/etc/nova/rootwrap.d/docker.filters
}

# configure_nova_hypervisor - Set config files, create data dirs, etc
function configure_nova_hypervisor {
    iniset $NOVA_CONF DEFAULT compute_driver novadocker.virt.docker.driver.DockerDriver
    iniset $GLANCE_API_CONF DEFAULT container_formats ami,ari,aki,bare,ovf,docker
}

# is_docker_running - Return 0 (true) if Docker is running, otherwise 1
function is_docker_running {
    local docker_pid
    if [ -f "$DOCKER_PID_FILE" ]; then
        docker_pid=$(cat "$DOCKER_PID_FILE")
    fi
    if [[ -z "$docker_pid" ]] || ! ps -p "$docker_pid" | grep [d]ocker; then
        return 1
    fi
    return 0
}

# install_nova_hypervisor() - Install external components
function install_nova_hypervisor {
    setup_develop $DOCKER_DIR
    # TODO : move into configure_nova_hypervisor_rootwrap if
    #        https://review.openstack.org/#/c/84839/ is merged
}

# start_nova_hypervisor - Start any required external services
function start_nova_hypervisor {
    # Make sure Docker is installed
    if ! ( is_package_installed docker || is_package_installed docker-io || is_package_installed docker-engine ) ; then
        die $LINENO "Docker is not installed.  Please run tools/docker/install_docker.sh"
    fi
    if ! (is_docker_running); then
        die $LINENO "Docker not running"
    fi

    # Gather some information
    docker version
    docker -D info

    # push the rootwrap
    sudo cp $DOCKER_DIR/etc/nova/rootwrap.d/docker.filters  /etc/nova/rootwrap.d/docker.filters

    echo "Checking default image for docker..."
    if ! (glance image-show "$DEFAULT_IMAGE_NAME"); then
        echo "Pulling $DOCKER_IMAGE_NAME..."

        # Dance around the image that got renamed
        docker pull ewindisch/$DOCKER_IMAGE_NAME
        docker tag ewindisch/$DOCKER_IMAGE_NAME:latest $DOCKER_IMAGE_NAME

        echo "Saving $DOCKER_IMAGE_NAME to glance..."
        TOKEN=$(openstack token issue -c id -f value)
        docker save $DOCKER_IMAGE_NAME | openstack --os-token $TOKEN --os-url $GLANCE_SERVICE_PROTOCOL://$GLANCE_HOSTPORT image create $DEFAULT_IMAGE_NAME --public --container-format docker --disk-format raw
    fi
}

# stop_nova_hypervisor - Stop any external services
function stop_nova_hypervisor {
    # Stop the docker registry container
    docker stop $DOCKER_REGISTRY_IMAGE_NAME
    docker rm $DOCKER_REGISTRY_IMAGE_NAME
}

# Restore xtrace
$MY_XTRACE

# Local variables:
# mode: shell-script
# End:
