Whamcloud - gitweb
LU-4278 libcfs: remove LWT
[fs/lustre-release.git] / lustre / scripts / lmc2csv.pl
1 #!/usr/bin/perl
2
3 # vim:expandtab:shiftwidth=4:softtabstop=4:tabstop=4:
4
5 #
6 # convert an lmc batch file to a csv file for lustre_config
7 #
8 use strict; use warnings;
9
10 use Data::Dumper;
11
12 sub get_arg_val {
13     my $arg = shift;
14     my ($aref) = @_;
15     for (my $i = 0; $i <= $#$aref; $i++) {
16         if ($$aref[$i] eq "--" . $arg) {
17             my @foo = splice(@$aref, $i, 2);
18             return $foo[1];
19         }
20     }
21     return undef;
22 }
23
24 sub get_arg {
25     my $arg = shift;
26     my ($aref) = @_;
27     for (my $i = 0; $i <= $#$aref; $i++) {
28         if ($$aref[$i] eq "--" . $arg) {
29             splice(@$aref, $i, 1);
30             return 1;
31         }
32     }
33
34     return 0;
35 }
36
37 sub add_net {
38     my $net = {};
39     $net->{"node"} = get_arg_val("node", \@_);
40     $net->{"nid"} = get_arg_val("nid", \@_);
41     $net->{"nettype"} = get_arg_val("nettype", \@_);
42     $net->{"port"} = get_arg_val("port", \@_);
43     # note that this is not standard lmc syntax.  it's an extension to it
44     # to handle something that lmc never had to deal with.
45     $net->{"iface"} = get_arg_val("iface", \@_);
46     if ($#_ > 0) {
47         print STDERR "Unknown arguments to \"--add net\": @_\n";
48         exit(1);
49     }
50     return $net;
51 }
52
53 sub add_mds {
54     my $mds = {};
55     $mds->{"node"} = get_arg_val("node", \@_);
56     $mds->{"name"} = get_arg_val("mds", \@_);
57     $mds->{"fstype"} = get_arg_val("fstype", \@_);
58     $mds->{"dev"} = get_arg_val("dev", \@_);
59     $mds->{"size"} = get_arg_val("size", \@_);
60     $mds->{"lmv"} = get_arg_val("lmv", \@_);
61     $mds->{"failover"} = get_arg("failover", \@_);
62     $mds->{"failout"} = get_arg("failout", \@_);
63     $mds->{"inode_size"} = get_arg_val("inode_size", \@_);
64     if ($#_ > 0) {
65         print STDERR "Unknown arguments to \"--add mds\": @_\n";
66         exit(1);
67     }
68     return $mds;
69 }
70
71 sub add_lov {
72     my $lov = {};
73     $lov->{"name"} = get_arg_val("lov", \@_);
74     $lov->{"mds"} = get_arg_val("mds", \@_);
75     $lov->{"lmv"} = get_arg_val("lmv", \@_);
76     $lov->{"stripe_sz"} = get_arg_val("stripe_sz", \@_);
77     $lov->{"stripe_cnt"} = get_arg_val("stripe_cnt", \@_);
78     $lov->{"stripe_pattern"} = get_arg_val("stripe_pattern", \@_);
79     if ($#_ > 0) {
80         print STDERR "Unknown arguments to \"--add lov\": @_\n";
81         exit(1);
82     }
83     return $lov;
84 }
85
86 sub add_ost {
87     my $ost = {};
88     $ost->{"node"} = get_arg_val("node", \@_);
89     $ost->{"name"} = get_arg_val("ost", \@_);
90     $ost->{"fstype"} = get_arg_val("fstype", \@_);
91     $ost->{"dev"} = get_arg_val("dev", \@_);
92     $ost->{"size"} = get_arg_val("size", \@_);
93     $ost->{"lov"} = get_arg_val("lov", \@_);
94     $ost->{"mountfsoptions"} = get_arg_val("mountfsoptions", \@_);
95     $ost->{"failover"} = get_arg("failover", \@_);
96     $ost->{"failout"} = get_arg("failout", \@_);
97     $ost->{"inode_size"} = get_arg_val("inode_size", \@_);
98     if ($#_ > 0) {
99         print STDERR "Unknown arguments to \"--add ost\": @_\n";
100         exit(1);
101     }
102     return $ost;
103 }
104
105 sub add_mtpt {
106     my $mtpt = {};
107     $mtpt->{"node"} = get_arg_val("node", \@_);
108     $mtpt->{"path"} = get_arg_val("path", \@_);
109     $mtpt->{"mds"} = get_arg_val("mds", \@_);
110     $mtpt->{"lov"} = get_arg_val("lov", \@_);
111     $mtpt->{"lmv"} = get_arg_val("lmv", \@_);
112     if ($#_ > 0) {
113         print STDERR "Unknown arguments to \"--add mtpt\": @_\n";
114         exit(1);
115     }
116     return $mtpt;
117 }
118
119 no strict 'refs';
120
121 sub find_objs {
122     my $type = shift;
123     my $key = shift;
124     my $value = shift;
125     my @objs = @_;
126
127     my @found_objs;
128     foreach my $obj (@objs) {
129         if (defined($obj->{$key}) && defined($value)
130             && $obj->{$key} eq $value) {
131             push(@found_objs, $obj);
132         }
133     }
134
135     return @found_objs;
136 }
137
138 sub lnet_options {
139     my $net = shift;
140
141     my $networks = $net->{"nettype"};
142     if (defined($net->{"iface"})) {
143         my $iface = $net->{"iface"};
144         $networks .= "($iface)";
145     }
146     my $options_str = "options lnet networks=" . $networks .
147                    " accept=all";
148     if (defined($net->{"port"})) {
149         $options_str .= " accept_port=" . $net->{"port"};
150     }
151     return $options_str;
152
153 }
154
155 # main
156
157 my %objs;
158 my @mgses;
159
160 my $MOUNTPT = "/mnt";
161 if (defined($ENV{"MOUNTPT"})) {
162     $MOUNTPT = $ENV{"MOUNTPT"};
163 }
164
165 while(<>) {
166     my @args = split;
167
168     for (my $i = 0; $i <= $#args; $i++) {
169         if ($args[$i] eq "--add") {
170             my $type = "$args[$i + 1]";
171             my $subref = "add_$type";
172             splice(@args, $i, 2);
173             push(@{$objs{$type}}, &$subref(@args));
174             last;
175         }
176         if ($i == $#args) {
177             print STDERR "I don't know how to handle @args\n";
178             exit(1);
179         }
180     }
181 }
182
183 # link lovs to mdses
184 foreach my $lov (@{$objs{"lov"}}) {
185     foreach my $mds (find_objs("mds", "name", $lov->{"mds"}, @{$objs{"mds"}})) {
186         if ($mds) {
187             $mds->{"lov"} = $lov;
188         }
189     }
190     # try via lmvs as well
191     foreach my $mds (find_objs("mds", "lmv", $lov->{"lmv"}, @{$objs{"mds"}})) {
192         if ($mds) {
193             $mds->{"lov"} = $lov;
194         }
195     }
196 }
197
198 # create lmvs and link them to mdses
199 foreach my $mds (@{$objs{"mds"}}) {
200     my $lmv;
201     my @lmvs = find_objs("lmv", "name", $mds->{"lmv"}, @{$objs{"lmv"}});
202     if ($#lmvs < 0) {
203         $lmv = {};
204         $lmv->{"name"} = $mds->{"lmv"};
205         push(@{$objs{"lmv"}}, $lmv);
206     } else {
207         $lmv = pop(@lmvs);
208     }
209     $mds->{"lmv"} = $lmv;
210 }
211
212 # link mtpts to lovs and lmvs or mdses
213 foreach my $mtpt (@{$objs{"mtpt"}}) {
214     foreach my $mds (find_objs("mds", "name", $mtpt->{"mds"}, @{$objs{"mds"}})) {
215         if ($mds) {
216             $mds->{"mtpt"} = $mtpt;
217         }
218     }
219     foreach my $lmv (find_objs("lmv", "name", $mtpt->{"lmv"}, @{$objs{"lmv"}})) {
220         if ($lmv) {
221             $lmv->{"mtpt"} = $mtpt;
222         }
223     }
224     foreach my $lov (find_objs("lov", "name", $mtpt->{"lov"}, @{$objs{"lov"}})) {
225         if ($lov) {
226             $lov->{"mtpt"} = $mtpt;
227         }
228     }
229 }
230
231 # XXX could find failover pairs of osts and mdts here and link them to
232 # one another and then fill in their details in the csv generators below
233 my $COUNT = 1;
234 foreach my $mds (@{$objs{"mds"}}) {
235     # find the net for this node
236     my @nets = find_objs("net", "node", $mds->{"node"}, @{$objs{"net"}});
237     my $lmv = $mds->{"lmv"};
238     my $lov = $mds->{"lov"};
239     my $mtpt;
240     if ($lmv) {
241         $mtpt = $mds->{"lmv"}->{"mtpt"};
242     } else {
243         $mtpt = $mds->{"mtpt"};
244     }
245     my $fmt_options="";
246     if (defined($lov->{"stripe_sz"})) {
247         $fmt_options .= "lov.stripesize=" . $lov->{"stripe_sz"} . " ";
248     }
249     if (defined($lov->{"stripe_cnt"})) {
250         $fmt_options .= "lov.stripecount=" . $lov->{"stripe_cnt"} . " ";
251     }
252     if (defined($lov->{"stripe_pattern"})) {
253         $fmt_options .= "lov.stripetype=" . $lov->{"stripe_pattern"} . " ";
254     }
255     if (defined($mds->{"failover"}) & $mds->{"failover"}) {
256         $fmt_options .= "failover.mode=failover" . " ";
257     }
258     if (defined($mds->{"failout"}) & $mds->{"failout"}) {
259         $fmt_options .= "failover.mode=failout" . " ";
260     }
261     chop($fmt_options);
262     if ($fmt_options ne "") {
263         $fmt_options = " --param=\"$fmt_options\"";
264     }
265
266     my $mkfs_options="";
267     if (defined($mds->{"inode_size"})) {
268         $mkfs_options .= "-I " . $mds->{"inode_size"} . " ";
269     }
270     chop($mkfs_options);
271
272     my $fs_name="";
273     my $mount_point = "$MOUNTPT/" . $mds->{"name"};
274     if (defined($mtpt->{"node"})) {
275         $fs_name = $mtpt->{"node"};
276         $mount_point .= "_" . $mtpt->{"node"};
277     }
278
279     if ($COUNT == 1) {
280         # mgs/mdt
281         printf "%s,%s,%s,%s,mgs|mdt,%s,,,--device-size=%s --noformat%s,%s,\n", 
282         $mds->{"node"},
283         lnet_options($nets[0]),
284         $mds->{"dev"},
285         $mount_point,
286         $fs_name,
287         $mds->{"size"},
288         $fmt_options,
289         $mkfs_options;
290
291         push(@mgses, $nets[0]->{"nid"});
292     } else {
293         # mdt
294         printf "%s,%s,%s,%s,mdt,%s,\"%s\",,--device-size=%s --noformat%s,%s,\n",
295         $mds->{"node"},
296         lnet_options($nets[0]),
297         $mds->{"dev"},
298         $mount_point,
299         $fs_name,
300         join(",", @mgses),
301         $mds->{"size"},
302         $fmt_options,
303         $mkfs_options;
304     }
305     $COUNT++;
306 }
307
308 foreach my $ost (@{$objs{"ost"}}) {
309     my $mount_opts="";
310     if (defined($ost->{"mountfsoptions"})) {
311         $mount_opts .= "\"" . $ost->{"mountfsoptions"} . "\"";
312     }
313     my $fmt_options="";
314     if (defined($ost->{"failover"}) & $ost->{"failover"}) {
315         $fmt_options .= "failover.mode=failover" . " ";
316     }
317     if (defined($ost->{"failout"}) & $ost->{"failout"}) {
318         $fmt_options .= "failover.mode=failout" . " ";
319     }
320     chop($fmt_options);
321     if ($fmt_options ne "") {
322         $fmt_options = " --param=\"$fmt_options\"";
323     }
324     
325     my $mkfs_options="";
326     if (defined($ost->{"inode_size"})) {
327         $mkfs_options .= "-I " . $ost->{"inode_size"} . " ";
328     }
329     chop($mkfs_options);
330
331     $ost->{"lov"} = (find_objs("lov", "name", $ost->{"lov"}, @{$objs{"lov"}}))[0];
332     my $fs_name="";
333     my $mount_point = "$MOUNTPT/" . $ost->{"name"}, 
334     my $mtpt = $ost->{"lov"}->{"mtpt"};
335     if (defined($mtpt->{"node"})) {
336         $fs_name = $mtpt->{"node"};
337         $mount_point .= "_" . $mtpt->{"node"};
338     }
339     # find the net for this node
340     my @nets = find_objs("net", "node", $ost->{"node"}, @{$objs{"net"}});
341     printf "%s,%s,%s,%s,ost,%s,\"%s\",,--device-size=%s --noformat%s,%s,%s\n", 
342     $ost->{"node"},
343     lnet_options($nets[0]),
344     $ost->{"dev"},
345     $mount_point,
346     $fs_name,
347     join(",", @mgses),
348     $ost->{"size"},
349     $fmt_options,
350     $mkfs_options,
351     $mount_opts;
352 }