# This file is meant to be SOURCED
#
#   Copyright 2016 RIFT.IO Inc
#   Copyright 2016 Telefónica Investigación y Desarrollo S.A.U.
#
#   Licensed under the Apache License, Version 2.0 (the "License");
#   you may not use this file except in compliance with the License.
#   You may obtain a copy of the License at
#
#       http://www.apache.org/licenses/LICENSE-2.0
#
#   Unless required by applicable law or agreed to in writing, software
#   distributed under the License is distributed on an "AS IS" BASIS,
#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#   See the License for the specific language governing permissions and
#   limitations under the License.
#
# container_funcs
# 24 June 2016 -- Jeremy Mordkoff -- Genesis
#              -- Gerardo García

container_exists() { 
	if [ $# -ne 1 ]; then
		FATAL "arg is container name"
	fi
	lxc config show $1 >/dev/null 2>&1
	if [ $? -eq 0 ]; then
		DEBUG "container $1 exists"
		return 0
	else
		DEBUG "container $1 not found"
		return 1
	fi
}

create_container() { 
	if [ $# -lt 2 ]; then
		FATAL "args are image container [options]"
	fi
	INFO "creating container $2 using image $1"
	image=$1
	container=$2
	shift 2
	DEBUG "lxc launch $image $container $*"
	lxc launch "$image" "$container" $*
}

container_exec() { 
	container="$1"
	shift
	DEBUG "exec in $container \"$*\""
	lxc exec "$container" -- $*
}

container_exec_stderr() { 
	container="$1"
	shift
	DEBUG "exec in $container \"$*\""
	lxc exec "$container" -- $* 2>&1
}

wait_container_up() {
    [ $# -eq 1 ] || FATAL "arg is container name got $# args - $*"
    RE="200"
    ct=0
    while [ $ct -lt 10 ]; do
        let ct=ct+1
        output=$(container_exec_stderr "$1" curl -sL -w "%{http_code}\\n" "http://www.google.com/" -o /dev/null)
        if [[ $output =~ $RE ]]; then
            DEBUG "$1 is up"
            return
        fi
        INFO "waiting for container $1 to start"
        DEBUG "expected '$RE' in $output"
        sleep 5
    done
    FATAL "container $1 did not start"
}
container_push_tree() { 
    # create a tarball locally, pipe it into the container and unpack it there
	[ $# -eq 3 ] || FATAL "args are container dir_from dir_to (dir_to MUST exist)"
    tar -C "$2" -c . -f - | container_exec $1 tar -C "$3" -x -f -
}

container_push_devops() { 
	[ $# -eq 1 ] || FATAL "arg is container name got $# args - $*"
    container_exec "$1" mkdir -p /root/devops
    container_push_tree "$1" "$(dirname $OSM_JENKINS)" "/root/devops"
}
