Warning: This file has been marked up for HTML
#
# This is a Perl script to test cluster operations
#
#use File::Path;
#
# Set the datastream for a file handle to the passed in value.
#
sub SetDataStream(*$)
{
my $fh = $_[0];
my $dataStream = $_[1];
my $result;
my $command;
$command = "<virtualIO><datastream name=\"$dataStream\"/></virtualIO>";
seek $fh, 0, 0;
if (!syswrite($fh, $command, length($command)))
{
$result .= "Unable to write datastream command. ";
seek $fh, 0, 0;
if (sysread($fh, $error, 1000))
{
$result .= $error;
}
$result .= "\n";
}
return $result;
}
#
# Write a command to a file and get the result
#
sub WriteCommand(*$)
{
my $fh = $_[0];
my $command = $_[1];
my $result;
print("command=$command\n");
seek $fh, 0, 0;
if (!syswrite($fh, $command, length($command)))
{
$result .= "Unable to write command. ";
seek $fh, 0, 0;
if (sysread($fh, $error, 1000))
{
$result .= $error;
}
$result .= "\n";
}
else
{
seek $fh, 0, 0;
$readLen = 999;
while ($readLen)
{
$readLen = sysread($fh, $reply, 1000);
$result .= $reply;
}
}
print("result=$result\n");
return $result;
}
#
# Parse the result of cluster operation
#
sub ParseResult($)
{
my $xml = $_[0];
my $result = "";
if ($xml =~ /<failed>(.*)<\/failed>/s)
{
$result = $1;
return "Failed: $1\n";
}
else
{
return "Success";
}
}
#
# Offline Resource
#
sub OfflineResource($$)
{
my $result;
my $ret;
my $server = $_[0];
my $resName = $_[1];
$result = "Offlining resource $resName via $server\n";
if (!($ret = SetDataStream(RESFILE, "command")))
{
$result .= $ret;
my $ncsResult = WriteCommand(RESFILE,
"<ncsRequest><offline>".
"<resource>$resName</resource>".
"</offline></ncsRequest>");
$result .= ParseResult($ncsResult);
}
return $result;
}
#
# Migrate Resource
#
sub MigrateResource($$$)
{
my $result;
my $ret;
my $server = $_[0];
my $resName = $_[1];
my $nodeName = $_[2];
$result = "Migrating resource $resName to $nodeName via $server\n";
if (!($ret = SetDataStream(RESFILE, "command")))
{
$result .= $ret;
my $ncsResult = WriteCommand(RESFILE,
"<ncsRequest><migrate>".
"<resource>$resName</resource>".
"<node>$nodeName</node>".
"</migrate></ncsRequest>");
$result .= ParseResult($ncsResult);
}
return $result;
}
#
# Online Resource
#
sub OnlineResource($$$)
{
my $result;
my $ret;
my $server = $_[0];
my $resName = $_[1];
my $nodeName = $_[2];
$result = "Online resource $resName to $nodeName via $server\n";
if (!($ret = SetDataStream(RESFILE, "command")))
{
$result .= $ret;
my $ncsResult = WriteCommand(RESFILE,
"<ncsRequest><online>".
"<resource>$resName</resource>".
"<node>$nodeName</node>".
"</online></ncsRequest>");
$result .= ParseResult($ncsResult);
}
return $result;
}
#
# Resource Alert
#
sub ResourceAlert($$$)
{
my $result;
my $ret;
my $server = $_[0];
my $resName = $_[1];
my $alert = $_[2];
$result = "Resource $resName alert $alert via $server\n";
if (!($ret = SetDataStream(RESFILE, "command")))
{
$result .= $ret;
my $ncsResult = WriteCommand(RESFILE,
"<ncsRequest><alert>".
"<resource>$resName</resource>".
"$alert".
"</alert></ncsRequest>");
$result .= ParseResult($ncsResult);
}
return $result;
}
#
# Node Join
#
sub NodeJoin($)
{
my $result;
my $ret;
my $server = $_[0];
$result = "Node Join $server\n";
if (!($ret = SetDataStream(NODEFILE, "command")))
{
$result .= $ret;
my $ncsResult = WriteCommand(NODEFILE,
"<ncsRequest>".
"<join/></ncsRequest>");
$result .= ParseResult($ncsResult);
}
return $result;
}
#
# Node Leave
#
sub NodeLeave($)
{
my $result;
my $ret;
my $server = $_[0];
$result = "Node Leave $server\n";
if (!($ret = SetDataStream(NODEFILE, "command")))
{
$result .= $ret;
my $ncsResult = WriteCommand(NODEFILE,
"<ncsRequest>".
"<leave/></ncsRequest>");
$result .= ParseResult($ncsResult);
}
return $result;
}
#
# Main
#
{
if ($#ARGV < 0 || $#ARGV > 0 || $ARGV[0] eq "/?" || $ARGV[0] eq "-?")
{
print "USAGE: cluster.pl server\n".
"Example: cluster server1 \n".
"If running from a server use \".\" for the server name.";
exit;
}
my $server = $ARGV[0];
if ($server eq ".")
{
open(RESFILE, "+<_admin:\\Novell\\Cluster\\Resource.cmd")
or die "Error opening Cluster management file ($!) on server";
open(NODEFILE, "+<_admin:\\Novell\\Cluster\\Node.cmd")
or die "Error opening Cluster management file ($!) on server";
}
else
{
open(RESFILE, "+<\\\\$server\\_admin\\Novell\\Cluster\\Resource.cmd")
or die "Error opening Cluster management file ($!)";
open(NODEFILE, "+<\\\\$server\\_admin\\Novell\\Cluster\\Node.cmd")
or die "Error opening Cluster management file ($!)";
}
MAIN: while(TRUE)
{
do
{
print "1. Migrate resource\n".
"2. Online resource\n".
"3. Offline resource\n".
"4. Resource alert yes\n".
"5. Resource alert no\n".
"6. Node join cluster\n".
"7. Node leave cluster\n".
"Select action: ";
chomp($action = <STDIN>);
} while ($action != 0 && ($action < 1 || $action > 7));
if ($action == 1)
{
print "Resource name: ";
chomp(my $resName = <STDIN>);
print "Node name: ";
chomp(my $nodeName = <STDIN>);
my @results = MigrateResource($server, $resName, $nodeName);
print "---------------------------\n\n";
print @results;
print "\n---------------------------\n\n";
}
elsif ($action == 2)
{
print "Resource name: ";
chomp(my $resName = <STDIN>);
print "Node name: ";
chomp(my $nodeName = <STDIN>);
my @results = OnlineResource($server, $resName, $nodeName);
print "---------------------------\n\n";
print @results;
print "\n---------------------------\n\n";
}
elsif ($action == 3)
{
print "Resource name: ";
chomp(my $resName = <STDIN>);
my @results = OfflineResource($server, $resName);
print "---------------------------\n\n";
print @results;
print "\n---------------------------\n\n";
}
elsif ($action == 4)
{
print "Resource name: ";
chomp(my $resName = <STDIN>);
my @results = ResourceAlert($server, $resName, "<yes/>");
print "---------------------------\n\n";
print @results;
print "\n---------------------------\n\n";
}
elsif ($action == 5)
{
print "Resource name: ";
chomp(my $resName = <STDIN>);
my @results = ResourceAlert($server, $resName, "<no/>");
print "---------------------------\n\n";
print @results;
print "\n---------------------------\n\n";
}
elsif ($action == 6)
{
my @results = NodeJoin($server);
print "---------------------------\n\n";
print @results;
print "\n---------------------------\n\n";
}
elsif ($action == 7)
{
my @results = NodeLeave($server);
print "---------------------------\n\n";
print @results;
print "\n---------------------------\n\n";
}
else
{
last MAIN;
}
}
close(RESFILE);
close(NODEFILE);
}