Whamcloud - gitweb
Branch HEAD
[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 }
22
23 sub get_arg {
24     my $arg = shift;
25     my ($aref) = @_;
26     for (my $i = 0; $i <= $#$aref; $i++) {
27         if ($$aref[$i] eq "--" . $arg) {
28             splice(@$aref, $i, 1);
29             return 1;
30         }
31     }
32
33     return 0;
34 }
35
36 sub add_net {
37     my $net = {};
38     $net->{"node"} = get_arg_val("node", \@_);
39     $net->{"nid"} = get_arg_val("nid", \@_);
40     $net->{"nettype"} = get_arg_val("nettype", \@_);
41     $net->{"port"} = get_arg_val("port", \@_);
42     if ($#_ > 0) {
43         print STDERR "Unknown arguments to \"--add net\": @_\n";
44         exit(1);
45     }
46     return $net;
47 }
48
49 sub add_mds {
50     my $mds = {};
51     $mds->{"node"} = get_arg_val("node", \@_);
52     $mds->{"mds"} = get_arg_val("mds", \@_);
53     $mds->{"fstype"} = get_arg_val("fstype", \@_);
54     $mds->{"dev"} = get_arg_val("dev", \@_);
55     $mds->{"size"} = get_arg_val("size", \@_);
56     if ($#_ > 0) {
57         print STDERR "Unknown arguments to \"--add mds\": @_\n";
58         exit(1);
59     }
60     return $mds;
61 }
62
63 sub add_lov {
64     my $lov = {};
65     $lov->{"lov"} = get_arg_val("lov", \@_);
66     $lov->{"mds"} = get_arg_val("mds", \@_);
67     $lov->{"stripe_sz"} = get_arg_val("stripe_sz", \@_);
68     $lov->{"stripe_cnt"} = get_arg_val("stripe_cnt", \@_);
69     $lov->{"stripe_pattern"} = get_arg_val("stripe_pattern", \@_);
70     if ($#_ > 0) {
71         print STDERR "Unknown arguments to \"--add lov\": @_\n";
72         exit(1);
73     }
74     return $lov;
75 }
76
77 sub add_ost {
78     my $ost = {};
79     $ost->{"node"} = get_arg_val("node", \@_);
80     $ost->{"ost"} = get_arg_val("ost", \@_);
81     $ost->{"fstype"} = get_arg_val("fstype", \@_);
82     $ost->{"dev"} = get_arg_val("dev", \@_);
83     $ost->{"size"} = get_arg_val("size", \@_);
84     $ost->{"lov"} = get_arg_val("lov", \@_);
85     $ost->{"mountfsoptions"} = get_arg_val("mountfsoptions", \@_);
86     $ost->{"failover"} = get_arg("failover", \@_);
87     if ($#_ > 0) {
88         print STDERR "Unknown arguments to \"--add ost\": @_\n";
89         exit(1);
90     }
91     return $ost;
92 }
93
94 sub add_mtpt {
95     my $mtpt = {};
96     $mtpt->{"node"} = get_arg_val("node", \@_);
97     $mtpt->{"path"} = get_arg_val("path", \@_);
98     $mtpt->{"mds"} = get_arg_val("mds", \@_);
99     $mtpt->{"lov"} = get_arg_val("lov", \@_);
100     if ($#_ > 0) {
101         print STDERR "Unknown arguments to \"--add mtpt\": @_\n";
102         exit(1);
103     }
104     return $mtpt;
105 }
106
107 no strict 'refs';
108
109 sub find_obj {
110     my $type = shift;
111     my $key = shift;
112     my $value = shift;
113     my @objs = @_;
114
115     foreach my $obj (@objs) {
116         if ($obj->{$key} eq $value) {
117             return $obj;
118         }
119     }
120 }
121
122 sub lnet_options {
123     my $net = shift;
124
125     my $options_str = "options lnet networks=" . $net->{"nettype"} .
126                    " accept=all";
127     if (defined($net->{"port"})) {
128         $options_str .= " accept_port=" . $net->{"port"};
129     }
130     return $options_str;
131
132 }
133
134 # main
135
136 my %objs;
137 my @mgses;
138
139 my $MOUNTPT = "/mnt";
140 if (defined($ENV{"MOUNTPT"})) {
141     $MOUNTPT = $ENV{"MOUNTPT"};
142 }
143
144 while(<>) {
145     my @args = split;
146
147     for (my $i = 0; $i <= $#args; $i++) {
148         if ($args[$i] eq "--add") {
149             my $type = "$args[$i + 1]";
150             my $subref = "add_$type";
151             splice(@args, $i, 2);
152             push(@{$objs{$type}}, &$subref(@args));
153             last;
154         }
155         if ($i == $#args) {
156             print STDERR "I don't know how to handle @args\n";
157             exit(1);
158         }
159     }
160 }
161
162 # link lovs to mdses
163 foreach my $lov (@{$objs{"lov"}}) {
164     my $mds = find_obj("mds", "mds", $lov->{"mds"}, @{$objs{"mds"}});
165     $mds->{"lov"} = $lov;
166 }
167 # XXX could find failover pairs of osts and mdts here and link them to
168 # one another and then fill in their details in the csv generators below
169 my $COUNT = 1;
170 foreach my $mds (@{$objs{"mds"}}) {
171     # find the net for this node
172     my $net = find_obj("net", "node", $mds->{"node"}, @{$objs{"net"}});
173     my $lov = $mds->{"lov"};
174     my $mkfs_options="";
175     if (defined($lov->{"stripe_sz"})) {
176         $mkfs_options .= "lov.stripesize=" . $lov->{"stripe_sz"} . " ";
177     }
178     if (defined($lov->{"stripe_cnt"})) {
179         $mkfs_options .= "lov.stripecount=" . $lov->{"stripe_cnt"} . " ";
180     }
181     if (defined($lov->{"stripe_pattern"})) {
182         $mkfs_options .= "lov.stripetype=" . $lov->{"stripe_pattern"} . " ";
183     }
184     chop($mkfs_options);
185     if ($mkfs_options ne "") {
186         $mkfs_options = " --param=\"$mkfs_options\"";
187     }
188
189     if ($COUNT == 1) {
190         # mgs/mdt
191         printf "%s,%s,%s,$MOUNTPT/%s,mgs|mdt,,,,--device-size=%s --noformat%s,,noauto\n", 
192         $mds->{"node"},
193         lnet_options($net),
194         $mds->{"dev"},
195         $mds->{"mds"},
196         $mds->{"size"},
197         $mkfs_options;
198
199         push(@mgses, $net->{"nid"});
200     } else {
201         # mdt
202         printf "%s,%s,%s,$MOUNTPT/%s,mdt,,\"%s\",,--device-size=%s --noformat,,noauto\n",
203         $mds->{"node"},
204         lnet_options($net),
205         $mds->{"dev"},
206         $mds->{"mds"},
207         join(",", @mgses),
208         $mds->{"size"};
209     }
210     $COUNT++;
211 }
212
213 foreach my $ost (@{$objs{"ost"}}) {
214     # find the net for this node
215     my $mount_opts="noauto";
216     if (defined($ost->{"mountfsoptions"})) {
217         $mount_opts .= "," . $ost->{"mountfsoptions"};
218     }
219     my $net = find_obj("net", "node", $ost->{"node"}, @{$objs{"net"}});
220     printf "%s,%s,%s,$MOUNTPT/%s,ost,,\"%s\",,--device-size=%s --noformat,,\"%s\"\n", 
221     $ost->{"node"},
222     lnet_options($net),
223     $ost->{"dev"},
224     $ost->{"ost"},
225     join(",", @mgses),
226     $ost->{"size"},
227     $mount_opts;
228 }