-
Michael Boniface authoredMichael Boniface authored
fixture.sh 6.33 KiB
#!/bin/bash
usage() {
echo "Usage: $0 create|start|stop|destroy [-f config_file] [-r repo_root] [-c service_name]" 1>&2
exit 1
}
create() {
service_name=$1
config_file=$2
repo_root=$3
if ! lxc-info -n ${service_name}; then
# create a container with a static ip address
echo "Creating container: ${service_name}"
SERVICE=$(jq --arg NAME ${service_name} '.[] | select(.name==$NAME)' ${config_file})
echo $SERVICE
ip=$(echo $SERVICE | jq -r '.ip_address')
echo "dhcp-host=${service_name},${ip}" >> /etc/lxc/dnsmasq.conf
service lxc-net restart
lxc-create -t download -n ${service_name} -- --dist ubuntu --release xenial --arch amd64
# copy flame clmc files into the root container
echo "Copying files to rootfs"
container_dir="/var/lib/lxc/"${service_name}"/rootfs"
container_vagrant_dir=${container_dir}"/vagrant"
mkdir -p ${container_vagrant_dir}
cp -f ${repo_root}/reporc "${container_vagrant_dir}"
cp -rf ${repo_root}/scripts ${container_vagrant_dir}
cp -rf ${repo_root}/src ${container_vagrant_dir}
# start the container
echo "Starting: ${service_name}"
lxc-start -n ${service_name}
echo "Waiting for container to start: ${service_name}"
STARTED="0"
while [ "$STARTED" == "0" ]; do STARTED=$(lxc-info -n ${service_name} -i | wc -l); done;
# provision software into each container
echo "Provisioning: ${service_name}"
if [ ${service_name} == "clmc-service" ]
then
influxdb_url=$(echo $SERVICE | jq -r '.influxdb_url')
database_name=$(echo $SERVICE | jq -r '.database_name')
report_period=$(echo $SERVICE | jq -r '.report_period')
cmd="/vagrant/scripts/clmc-service/install.sh ${influxdb_url} ${database_name} ${report_period}"
lxc-attach -n ${service_name} -v REPO_ROOT="/vagrant" -- ${cmd}
elif [ ${service_name} == "test-runner" ]
then
cmd=/vagrant/src/test/clmctest/services/pytest/install.sh
lxc-attach -n ${service_name} -- ${cmd}
else
# get container parameters
location=$(echo $SERVICE | jq -r '.location')
sf_id=$(echo $SERVICE | jq -r '.sf_id')
sf_id_instance=$(echo $SERVICE | jq -r '.sf_id_instance')
sfc_id=$(echo $SERVICE | jq -r '.sfc_id')
sfc_id_instance=$(echo $SERVICE | jq -r '.sfc_id_instance')
sr_id=$(echo $SERVICE | jq -r '.sr_id')
ipendpoint_id=$(echo $SERVICE | jq -r '.ipendpoint_id')
influxdb_url=$(echo $SERVICE | jq -r '.influxdb_url')
database_name=$(echo $SERVICE | jq -r '.database_name')
# install service function specific software
cmd=/vagrant/src/test/clmctest/services/${sf_id}/install.sh
lxc-attach -n ${service_name} -v REPO_ROOT="/vagrant" -- ${cmd}
# install telegraf
cmd=/vagrant/scripts/clmc-agent/install.sh
lxc-attach -n ${service_name} -v REPO_ROOT="/vagrant" -- ${cmd}
# copy telegraf configuration templates
cp -f ${repo_root}/scripts/clmc-agent/telegraf.conf ${container_dir}/etc/telegraf/
cp -f ${repo_root}/scripts/clmc-agent/telegraf_output.conf ${container_dir}/etc/telegraf/telegraf.d/
cp ${repo_root}/src/test/clmctest/services/${sf_id}/telegraf_${sf_id}.conf ${container_dir}/etc/telegraf/telegraf.d/
# replace telegraf template with container parameters
# @todo do we really need both scripts to do this?
cmd=/vagrant/scripts/clmc-agent/configure_template.sh
lxc-attach -n ${service_name} -- ${cmd}
cmd="/vagrant/scripts/clmc-agent/configure.sh ${location} ${sfc_id} ${sfc_id_instance} ${sf_id} ${sf_id_instance} ${ipendpoint_id} ${sr_id} ${influxdb_url} ${database_name}"
lxc-attach -n ${service_name} -- ${cmd}
# start telegraf
lxc-attach -n ${service_name} -- service telegraf restart
fi
fi
}
start() {
service_name=$1
if lxc-info -n ${service_name}; then
echo "Starting container: ${service_name}"
lxc-start -n ${service_name}
fi
}
stop() {
service_name=$1
if lxc-info -n ${service_name}; then
echo "Stopping container: ${service_name}"
lxc-stop -n ${service_name}
fi
}
destroy() {
service_name=$1
config_file=$2
if lxc-info -n ${service_name}; then
echo "Stopping container: ${service_name}"
lxc-stop -n ${service_name}
echo "Destroying container: ${service_name}"
lxc-destroy -n ${service_name}
ip=$(jq -r --arg NAME ${service_name} '.[] | select(.name==$NAME) | .ip_address' ${config_file})
sed -i "/dhcp-host=${service_name},/d" /etc/lxc/dnsmasq.conf
fi
}
# inc option index by 1 as first argument is the command and not parsed by getopts
if [ $# -gt 1 ]; then
OPTIND=$((OPTIND+1))
fi
repo_root="/vagrant"
config_file="rspec.json"
# collect the optional arguments
while getopts "hf:r:c:" opt; do
case $opt in
h) usage; exit ;;
f) config_file=${OPTARG} ;;
r) repo_root=${OPTARG} ;;
c) container=${OPTARG} ;;
\?) usage ;;
esac
done
# check configuration file exists
if [ ! -f ${config_file} ]; then
echo "Configuration file does not exist: ${config_file}" >&2
usage
exit 1
fi
# check repo root directory exists
if [ ! -d ${repo_root} ]; then
echo "Repo root directory does not exist: ${repo_root}" >&2
usage
exit 1
fi
# iterate of list of services in configuration file
command=$1
service_names=$(jq -r '.[].name' ${config_file})
for service_name in $service_names; do
# if all or specific container
if [ -z ${container} ] || [ ${container} == ${service_name} ]; then
case "${command}" in
create)
create ${service_name} ${config_file} ${repo_root}
;;
start)
start ${service_name} ${config_file} ${repo_root}
;;
stop)
stop ${service_name} ${config_file} ${repo_root}
;;
destroy)
destroy ${service_name} ${config_file} ${repo_root}
;;
*)
usage
;;
esac
fi
done