From e600768e1977d27f52fab841f98d27b6d86d543f Mon Sep 17 00:00:00 2001 From: Jarrod Johnson Date: Wed, 25 Sep 2013 11:26:27 -0400 Subject: [PATCH] SVC support phase 2 Generally able to create shared and dedicated storage luns TODO: still put the boot data into storage.osvolume TODO: format callout to nodetype.os driven plugin (looking at esxi here) attachstorage/detachstorage/showstorage/rmstorage still TODO --- xCAT-server/lib/xcat/plugins/svc.pm | 95 +++++++++++++++++++++++++++-- 1 file changed, 91 insertions(+), 4 deletions(-) diff --git a/xCAT-server/lib/xcat/plugins/svc.pm b/xCAT-server/lib/xcat/plugins/svc.pm index a9990be10..4ef660f21 100644 --- a/xCAT-server/lib/xcat/plugins/svc.pm +++ b/xCAT-server/lib/xcat/plugins/svc.pm @@ -75,6 +75,8 @@ sub mkstorage { } my $lun = create_lun(controller=>$controller, size=>$size, pool=>$pool); my $wwns = get_wwns(@nodes); + makehosts($wwns, controller=>$controller, cfg=>$storents); + bindhosts(\@nodes, $lun, controller=>$controller); } else { foreach my $node (@nodes) { mkstorage_single(node=>$node, size=>$size, pool=>$pool, @@ -84,21 +86,75 @@ sub mkstorage { } } +sub bindhosts { + my $nodes = shift; + my $lun = shift; + my %args = @_; + my $session = establish_session(%args); + foreach my $node (@$nodes) { + #TODO: get what failure looks like... somehow... + #I guess I could make something with mismatched name and see how it + #goes + $session->cmd("mkvdiskhostmap -host $node ".$lun->{id}); + } +} + +sub makehosts { + my $wwnmap = shift; + my %args = @_; + my $session = establish_session(%args); + my $stortab = xCAT::Table->new('storage'); + foreach my $node (keys %$wwnmap) { + my $wwnstr = ""; + foreach my $wwn (@{$wwnmap->{$node}}) { + $wwn =~ s/://g; + $wwnstr .= $wwn . ":"; + } + chop($wwnstr); + #TODO: what if the given wwn exists, but *not* as the nodename we want + #the correct action is to look at hosts, see if one exists, and reuse, + #create, or warn depending + $session->cmd("mkhost -name $node -fcwwpn $wwnstr -force"); + my @currentcontrollers = split /,/, $args{cfg}->{$node}->[0]->{controller}; + if ($args{cfg}->{$node}->[0] and $args{cfg}->{$node}->[0]->{controller}) { + @currentcontrollers = split /,/, $args{cfg}->{$node}->[0]->{controller}; + } else { + @currentcontrollers = (); + } + if (grep { $_ eq $args{controller}} @currentcontrollers) { + next; + } + unshift @currentcontrollers, $args{controller}; + my $ctrstring = join ",", @currentcontrollers; + $stortab->setNodeAttribs($node,{controller=>$ctrstring}); + } +} + +my %wwnmap; sub got_wwns { - use Data::Dumper; - print Dumper(@_); + my $rsp = shift; + foreach my $ndata (@{$rsp->{node}}) { + my $nodename = $ndata->{name}->[0]; + my @wwns = (); + foreach my $data (@{$ndata->{data}}) { + push @{$wwnmap{$nodename}}, $data->{contents}->[0]; + } + } } sub get_wwns { + %wwnmap = (); my @nodes = @_; + foreach my $node (@nodes) { + $wwnmap{$node} = []; + } my %request = ( node => \@nodes, command => [ 'rinv' ], arg => [ 'wwn' ] ); - use Data::Dumper; - print Dumper(\%request); $dorequest->(\%request, \&got_wwns); + return \%wwnmap; } my $globaluser; @@ -188,6 +244,37 @@ sub assure_identical_table_values { sub mkstorage_single { my %args = @_; + my $size; + my $cfg = $args{cfg}; + my $node = $args{node}; + my $pool; + my $controller; + if (defined $args{size}) { + $size = $args{size}; + } elsif ($cfg->{size}) { + $size = $cfg->{size}; + } else { + sendmsg([1, "Size not provided via argument or storage.size"], + $callback, $node); + } + if (defined $args{pool}) { + $pool = $args{pool}; + } elsif ($cfg->{storagepool}) { + $pool = $cfg->{storagepool}; + } else { + sendmsg([1, "Pool not provided via argument or storage.storagepool"], + $callback, $node); + } + if (defined $args{controller}) { + $controller = $args{controller}; + } elsif ($cfg->{controller}) { + $controller = $cfg->{controller}; + $controller =~ s/.*,//; + } + my $lun = create_lun(controller=>$controller, size=>$size, pool=>$pool); + my $wwns = get_wwns($node); + makehosts($wwns, controller=>$controller, cfg=>{$node=>$cfg}); + bindhosts([$node], $lun, controller=>$controller); } sub process_request {