summaryrefslogtreecommitdiff
path: root/g5k/init-nodes.sh
blob: 3258edb1403783df45c230a76984ab3ad9269db4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
#!/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