summaryrefslogtreecommitdiff
path: root/g5k
diff options
context:
space:
mode:
authorLoic Guegan <manzerberdes@gmx.com>2019-04-19 16:46:19 +0200
committerLoic Guegan <manzerberdes@gmx.com>2019-04-19 16:46:19 +0200
commit5720cf71f4ecb5a54719f6957d5ad817bc4c2317 (patch)
tree95cecd8c308dc4d2870e61d8713a05947171f7eb /g5k
parentceabb2d95d3da8fd8ab2761e72430027f2645867 (diff)
Add G5K scripts
Diffstat (limited to 'g5k')
-rwxr-xr-xg5k/clients.py48
-rwxr-xr-xg5k/init-nodes.sh111
-rw-r--r--g5k/setup-mysql.sql8
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'@'%';
+