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
|