Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
there is no windows on travis anyway
[simgrid.git] / examples / platforms / generation_scripts / generate_g5k_platform_cabinets.pl
1 #!/usr/bin/perl -w
2
3 # Copyright (c) 2011, 2014. The SimGrid Team.
4 # All rights reserved.
5
6 # This program is free software; you can redistribute it and/or modify it
7 # under the terms of the license (GNU LGPL) which comes with this package.
8
9 use strict;
10 use Switch;
11
12 my $site="";
13 my $cluster="";
14 my $toversion=3;
15 my $line;
16 my $uid="";
17 my $i=0;
18 my @AS_route = ();
19
20 if($#ARGV!=1) {
21     die "Usage: ./generate_g5k_platform.pl g5k_username g5k_password\n";
22 }
23
24 print "<?xml version='1.0'?>\n";
25 print "<!DOCTYPE platform SYSTEM \"http://simgrid.gforge.inria.fr/simgrid.dtd\">\n";
26 print "<platform version=\"$toversion\">\n";
27 print "\t<AS id=\"AS_grid5000\" routing=\"Floyd\" >\n";
28
29 print "\t\t<AS id=\"AS_interne\" routing=\"Floyd\">\n";
30 printf "\t\t\t<router id=\"lille\"/>\n";
31 printf "\t\t\t<router id=\"paris\"/>\n";
32 printf "\t\t\t<router id=\"nancy\"/>\n";
33 printf "\t\t\t<router id=\"rennes\"/>\n";
34 printf "\t\t\t<router id=\"lyon\"/>\n";
35 printf "\t\t\t<router id=\"bordeaux\"/>\n";
36 printf "\t\t\t<router id=\"grenoble\"/>\n";
37 printf "\t\t\t<router id=\"marseille\"/>\n";
38 printf "\t\t\t<router id=\"toulouse\"/>\n";
39 printf "\t\t\t<router id=\"sophia\"/>\n";
40 #printf "\t\t\t<router id=\"luxembourg\">\n";
41 print "\n";
42 printf "\t\t\t<link id=\"Lille_Paris\"        bandwidth=\"1.25E9\" latency=\"1.0E-4\"/>\n";
43 printf "\t\t\t<link id=\"Paris_Nancy\"        bandwidth=\"1.25E9\" latency=\"1.0E-4\"/>\n";
44 printf "\t\t\t<link id=\"Paris_Rennes\"       bandwidth=\"1.25E9\" latency=\"1.0E-4\"/>\n";
45 printf "\t\t\t<link id=\"Paris_Lyon\"         bandwidth=\"1.25E9\" latency=\"1.0E-4\"/>\n";
46 printf "\t\t\t<link id=\"Bordeaux_Lyon\"      bandwidth=\"1.25E9\" latency=\"1.0E-4\"/>\n";
47 printf "\t\t\t<link id=\"Lyon_Grenoble\"      bandwidth=\"1.25E9\" latency=\"1.0E-4\"/>\n";
48 printf "\t\t\t<link id=\"Lyon_Marseille\"     bandwidth=\"1.25E9\" latency=\"1.0E-4\"/>\n";
49 printf "\t\t\t<link id=\"Marseille_Sophia\"   bandwidth=\"1.25E9\" latency=\"1.0E-4\"/>\n";
50 printf "\t\t\t<link id=\"Marseille_Toulouse\" bandwidth=\"1.25E9\" latency=\"1.0E-4\"/>\n";
51 #printf "\t\t<link id=\"Luxemburg_Nancy\"    bandwidth=\"1.25E9\" latency=\"1.0E-4\"/>\n";
52 print "\n";
53
54 print "\t\t<route src=\"lille\"     dst=\"paris\"     ><link_ctn id=\"Lille_Paris\"/></route>\n";
55 print "\t\t<route src=\"paris\"     dst=\"nancy\"     ><link_ctn id=\"Paris_Nancy\"/></route>\n";
56 print "\t\t<route src=\"paris\"     dst=\"rennes\"    ><link_ctn id=\"Paris_Rennes\"/></route>\n";
57 print "\t\t<route src=\"paris\"     dst=\"lyon\"      ><link_ctn id=\"Paris_Lyon\"/></route>\n";
58 print "\t\t<route src=\"bordeaux\"  dst=\"lyon\"      ><link_ctn id=\"Bordeaux_Lyon\"/></route>\n";
59 print "\t\t<route src=\"lyon\"      dst=\"grenoble\"  ><link_ctn id=\"Lyon_Grenoble\"/></route>\n";
60 print "\t\t<route src=\"lyon\"      dst=\"marseille\" ><link_ctn id=\"Lyon_Marseille\"/></route>\n";
61 print "\t\t<route src=\"marseille\" dst=\"sophia\"    ><link_ctn id=\"Marseille_Sophia\"/></route>\n";
62 print "\t\t<route src=\"marseille\" dst=\"toulouse\"  ><link_ctn id=\"Marseille_Toulouse\"/></route>\n";
63 #print "\t\t<route src=\"Luxemburg\" dst=\"Nancy\"     ><link_ctn id=\"Luxemburg_Nancy\"/></route>\n";
64 print "\t\t</AS>\n"; 
65   
66 `wget https://api.grid5000.fr/2.0/grid5000/sites --http-user="$ARGV[0]" --http-password="$ARGV[1]" --no-check-certificate --quiet`;
67 open SITES_LIGNE, 'sites' or die "Unable to open sites $!\n";
68 while(defined($line=<SITES_LIGNE>))
69 {
70         if($line =~ /"uid": "(.*)",/){
71                 $site = $1;
72                 print "\t\t<AS id=\"AS_$site\" routing=\"RuleBased\" >\n";
73         
74                 `wget https://api.grid5000.fr/2.0/grid5000/sites/$site/clusters --http-user="$ARGV[0]" --http-password="$ARGV[1]" --no-check-certificate --quiet`;
75                 open CLUSTERS_LIGNE, 'clusters' or die "Unable to open clusters $!\n";
76                 while(defined($line=<CLUSTERS_LIGNE>))
77                 {
78                         if($line =~ /"uid": "(.*)",/){
79                                 $cluster = $1;
80                                 &get_switch($site, $cluster);                   
81                         }
82                 }
83
84                 close CLUSTERS_LIGNE;
85                 `rm clusters`;
86                 
87                 print "\t\t\t<AS id=\"gw_AS_$site\" routing=\"Full\">\n";
88                 print "\t\t\t\t<router id=\"gw_$site\"/>\n";
89                 print "\t\t\t</AS>\n";
90                 print "\t\t\t<link   id=\"link_gw_$site\" bandwidth=\"1.25E9\" latency=\"1.0E-4\"/>\n";
91                 print "\n";
92                 
93                 print "\t\t\t<ASroute src=\"^AS_(.*)\$\" dst=\"^AS_(.*)\$\"\n";
94                 print "\t\t\t\tgw_src=\"\$1src-AS_\$1src_router.$site.grid5000.fr\"\n";
95                 print "\t\t\t\tgw_dst=\"\$1dst-AS_\$1dst_router.$site.grid5000.fr\"\n";
96                 print "\t\t\t\tsymmetrical=\"YES\">\n";
97                 print "\t\t\t\t\t<link_ctn id=\"link_\$1src\"/>\n";
98                 print "\t\t\t\t\t<link_ctn id=\"link_\$1dst\"/>\n";
99                 print "\t\t\t</ASroute>\n\n"; 
100
101                 print "\t\t\t<ASroute src=\"^AS_(.*)\$\" dst=\"^gw_AS_(.*)\$\"\n";
102                 print "\t\t\t\tgw_src=\"\$1src-AS_\$1src_router.$site.grid5000.fr\"\n";
103                 print "\t\t\t\tgw_dst=\"gw_\$1dst\"\n";
104                 print "\t\t\t\tsymmetrical=\"NO\">\n";
105                 print "\t\t\t\t\t<link_ctn id=\"link_\$1src\"/>\n";
106                 print "\t\t\t</ASroute>\n\n"; 
107                 
108                 print "\t\t\t<ASroute src=\"^gw_AS_(.*)\$\" dst=\"^AS_(.*)\$\"\n";
109                 print "\t\t\t\tgw_src=\"gw_\$1src\"\n";
110                 print "\t\t\t\tgw_dst=\"\$1dst-AS_\$1dst_router.$site.grid5000.fr\"\n";
111                 print "\t\t\t\tsymmetrical=\"NO\">\n";
112                 print "\t\t\t\t\t<link_ctn id=\"link_\$1dst\"/>\n";
113                 print "\t\t\t</ASroute>\n\n"; 
114
115                 print "\t\t</AS>\n";
116                 
117                 push @AS_route, $site;
118         }
119 }
120 close SITES_LIGNE;
121 `rm sites`;
122
123 printf "\n";
124
125 while(@AS_route)
126 {
127         $site = pop @AS_route;
128         print "\t\t<ASroute src=\"AS_$site\" dst=\"AS_interne\" gw_src=\"gw_$site\"";
129         if( $site =~ /^orsay$/ )
130         {
131                 print " gw_dst=\"paris\"";
132         }
133         else
134         {
135                 print " gw_dst=\"$site\"";
136         }
137         print " symmetrical=\"YES\">\n";
138         print "\t\t\t<link_ctn id=\"link_gw_$site\"/>\n";
139         print "\t\t</ASroute>\n";
140 }
141
142 print "\t</AS>\n";
143 print "</platform>\n";
144
145 sub get_switch {
146         my $total;
147         my $switch="";
148         my @switch_list=();
149
150         my @host=();
151         my @host_switch=();
152         $site="$_[0]";
153         $cluster="$_[1]";
154         `wget https://api.grid5000.fr/2.0/grid5000/sites/$site/clusters/$cluster/nodes --http-user="$ARGV[0]" --http-password="$ARGV[1]" --no-check-certificate --quiet`;
155         open NODES_LIGNE, 'nodes' or die "Unable to open nodes $!\n";
156         while(defined($line=<NODES_LIGNE>))
157         {
158                 if($line =~ /"uid": "(.*)",/)
159                 {
160                         $uid = $1;
161                         push(@host, $1);        
162                 }
163                 if($line =~ /"total": (.*),/){
164                         $total = $1;
165                 }
166                 if($line =~ /"switch": "(.*)",/ && !$switch)
167                 {
168                         $switch = "$1"; 
169                         push(@host_switch, $1);
170                 }
171                 if( $uid && $switch )
172                 {
173                         push(@switch_list, $switch);    
174                         $uid="";        
175                         $switch="";     
176                 }
177         }
178         close NODES_LIGNE;
179         `rm nodes`;
180
181         my %count;
182         my @uniq_array = grep { ++$count{$_} < 2 } @switch_list;
183         @uniq_array = sort (@uniq_array);
184         if(@switch_list && @uniq_array != 1){
185
186                 if(@switch_list != @host){
187                         printf "Take care \@host != of \@switch_list\n";
188                 }               
189                 
190                 print "\t\t\t<AS id=\"AS_$cluster\" routing=\"RuleBased\" >\n";
191
192                 my @num=();
193                 my $radical;
194                 foreach(@uniq_array){
195                         $switch = $_;
196                         $i=0;
197                         @num=();
198                         foreach(@host_switch){
199                                 if($_ =~ $switch){
200                                         if($host[$i] =~ /$cluster-(.*)/){
201                                                 push(@num, $1);
202                                         }       
203                                 }
204                                 $i++;
205                         }
206         
207                         my $deb;
208                         my $fin;
209                         @num=sort {$a <=> $b} (@num);
210                         $radical = "";
211         
212                         $i=0;
213                         foreach(@num){  
214                                 if($i == 0){
215                                 $deb = $num[$i];
216                                 $fin = $num[$i];
217                                 }
218                                 else{
219                                         if($num[$i] == ($num[$i-1]+1) )
220                                         {
221                                                 $fin = $num[$i];
222                                                 if(@num == ($i+1)){
223                                                         if($deb != $fin)
224                                                         {
225                                                                 if(!($radical =~ /^$/))
226                                                                 {
227                                                                         $radical = $radical.";";
228                                                                 }
229                                                                 $radical = $radical.$deb."-".$fin;
230                                                                 $deb = $num[$i];
231                                                                 $fin = $num[$i];
232                                                         }
233                                                         else
234                                                         {
235                                                                 $radical=$radical.";".$num[$i];
236                                                         }                               
237                                                 }
238                                         }
239                                         else
240                                         {
241                                                 if($deb != $fin)
242                                                 {
243                                                         if(!($radical =~ /^$/))
244                                                         {
245                                                                 $radical = $radical.",";
246                                                         }
247                                                         $radical = $radical.$deb."-".$fin;
248                                                         $deb = $num[$i];
249                                                         $fin = $num[$i];
250                                                 }
251                                                 else
252                                                 {
253                                                         $radical=$radical.",".$num[$i];
254                                                 }
255                         
256                                         }
257                                 }
258                                 $i++;
259                         }
260                         print "\t\t\t\t<cluster id=\"AS_$switch\" prefix=\"$cluster-\" suffix=\".$site.grid5000.fr\"\n";
261                         print "\t\t\t\t\tradical=\"$radical\" power=\"";
262                         &get_gflops($cluster);
263                         print "\" bw=\"1.25E8\" lat=\"1.0E-4\""."\n";
264                         print "\t\t\t\t\tbb_bw=\"1.25E9\" bb_lat=\"1.0E-4\"></cluster>\n";
265                 }
266                 
267                 print "\n\t\t\t\t<AS id=\"gw_AS_$cluster\" routing=\"Full\">\n";
268                 print "\t\t\t\t\t<router id=\"".$cluster."-AS_".$cluster."_router.".$site.".grid5000.fr\"/>\n";
269                 print "\t\t\t\t</AS>\n";
270                 
271                 print "\t\t\t\t<link id=\"switch-$cluster\" bandwidth=\"1250000000\" latency=\"5E-4\"/>\n\n";
272         
273         print "\t\t\t\t<ASroute src=\"^AS_(.*)\$\" dst=\"^AS_(.*)\$\"\n";
274                 print "\t\t\t\t gw_src=\"$cluster-AS_\$1src_router.$site.grid5000.fr\"\n";
275                 print "\t\t\t\t gw_dst=\"$cluster-AS_\$1dst_router.$site.grid5000.fr\">\n";
276                 print "\t\t\t\t\t<link_ctn id=\"switch-$cluster\"/>\n";
277         print "\t\t\t\t</ASroute>\n";
278         
279         print "\t\t\t\t<ASroute src=\"^AS_(.*)\$\" dst=\"^gw_AS_(.*)\$\"\n";
280                 print "\t\t\t\t gw_src=\"$cluster-AS_\$1src_router.$site.grid5000.fr\"\n";
281                 print "\t\t\t\t gw_dst=\"".$cluster."-AS_".$cluster."_router.".$site.".grid5000.fr\">\n";
282                 print "\t\t\t\t\t<link_ctn id=\"switch-$cluster\"/>\n";
283         print "\t\t\t\t</ASroute>\n";
284         
285         print "\t\t\t\t<ASroute src=\"^gw_AS_(.*)\$\" dst=\"^AS_(.*)\$\"\n";
286                 print "\t\t\t\t gw_src=\"".$cluster."-AS_".$cluster."_router.".$site.".grid5000.fr\"\n";
287                 print "\t\t\t\t gw_dst=\"$cluster-AS_\$1dst_router.$site.grid5000.fr\">\n";
288                 print "\t\t\t\t\t<link_ctn id=\"switch-$cluster\"/>\n";
289         print "\t\t\t\t</ASroute>\n";
290         
291         
292                 print "\t\t\t</AS>\n";
293                 
294                         
295         }
296         else{
297                 print "\t\t\t<cluster id=\"AS_$cluster\" prefix=\"$cluster-\" suffix=\".$site.grid5000.fr\"\n";
298                 print "\t\t\t\tradical=\"1-$total\" power=\"";
299                 &get_gflops($cluster);
300                 print "\" bw=\"1.25E8\" lat=\"1.0E-4\""."\n";
301                 print "\t\t\t\tbb_bw=\"1.25E9\" bb_lat=\"1.0E-4\"></cluster>\n";
302         }
303         print "\t\t\t<link   id=\"link_$cluster\" bandwidth=\"1.25E9\" latency=\"1.0E-4\"/>\n\n";
304 }
305
306
307 sub get_gflops {
308         switch ($_[0]) {
309                 #Bordeaux
310                 case "bordeplage" { print "5.2297E9" }
311                 case "bordereau"  { print "8.8925E9" }
312                 case "borderline" { print "13.357E9" }
313                 #Lille
314                 case "chicon"     { print "8.9618E9" }
315                 case "chimint"    { print "23.531E9" }
316                 case "chinqchint" { print "22.270E9" }
317                 case "chirloute"  { print "24.473E9" }
318                 #Grenoble
319                 case "adonis"     { print "23.681E9" }
320                 case "edel"       { print "23.492E9" }
321                 case "genepi"     { print "21.175E9" }
322                 #Lyon
323                 case "capricorne" { print "4.7233E9" }
324                 case "sagittaire" { print "5.6693E9" }
325                 #Nancy
326                 case "graphene"   { print "16.673E9" }
327                 case "griffon"    { print "20.678E9" }
328                 #Orsay
329                 case "gdx"        { print "4.7153E9" }
330                 case "netgdx"     { print "4.7144E9" }
331                 #Rennes
332                 case "paradent"   { print "21.496E9" }
333                 case "paramount"  { print "12.910E9" }
334                 case "parapide"   { print "30.130E9" }
335                 case "parapluie"  { print "27.391E9" }
336                 #Sophia
337                 case "helios"     { print "7.7318E9" }
338                 case "sol"        { print "8.9388E9" }
339                 case "suno"       { print "23.530E9" }
340                 #Toulouse
341                 case "pastel"     { print "9.5674E9" }
342                 case "violette"   { print "5.1143E9" }
343                 #Reims
344                 case "stremi"     { print "TODO" }
345                 #Luxembourg
346                 case "granduc"    { print "TODO" }
347
348                 default:          { print "TODO" }
349         }
350 }