#!/bin/bash
#   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.
#
# start-build is run on a host to start a MDG build
#
# 24 June 2016 -- Jeremy Mordkoff -- Genesis
#              -- Gerardo Garcia


HERE=$(realpath $(dirname $0))
OSM_JENKINS=$(dirname $HERE)
. $OSM_JENKINS/common/all_funcs

[ $# -lt 1 ] && FATAL "arg is MDG name"

export OSM_MDG=$1
shift
OSM_load_config

if [ "$1" = "--build-container" ]; then
    shift
    [ $# -lt 1 ] && FATAL "missing container name with option --build-container"
    export OSM_BUILD_CONTAINER=$1
    shift
fi

if ! container_exists $OSM_BUILD_CONTAINER; then
	CONTAINER_OPTS=""
	[[ "$OSM_BUILD_CONTAINER_PRIVILEGED" == yes ]] && CONTAINER_OPTS="$CONTAINER_OPTS -c security.privileged=true"
	[[ "$OSM_BUILD_CONTAINER_ALLOW_NESTED" == yes ]] && CONTAINER_OPTS="$CONTAINER_OPTS -c security.nesting=true"
	[[ "$OSM_BUILD_CONTAINER_ALLOW_DOCKER" == yes ]] && CONTAINER_OPTS="$CONTAINER_OPTS -p docker -p default"
	create_container $OSM_BASE_IMAGE $OSM_BUILD_CONTAINER $CONTAINER_OPTS
	wait_container_up $OSM_BUILD_CONTAINER
	RE="fedora|fc[0-9]"
	if [[ $OSM_BASE_IMAGE =~ $RE ]]; then
		container_exec $OSM_BUILD_CONTAINER yum -y install git tar make sudo
	else
		container_exec $OSM_BUILD_CONTAINER apt-get -y install git realpath make sudo 
	fi
	if [ ${OSM_USE_LOCAL_DEVOPS:-false} ]; then
		container_push_devops $OSM_BUILD_CONTAINER
	else
		container_exec $OSM_BUILD_CONTAINER git clone ${OSM_GIT_URL}/devops
	fi
else
	if [ ${OSM_USE_LOCAL_DEVOPS:-false} ]; then
		container_push_devops $OSM_BUILD_CONTAINER
	else
		container_exec $OSM_BUILD_CONTAINER git -C devops pull
	fi
fi

container_exec $OSM_BUILD_CONTAINER ./devops/jenkins/$OSM_MDG/start_build $*
RC=$?
INFO "$OSM_MDG build complete. Return code was $RC"
exit $RC

