Logo AND Algorithmique Numérique Distribuée

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