# This file is meant to be SOURCED
#
#   Copyright 2016 RIFT.IO Inc
#
#   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

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 [ $# -ne 2 ]; then
		FATAL "args are image container"
	fi
	INFO "creating container $2 using image $1"
	DEBUG "lxc launch $1 $2"
	lxc launch "$1" "$2"
}

create_privileged_container() {
	if [ $# -ne 2 ]; then
		FATAL "args are image container"
	fi
	INFO "creating container $2 using image $1"
	DEBUG "lxc launch $1 $2"
	lxc launch "$1" "$2" -c security.privileged=true
}

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 - $*"
	ct=0
	RE="1 received"
	while [ $ct -lt 60 ]; do
		let ct=ct+1
		output=$(container_exec_stderr "$1" ping -c 1 google.com)
		if [[ $output =~ $RE ]]; then	
			DEBUG "$1 is up"
			return
		fi
		INFO "waiting for container $1 to start"
		DEBUG "expected '$RE' in $output"
		sleep 1
	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"
}
