diff options
| author | Loic Guegan <manzerberdes@gmx.com> | 2019-04-19 16:46:19 +0200 |
|---|---|---|
| committer | Loic Guegan <manzerberdes@gmx.com> | 2019-04-19 16:46:19 +0200 |
| commit | 5720cf71f4ecb5a54719f6957d5ad817bc4c2317 (patch) | |
| tree | 95cecd8c308dc4d2870e61d8713a05947171f7eb /g5k | |
| parent | ceabb2d95d3da8fd8ab2761e72430027f2645867 (diff) | |
Add G5K scripts
Diffstat (limited to 'g5k')
| -rwxr-xr-x | g5k/clients.py | 48 | ||||
| -rwxr-xr-x | g5k/init-nodes.sh | 111 | ||||
| -rw-r--r-- | g5k/setup-mysql.sql | 8 |
3 files changed, 167 insertions, 0 deletions
diff --git a/g5k/clients.py b/g5k/clients.py new file mode 100755 index 0000000..3f718e0 --- /dev/null +++ b/g5k/clients.py @@ -0,0 +1,48 @@ +#!/usr/bin/python +from __future__ import division +import os,sys,random, time,datetime +from subprocess import Popen + +# Check script argument +if len(sys.argv) != 6: + print("Usage: "+sys.argv[0]+" <mysqlServerIp> <nbSensors> <nbSensorsFactor> <requestPerSensor> <sensorsRequestPerSec>") + exit(1) + +# Init script parameters +serverIp=sys.argv[1] +nbSensors=int(sys.argv[2]) +nbSensorsFactor=int(sys.argv[3]) +effectiveNbSensors=nbSensors*nbSensorsFactor +requestPerSensor=int(sys.argv[4]) +frequency=int(sys.argv[5]) +avgSiteTemp=list() +for i in range(0,effectiveNbSensors): + avgSiteTemp.append(random.randint(-10,30)) + + +def insert(sensorId, value): + """ Send value of sensorId into the database """ + stamp=int(time.mktime(datetime.datetime.today().timetuple())) + insertCMD = "mysql -u user --password=mysql --host="+serverIp+" experiment -e" + insertCMD=insertCMD.split() + insertCMD.append("INSERT INTO temperature (id,stamp,val) VALUES("+str(sensorId)+","+str(stamp)+","+str(value)+");") + Popen(insertCMD) # Run command asynchronously + +def send(): + """ Send temperature of each sensors into the database """ + for i in range(0,effectiveNbSensors): + insert(i,random.gauss(avgSiteTemp[i], 3)) + + +# Print infos +print("Launching clients with:") +print(" - Mysql Server IP {:>20}".format(serverIp)) +print(" - Number of sensors {:>18}".format(effectiveNbSensors)) +print(" - Number of request per sensor {:>7}".format(effectiveNbSensors)) + +# Send data +for i in range(0, requestPerSensor): + send() + time.sleep(1/frequency) # We assume send() take no time + + diff --git a/g5k/init-nodes.sh b/g5k/init-nodes.sh new file mode 100755 index 0000000..17335f6 --- /dev/null +++ b/g5k/init-nodes.sh @@ -0,0 +1,111 @@ +#!/bin/bash + +##### Parameters ##### +delay=60 # Delay before starting simulation (let CPU energy going down on the server) +nbSensors=30 +nbSensorsFactor=3 +requestPerSensor=10 # Theorical simulation time is $requestPerSensor/$sensorsRequestPerSec +sensorsRequestPerSec=10 # Number of request per seconds +###################### + + +logFile="./simLogs.txt" +log () { + echo -e "\033[0;34m$@\033[0m" +} + + +if [ "$1" = "subscribe" ] && [ $# -eq 1 ] +then + # Subscribe + log "Subscribing..." + oarsub -l slash_22=1+{"virtual!='NO'"}/nodes=2 'sleep "10d"' +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 + + 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 && sed -i \"s/public-keys/ssh_authorized_keys/g\" cloud-init-data/meta-data" + oarsh $node "cd /tmp && genisoimage -output cloud-init-data.iso -volid cidata -joliet -rock cloud-init-data/user-data cloud-init-data/meta-data" + + [ $isServer -eq 1 ] && { curMac=$serverMac; isServer=0; serverNode=$node; } || { curMac=$clientMac; finished=1; clientNode=$node; } + log "Launch vm $node" + oarsh $node kvm -m 2048 -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 & + [ $finished -eq 1 ] && break + done + + log "Installing mysql on $serverIp" + onNode="ssh -q root@$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" + + # Switch to client + 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 + echo "Simulation start at " $(date "+%s") >> $logFile + $onNode python /tmp/clients.py $serverIp $nbSensors $nbSensorsFactor $requestPerSensor $sensorsRequestPerSec + echo "Simulation end at " $(date "+%s") >> $logFile + ##### End Simulation ##### + + log "Network Settings:" + log " - Server $serverIp $serverMac" + log " - Client $clientIp $clientMac" +elif [ "$1" = "kill" ] && [ $# -eq 1 ] +then + 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 + mysql --host="$2" -u user --password="mysql" experiment -e "SELECT * FROM temperature;" +elif [ "$1" = "flush" ] && [ $# -eq 2 ] +then + mysql --host="$2" -u user --password="mysql" experiment -e "TRUNCATE TABLE temperature;" +else + echo "Usage:" + echo " - $0 subscribe" + echo " - $0 deploy" +fi + diff --git a/g5k/setup-mysql.sql b/g5k/setup-mysql.sql new file mode 100644 index 0000000..05042a3 --- /dev/null +++ b/g5k/setup-mysql.sql @@ -0,0 +1,8 @@ +create DATABASE IF NOT EXISTS experiment; +use experiment; +create TABLE IF NOT EXISTS temperature (id INTEGER,stamp INTEGER, val INTEGER); + +use mysql; +CREATE USER 'user'@'%' IDENTIFIED BY 'mysql'; +GRANT ALL ON experiment.* TO 'user'@'%'; + |
