Logo AND Algorithmique Numérique Distribuée

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