mirror of
https://gitlab.com/manzerbredes/paper-lowrate-iot.git
synced 2025-04-17 11:23:00 +00:00
154 lines
6.3 KiB
Bash
Executable file
154 lines
6.3 KiB
Bash
Executable file
#!/bin/bash
|
|
|
|
##### Parameters #####
|
|
if [ -z ${nbSensors+x} ] # If nbSensors exists, so all parameters are already define
|
|
then
|
|
delay=60 # Delay before starting simulation (let CPU energy going down on the server)
|
|
nbSensors=30 # Number of sensors that will send request to de server
|
|
nbSensorsFactor=3 # nbSensors*nbSensorFactor
|
|
simulationTime=300 # Approximative
|
|
sensorsSendInterval=10 # Delay between sensors requests
|
|
vmSize=2048 # Number of alocated ram
|
|
simKey="NONE"
|
|
fi
|
|
nHours=3 # Reservation dutation
|
|
requestPerSensor=$(( simulationTime / sensorsSendInterval )) # Theorical simulation time is $requestPerSensor*$sensorsSendInterval
|
|
######################
|
|
|
|
|
|
logFile="./simLogs.txt"
|
|
log () {
|
|
echo -e "\033[0;34m$@\033[0m"
|
|
}
|
|
|
|
sshWait () {
|
|
log "Waiting for for an ssh connection to a vm ($1)"
|
|
error=255
|
|
until [ $error -eq 0 ]
|
|
do
|
|
ssh -q root@$1 echo "Connected to $(hostname)"
|
|
error=$?
|
|
sleep 4
|
|
done
|
|
}
|
|
|
|
if [ "$1" = "subscribe" ] && [ $# -eq 1 ]
|
|
then
|
|
log "Subscribing..."
|
|
oarsub -l slash_22=1+{"virtual!='NO' AND cluster='nova'"}/nodes=2,walltime=$nHours 'sleep "10d"' # On node send request to the other
|
|
elif [ "$1" = "deploy" ] && [ $# -eq 1 ]
|
|
then
|
|
# Get machine mac address
|
|
serverSubnet=$(g5k-subnets -im|sed "1q;d")
|
|
clientSubnet=$(g5k-subnets -im|sed "2q;d")
|
|
serverMac=$(echo "$serverSubnet"|sed "s/^.*\t//g")
|
|
clientMac=$(echo "$clientSubnet"|sed "s/^.*\t//g")
|
|
serverIp=$(echo "$serverSubnet"|sed "s/\t.*$//g")
|
|
clientIp=$(echo "$clientSubnet"|sed "s/\t.*$//g")
|
|
serverNode=""
|
|
clientNode=""
|
|
|
|
# Run vms
|
|
log "Run vms..."
|
|
isServer=1
|
|
finished=0
|
|
for node in $(cat $OAR_NODE_FILE|uniq)
|
|
do
|
|
# Init vm images
|
|
log "Create $node vm image"
|
|
oarsh $node cp -n /grid5000/virt-images/debian9-x64-base.qcow2 /tmp/
|
|
oarsh $node qemu-img create -f qcow2 -o backing_file=/tmp/debian9-x64-base.qcow2 /tmp/img.qcow2
|
|
sleep 1 # Wait for fun
|
|
|
|
# Build cloud init iso (to have ssh access witouth password
|
|
log "Create $node cloud-init image"
|
|
oarsh $node cp /grid5000/virt-images/cloud-init-example.sh /tmp/
|
|
oarsh $node "cd /tmp && export cloud_init_key=\$(cat ~/.ssh/id_rsa.pub) && ./cloud-init-example.sh"
|
|
oarsh $node "cd /tmp && genisoimage -output cloud-init-data.iso -volid cidata -joliet -rock cloud-init-data/user-data cloud-init-data/meta-data"
|
|
# Refresh loop state
|
|
[ $isServer -eq 1 ] && { curMac=$serverMac; isServer=0; serverNode=$node; } || { curMac=$clientMac; finished=1; clientNode=$node; }
|
|
|
|
# Launch vm
|
|
log "Launch vm $node"
|
|
oarsh $node kvm -m ${vmSize}M -hda /tmp/img.qcow2 -netdev bridge,id=br0 -device virtio-net-pci,netdev=br0,id=nic1,mac=$curMac -cdrom /tmp/cloud-init-data.iso -display none -daemonize &
|
|
|
|
# Stop looping if we finish
|
|
[ $finished -eq 1 ] && break
|
|
done
|
|
|
|
log "Installing mysql on $serverIp"
|
|
serverNodeName=$(echo $serverNode|grep -o ^.*[-][0-9]*) # For logging
|
|
onNode="ssh -q root@$serverIp" # For convenience
|
|
|
|
##### Server #####
|
|
sshWait $serverIp
|
|
# One apt-get update seems to be not enought to get mysql-server
|
|
$onNode "apt-get update && apt-get update"
|
|
$onNode apt-get -y install mysql-server
|
|
# Enable mysql connection from outside
|
|
$onNode sed -i "s/bind-address/#bind-address/g" /etc/mysql/mariadb.conf.d/50-server.cnf
|
|
$onNode systemctl restart mysql
|
|
rsync -avh setup-mysql.sql root@$serverIp:/tmp/
|
|
# Then execute it
|
|
$onNode "mysql < /tmp/setup-mysql.sql"
|
|
|
|
##### Client #####
|
|
$sshWait $clientIp
|
|
onNode="ssh -q root@$clientIp"
|
|
$onNode "apt-get update && apt-get update"
|
|
$onNode apt-get -y install mysql-server
|
|
rsync -avh clients.py root@$clientIp:/tmp/
|
|
|
|
##### Start Simulation #####
|
|
log "Simulation will start in ${delay}s"
|
|
sleep $delay
|
|
simStart=$(date "+%s")
|
|
echo "---------- Simulation (key=${simKey}) start at $simStart ($(date -d @${simStart}))" >> $logFile
|
|
$onNode python /tmp/clients.py $serverIp $nbSensors $nbSensorsFactor $requestPerSensor $sensorsSendInterval
|
|
simEnd=$(date "+%s")
|
|
echo "Simulation parameters: serverNode:$serverNode serverIp:$serverIp serverMac:$serverMac clientNode:$clientNode clientNode:$clientNode clientMac:$clientMac delay:$delay nbSensors:$nbSensors nbSensorsFactor:$nbSensorsFactor requestPerSensors:$requestPerSensor sensorsRequestPerSec:$sensorsRequestPerSec simKey:${simKey} simStart:${simStart} simEnd:${simEnd} duration:$(( simEnd - simStart )) serverNodeName:${serverNodeName} vmSize:${vmSize}" >> $logFile
|
|
echo "./recordEnergy.sh nova $serverNodeName $simStart $simEnd energy_${simKey}_${nbSensors}NS_${vmSize}vmSize_${simStart}_${simEnd}.csv" >> $logFile
|
|
echo -e "---------- Simulation (key=${simKey}) end at ${simEnd} ($(date -d @${simEnd}))\n" >> $logFile
|
|
log "Simulation end ! Please see $logFile for more infos"
|
|
##### End Simulation #####
|
|
|
|
##### Print some infos #####
|
|
log "Network Settings:"
|
|
log " - Server $serverNode, $serverIp, $serverMac"
|
|
log " - Client $clientNode, $clientIp, $clientMac"
|
|
log "Simulation Settings:"
|
|
log " - Simulation delay ${delay}s"
|
|
log " - Number of sensors $(( nbSensors * nbSensorsFactor))"
|
|
log " - Number of request per sensors $requestPerSensor"
|
|
log " - Number of request per seconds on eachsensors $sensorsRequestPerSec"
|
|
|
|
elif [ "$1" = "kill" ] && [ $# -eq 1 ]
|
|
then
|
|
##### Kill all kvm on the subscribed nodes #####
|
|
isServer=1
|
|
finished=0
|
|
for node in $(cat $OAR_NODE_FILE|uniq)
|
|
do
|
|
[ $isServer -eq 1 ] && { curMac=$serverMac; isServer=0; serverNode=$node; } || { curMac=$clientMac; finished=1; clientNode=$node; }
|
|
log "Killing vm on node $node"
|
|
oarsh $node pkill -9 qemu &
|
|
[ $finished -eq 1 ] && break
|
|
done
|
|
elif [ "$1" = "inspect" ] && [ $# -eq 2 ]
|
|
then
|
|
##### Show content of the database #####
|
|
mysql --host="$2" -u user --password="mysql" experiment -e "SELECT * FROM temperature;"
|
|
elif [ "$1" = "flush" ] && [ $# -eq 2 ]
|
|
then
|
|
##### Flush content of the temperature table #####
|
|
log "Cleaning database table..."
|
|
mysql --host="$2" -u user --password="mysql" experiment -e "TRUNCATE TABLE temperature;"
|
|
else
|
|
echo "Usage:"
|
|
echo " - $0 subscribe"
|
|
echo " - $0 deploy"
|
|
echo " - $0 kill"
|
|
echo " - $0 inspect <serverIP>"
|
|
echo " - $0 flush <serverIP>"
|
|
fi
|
|
|