Whamcloud - gitweb
land b1_5 onto HEAD
[fs/lustre-release.git] / lustre / scripts / lmc2csv.pl
diff --git a/lustre/scripts/lmc2csv.pl b/lustre/scripts/lmc2csv.pl
new file mode 100644 (file)
index 0000000..86959bb
--- /dev/null
@@ -0,0 +1,228 @@
+#!/usr/bin/perl
+
+# vim:expandtab:shiftwidth=4:softtabstop=4:tabstop=4:
+
+#
+# convert an lmc batch file to a csv file for lustre_config.sh
+#
+use strict; use warnings;
+
+use Data::Dumper;
+
+sub get_arg_val {
+    my $arg = shift;
+    my ($aref) = @_;
+    for (my $i = 0; $i <= $#$aref; $i++) {
+        if ($$aref[$i] eq "--" . $arg) {
+            my @foo = splice(@$aref, $i, 2);
+            return $foo[1];
+        }
+    }
+}
+
+sub get_arg {
+    my $arg = shift;
+    my ($aref) = @_;
+    for (my $i = 0; $i <= $#$aref; $i++) {
+        if ($$aref[$i] eq "--" . $arg) {
+            splice(@$aref, $i, 1);
+            return 1;
+        }
+    }
+
+    return 0;
+}
+
+sub add_net {
+    my $net = {};
+    $net->{"node"} = get_arg_val("node", \@_);
+    $net->{"nid"} = get_arg_val("nid", \@_);
+    $net->{"nettype"} = get_arg_val("nettype", \@_);
+    $net->{"port"} = get_arg_val("port", \@_);
+    if ($#_ > 0) {
+        print STDERR "Unknown arguments to \"--add net\": @_\n";
+        exit(1);
+    }
+    return $net;
+}
+
+sub add_mds {
+    my $mds = {};
+    $mds->{"node"} = get_arg_val("node", \@_);
+    $mds->{"mds"} = get_arg_val("mds", \@_);
+    $mds->{"fstype"} = get_arg_val("fstype", \@_);
+    $mds->{"dev"} = get_arg_val("dev", \@_);
+    $mds->{"size"} = get_arg_val("size", \@_);
+    if ($#_ > 0) {
+        print STDERR "Unknown arguments to \"--add mds\": @_\n";
+        exit(1);
+    }
+    return $mds;
+}
+
+sub add_lov {
+    my $lov = {};
+    $lov->{"lov"} = get_arg_val("lov", \@_);
+    $lov->{"mds"} = get_arg_val("mds", \@_);
+    $lov->{"stripe_sz"} = get_arg_val("stripe_sz", \@_);
+    $lov->{"stripe_cnt"} = get_arg_val("stripe_cnt", \@_);
+    $lov->{"stripe_pattern"} = get_arg_val("stripe_pattern", \@_);
+    if ($#_ > 0) {
+        print STDERR "Unknown arguments to \"--add lov\": @_\n";
+        exit(1);
+    }
+    return $lov;
+}
+
+sub add_ost {
+    my $ost = {};
+    $ost->{"node"} = get_arg_val("node", \@_);
+    $ost->{"ost"} = get_arg_val("ost", \@_);
+    $ost->{"fstype"} = get_arg_val("fstype", \@_);
+    $ost->{"dev"} = get_arg_val("dev", \@_);
+    $ost->{"size"} = get_arg_val("size", \@_);
+    $ost->{"lov"} = get_arg_val("lov", \@_);
+    $ost->{"mountfsoptions"} = get_arg_val("mountfsoptions", \@_);
+    $ost->{"failover"} = get_arg("failover", \@_);
+    if ($#_ > 0) {
+        print STDERR "Unknown arguments to \"--add ost\": @_\n";
+        exit(1);
+    }
+    return $ost;
+}
+
+sub add_mtpt {
+    my $mtpt = {};
+    $mtpt->{"node"} = get_arg_val("node", \@_);
+    $mtpt->{"path"} = get_arg_val("path", \@_);
+    $mtpt->{"mds"} = get_arg_val("mds", \@_);
+    $mtpt->{"lov"} = get_arg_val("lov", \@_);
+    if ($#_ > 0) {
+        print STDERR "Unknown arguments to \"--add mtpt\": @_\n";
+        exit(1);
+    }
+    return $mtpt;
+}
+
+no strict 'refs';
+
+sub find_obj {
+    my $type = shift;
+    my $key = shift;
+    my $value = shift;
+    my @objs = @_;
+
+    foreach my $obj (@objs) {
+        if ($obj->{$key} eq $value) {
+            return $obj;
+        }
+    }
+}
+
+sub lnet_options {
+    my $net = shift;
+
+    my $options_str = "options lnet networks=" . $net->{"nettype"} .
+                   " accept=all";
+    if (defined($net->{"port"})) {
+        $options_str .= " accept_port=" . $net->{"port"};
+    }
+    return $options_str;
+
+}
+
+# main
+
+my %objs;
+my @mgses;
+
+my $MOUNTPT = "/mnt";
+if (defined($ENV{"MOUNTPT"})) {
+    $MOUNTPT = $ENV{"MOUNTPT"};
+}
+
+while(<>) {
+    my @args = split;
+
+    for (my $i = 0; $i <= $#args; $i++) {
+        if ($args[$i] eq "--add") {
+            my $type = "$args[$i + 1]";
+            my $subref = "add_$type";
+            splice(@args, $i, 2);
+            push(@{$objs{$type}}, &$subref(@args));
+            last;
+        }
+        if ($i == $#args) {
+            print STDERR "I don't know how to handle @args\n";
+            exit(1);
+        }
+    }
+}
+
+# link lovs to mdses
+foreach my $lov (@{$objs{"lov"}}) {
+    my $mds = find_obj("mds", "mds", $lov->{"mds"}, @{$objs{"mds"}});
+    $mds->{"lov"} = $lov;
+}
+# XXX could find failover pairs of osts and mdts here and link them to
+# one another and then fill in their details in the csv generators below
+my $COUNT = 1;
+foreach my $mds (@{$objs{"mds"}}) {
+    # find the net for this node
+    my $net = find_obj("net", "node", $mds->{"node"}, @{$objs{"net"}});
+    my $lov = $mds->{"lov"};
+    my $mkfs_options="";
+    if (defined($lov->{"stripe_sz"})) {
+        $mkfs_options .= "lov.stripesize=" . $lov->{"stripe_sz"} . " ";
+    }
+    if (defined($lov->{"stripe_cnt"})) {
+        $mkfs_options .= "lov.stripecount=" . $lov->{"stripe_cnt"} . " ";
+    }
+    if (defined($lov->{"stripe_pattern"})) {
+        $mkfs_options .= "lov.stripetype=" . $lov->{"stripe_pattern"} . " ";
+    }
+    chop($mkfs_options);
+    if ($mkfs_options ne "") {
+        $mkfs_options = " --param=\"$mkfs_options\"";
+    }
+
+    if ($COUNT == 1) {
+        # mgs/mdt
+        printf "%s,%s,%s,$MOUNTPT/%s,mgs|mdt,,,,--device-size=%s --noformat%s,,noauto\n", 
+        $mds->{"node"},
+        lnet_options($net),
+        $mds->{"dev"},
+        $mds->{"mds"},
+        $mds->{"size"},
+        $mkfs_options;
+
+        push(@mgses, $net->{"nid"});
+    } else {
+        # mdt
+        printf "%s,%s,%s,$MOUNTPT/%s,mdt,,\"%s\",,--device-size=%s --noformat,,noauto\n",
+        $mds->{"node"},
+        lnet_options($net),
+        $mds->{"dev"},
+        $mds->{"mds"},
+        join(",", @mgses),
+        $mds->{"size"};
+    }
+    $COUNT++;
+}
+
+foreach my $ost (@{$objs{"ost"}}) {
+    # find the net for this node
+    my $mount_opts="noauto";
+    if (defined($ost->{"mountfsoptions"})) {
+        $mount_opts .= "," . $ost->{"mountfsoptions"};
+    }
+    my $net = find_obj("net", "node", $ost->{"node"}, @{$objs{"net"}});
+    printf "%s,%s,%s,$MOUNTPT/%s,ost,,\"%s\",,--device-size=%s --noformat,,\"%s\"\n", 
+    $ost->{"node"},
+    lnet_options($net),
+    $ost->{"dev"},
+    $ost->{"ost"},
+    join(",", @mgses),
+    $ost->{"size"},
+    $mount_opts;
+}