/lustre/scripts/lmc2csv.pl

https://github.com/behlendorf/lustre · Perl · 352 lines · 300 code · 34 blank · 18 comment · 45 complexity · 3cbed701529ad977716b193419c98831 MD5 · raw file

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