#!/bin/bash
# -----------------------------------------------------------------------------
# Copyright (c) 2010 - RZ Uni FR
# Copyright (c) 2010 - OpenSLX GmbH
#
# This program is free software distributed under the GPL version 2.
# See http://openslx.org/COPYING
#
# If you have any feedback please consult http://openslx.org/feedback and
# send your suggestions, praise, or complaints to feedback@openslx.org
#
# General information about OpenSLX can be found at http://openslx.org/
# -----------------------------------------------------------------------------
# vmgrid
# - Script for autostarts defined in vmgrid::startvms
################################################################################
# include default directories
. /etc/opt/openslx/openslx.conf
################################################################################
### Manual Start
################################################################################
if [ -n "$1" ]; then
if [ "$1" = "-h" ] || [ "$1" = "--help" ]; then
echo -e "Usage: vmgrid [[-g] [--mem <memory size in MB>] \c"
echo -e "[--nice <nice level>] [/path/]filename[.xml]]"
exit 0
else
echo "Starting run-vmgrid.sh with options '$@'"
run-vmgrid.sh $@ 2>/dev/null
exit
fi
fi
################################################################################
### Define default dirs / get configs
################################################################################
PLUGINCONFROOT=${OPENSLX_DEFAULT_CONFDIR}/plugins
PLUGINCONFDIR=${PLUGINCONFROOT}/vmgrid
RWSHARE=/var/opt/openslx/plugins/vmgrid/share
# include general configuration from vmgrid
[ -f ${PLUGINCONFDIR}/vmgrid.conf ] && \
. ${PLUGINCONFDIR}/vmgrid.conf
# load general virtualization information
[ -f ${PLUGINCONFROOT}/virtualization/virtualization.conf ] && \
. ${PLUGINCONFROOT}/virtualization/virtualization.conf
################################################################################
### Functions used throughout the script
################################################################################
# function to write to stdout and logfile
writelog () {
# write to stdout
echo -e "$1"
# log into file
echo -e "$1" >> ${OPENSLX_DEFAULT_LOGDIR}/vmgrid.${USER}.$$.log
# log into share dir, so that log is available in vm as well
echo -e "$1" >> ${vmgrid_rwmnt}/logs/vmgrid.${USER}.$$.log
}
################################################################################
### Configure VMs for autostart and set RAM
################################################################################
# start to log, create share log dir
mkdir -m 1777 -p ${vmgrid_rwmnt}/logs
mkdir -m 1777 -p /tmp/vmgrid
mkdir -p /tmp/vmgrid/${USER}
echo "Starting to log at $(date)" \
>${vmgrid_rwmnt}/logs/vmgrid.${USER}.$$.log
if [ -z "${hostratio}" ]; then
writelog "There has been an error in the memory configuration in stage 3"
writelog "Please check your memory ratio settings, exiting!"
exit 1
fi
if [ -z "${hostratio}" ]; then
writelog "There has been an error in the memory configuration in stage 3"
writelog "Please check your memory ratio settings, exiting!"
exit 1
fi
# remove blanks
vmgrid_startvms=$(echo ${vmgrid_startvms} | sed -e "s, *,,g")
vmgrid_memratio=$(echo ${vmgrid_memratio} | sed -e "s, *,,g")
# hostmem, mainvirt from virtualization plugin
# ratio minus other vms and host
restratio=$(expr 100 - ${hostratio} - ${mainvirtratio})
# hostmem, totalmem, mainvirtmem from virtualization plugin
# calculate freemem
freemem=$(expr ${totalmem} - ${hostmem} - ${mainvirtmem} 2>/dev/null)
if [ ${freemem} -lt 512 2>/dev/null ]; then
writelog "Not enough free RAM for this plugin, free: ${freemem} MB"
exit 1
fi
# get clients mem ratio
vmsumratios=0
for i in {1..4}; do
vm[$i]=$(echo ${vmgrid_startvms} | awk -F ',' '{print $1}')
# remove ${vm[$i]} from list because of '{print $1}'
vmgrid_startvms=$(echo ${vmgrid_startvms} | sed -e "s,${vm[$i]}\,*,,")
vmratio[$i]=$(echo ${vmgrid_memratio} | awk -F ',' '{print $1}')
# remove ${vmratio[$i]} from list because of '{print $1}'
vmgrid_memratio=$(echo ${vmgrid_memratio} | sed -e "s/${vmratio[$i]},*//")
vmsumratios=$(expr ${vmsumratios} + ${vmratio[$i]} 2>/dev/null)
done
for i in {1..4}; do
# calculate VMs mem: mem = $freemem * $vmratio/100 * 100/$restratio
# multiple of 4
vmmem[$i]=$(expr ${freemem} \* ${vmratio[$i]} / ${restratio} / 4 \* 4 \
2>/dev/null)
if [ -n "${vm[$i]}" ] && [ ${vmmem[$i]} -lt 512 2>/dev/null ]; then
writelog "Not enough free RAM for ${vm[$i]} (min. 512 MB), \c"
writelog "free: ${vmmem[$i]} MB"
unset vm[$i]
fi
done
################################################################################
### Start the VMs
################################################################################
# start vms
for i in {1..4}; do
if [ -n "${vm[$i]}" ]; then
alreadyrunning=$(ps aux | grep run-vmgrid.sh | grep -v grep \
| grep "${vm[$i]}" | wc -l)
# if Xen use different method
if [ "${vmgrid_virt}" = "xen" ]; then
alreadyrunning=$(xm list 2>/dev/null | grep -vE "Domain-0|Name.*ID" \
| grep "${vm[$i]}-0.$" | wc -l)
fi
if [ ${alreadyrunning} -gt 0 2>/dev/null ]; then
writelog "${vm[$i]} already running, skipping!"
else
writelog "Starting ${vm[$i]} via run-vmgrid.sh with ${vmmem[$i]} MB RAM"
run-vmgrid.sh --mem ${vmmem[$i]} ${vm[$i]} 2>/dev/null &
echo $! > /tmp/vmgrid/${USER}/vmgrid.pids
# wait 10 secs for the next vm to start
sleep 10
fi
fi
done
exit 0