From a8a57f64a434bc9edaada7ad0a2366d6977e8e55 Mon Sep 17 00:00:00 2001 From: Chuck Brazie Date: Thu, 19 Oct 2017 14:18:47 -0400 Subject: [PATCH] Any updates since merge in October Change-Id: I562c4069f5008a5faf71091fb243d349740052c1 --- perl-xCAT/xCAT/zvmCPUtils.pm | 2 +- perl-xCAT/xCAT/zvmUtils.pm | 31 +- xCAT-server/lib/xcat/plugins/zvm.pm | 383 +++++++++++++++-------- xCAT-server/share/xcat/scripts/setupDisk | 51 +++ 4 files changed, 321 insertions(+), 146 deletions(-) diff --git a/perl-xCAT/xCAT/zvmCPUtils.pm b/perl-xCAT/xCAT/zvmCPUtils.pm index f66ba7513..22f5e67b7 100644 --- a/perl-xCAT/xCAT/zvmCPUtils.pm +++ b/perl-xCAT/xCAT/zvmCPUtils.pm @@ -781,7 +781,7 @@ sub revokeVSwitch { # Use SMAPI EXEC, use new extended SMAPI my $out = `ssh $user\@$hcp "$sudo $dir/smcli Virtual_Network_Vswitch_Set_Extended -T SYSTEM -k 'switch_name='$vswitchId -k 'revoke_userid='$userId -k 'persist=YES'"`; - xCAT::zvmUtils->printSyslog("revokeVSwitch- ssh $user\@$hcp $sudo $dir/smcli Virtual_Network_Vswitch_Set -T SYSTEM -k 'switch_name='$vswitchId -k 'revoke_userid='$userId -k 'persist=YES'"); + xCAT::zvmUtils->printSyslog("revokeVSwitch- ssh $user\@$hcp $sudo $dir/smcli Virtual_Network_Vswitch_Set_Extended -T SYSTEM -k 'switch_name='$vswitchId -k 'revoke_userid='$userId -k 'persist=YES'"); $out = xCAT::zvmUtils->trimStr($out); xCAT::zvmUtils->printSyslog($out); diff --git a/perl-xCAT/xCAT/zvmUtils.pm b/perl-xCAT/xCAT/zvmUtils.pm index e191be899..893278fd5 100644 --- a/perl-xCAT/xCAT/zvmUtils.pm +++ b/perl-xCAT/xCAT/zvmUtils.pm @@ -728,7 +728,8 @@ sub getRootDeviceAddr { Node Device address Option (-d|-e) - Returns : Nothing + Returns : successful: String indicating the enable was performed and ending with "Done". + unsuccessful: Error message from the last attempt Example : my $out = xCAT::zvmUtils->disableEnableDisk($callback, $user, $node, $option, $devAddr); =cut @@ -745,24 +746,24 @@ sub disableEnableDisk { } # Disable/enable disk - my $out; + my $out = ''; if ( $option eq "-d" || $option eq "-e" ) { # Can't guarantee the success of online/offline disk, need to wait # Until it's done because we may detach the disk after -d option # or use the disk after the -e option my @sleepTime = (1,2,3,5,8,15,22,34,60,60,60,60,60,90,120); foreach (@sleepTime) { - #$out = system("ssh $user\@$node '$sudo /sbin/chccwdev $option $devAddr'"); - my $cmd = "$sudo /sbin/chccwdev $option $devAddr"; + my $cmd = "$sudo /sbin/chccwdev $option $devAddr 2>&1"; $out = xCAT::zvmUtils->execcmdonVM($user, $node, $cmd); # caller sets $user to $::SUDOER if (xCAT::zvmUtils->checkOutput( $out ) == -1) { # try again if an error + xCAT::zvmUtils->printSyslog( "$node: Error received on cmd: $cmd, output: $out" ); sleep($_); } else { return "ssh $user\@$node $sudo /sbin/chccwdev $option $devAddr... Done"; } } } - return "Error: failed to ssh $user\@$node $sudo /sbin/chccwdev $option $devAddr"; + return "Error: failed to ssh $user\@$node $sudo /sbin/chccwdev $option $devAddr, Output: $out"; } #------------------------------------------------------- @@ -1131,7 +1132,7 @@ sub checkSSH_Rc { if (!defined $cmdOutput) { $cmdOutput = ''; - } else { + } elsif ( $cmdOutput ne '' ) { $cmdOutput = " Output: " . $cmdOutput . " "; } @@ -1152,14 +1153,14 @@ sub checkSSH_Rc { $rc = $rc >> 8; if ( $rc == 255 ) { # SSH failure to communicate with $tgtNode. - $msgTxt = "$finalTargetNode" . "(Error) In $functionName(), SSH communication to $tgtNode failed for command: $cmd"; + $msgTxt = "$finalTargetNode" . "(Error) In $functionName(), SSH communication to $tgtNode failed for command: $cmd$cmdOutput"; if ($logit > 0 ) { xCAT::zvmUtils->printSyslog("$msgTxt"); } return ($rc, $msgTxt); } elsif ( $rc != 0 ) { # Generic failure of the command. - $msgTxt = "$finalTargetNode" . "(Error) In $functionName(), command to $tgtNode failed with return code $rc for: $cmd" . "$cmdOutput"; + $msgTxt = "$finalTargetNode" . "(Error) In $functionName(), command to $tgtNode failed with return code $rc for: $cmd$cmdOutput"; if ($logit > 1 ) { xCAT::zvmUtils->printSyslog("$msgTxt"); } @@ -3376,14 +3377,16 @@ sub smapi4xcat { Privilege Profile Cpu + ipl + logonby Returns : If successful, return file path. Otherwise, return -1 - Example : my $out = xCAT::zvmUtils->generateUserEntryFile($userId, $password, $memorySize, $privilege, $profileName, $cpuCount); + Example : my $out = xCAT::zvmUtils->generateUserEntryFile($userId, $password, $memorySize, $privilege, $profileName, $cpuCount, $ipl, $logonby); =cut #------------------------------------------------------- sub generateUserEntryFile { - my ( $class, $userId, $password, $memorySize, $privilege, $profileName, $cpuCount, $ipl) = @_; + my ( $class, $userId, $password, $memorySize, $privilege, $profileName, $cpuCount, $ipl, $logonby) = @_; # If a file of this name already exists, just override it my $file = "/tmp/$userId.txt"; @@ -3395,11 +3398,17 @@ sub generateUserEntryFile { $content = $content.sprintf("CPU %02X\n", $i); } - if ( $ipl != "") { + if ( $ipl ne "") { # the caller need validate this $ipl param $content = $content.sprintf("IPL %04s\n", $ipl); } + if ( $logonby ne "") { + # the caller need validate the $logonby param + my $log = "LOGONBY ".$logonby."\n"; + $content = $content.$log; + } + unless (open(FILE, ">$file")) { return -1; } diff --git a/xCAT-server/lib/xcat/plugins/zvm.pm b/xCAT-server/lib/xcat/plugins/zvm.pm index bf8ed2ad6..c7caf524d 100644 --- a/xCAT-server/lib/xcat/plugins/zvm.pm +++ b/xCAT-server/lib/xcat/plugins/zvm.pm @@ -974,11 +974,11 @@ sub changeVM { xCAT::zvmUtils->printSyslog("changeVM() node:$node userid:$userId subCmd:$args->[0] zHCP:$hcp sudoer:$::SUDOER sudo:$::SUDO"); - # Output string + # Common subfunction variables my $out = ""; my $outmsg; my $device = 0; - my $newlinkcall = 0; + my $newlinkcall = -1; # -1: not linked, 0: linked using the old way, 1: linked using linkdiskandbringonline script. my $rc = 0; my $vdev; @@ -1041,17 +1041,18 @@ sub changeVM { # Add to directory entry my $error = 0; + xCAT::zvmUtils->printSyslog( "ssh $::SUDOER\@$hcp \"$::SUDO $::DIR/smcli Image_Disk_Create_DM -T $userId -v $addr -t 3390 -a AUTOG -r $pool -u 1 -z $cyl -m $mode -f 1 -R $readPw -W $writePw -M $multiPw\"" ); $out = `ssh $::SUDOER\@$hcp "$::SUDO $::DIR/smcli Image_Disk_Create_DM -T $userId -v $addr -t 3390 -a AUTOG -r $pool -u 1 -z $cyl -m $mode -f 1 -R $readPw -W $writePw -M $multiPw"`; - xCAT::zvmUtils->printSyslog("smcli Image_Disk_Create_DM -T $userId -v $addr -t 3390 -a AUTOG -r $pool -u 1 -z $cyl -m $mode -f 1 -R $readPw -W $writePw -M $multiPw"); - $error = (xCAT::zvmUtils->checkOutput( $out ) == -1) ? 1 : 0; - if ($error) { - xCAT::zvmUtils->printLn( $callback, "$node: Error on Image_Disk_Create_DM $out" ); - xCAT::zvmUtils->printSyslog( $callback, "$node: Error on Image_Disk_Create_DM $out" ); + ($rc, $outmsg) = xCAT::zvmUtils->checkSSH_Rc( $?, + "ssh $::SUDOER\@$hcp \"$::SUDO $::DIR/smcli Image_Disk_Create_DM -T $userId -v $addr -t 3390 -a AUTOG -r $pool -u 1 -z $cyl -m $mode -f 1 -R $readPw -W $writePw -M $multiPw\"", + $hcp, "changeVM", $out, $node ); + if ( $rc != 0 ) { + xCAT::zvmUtils->printLn( $callback, $outmsg ); return; } - if ( $fstype && ( $fstype !~ /(ext2|ext3|ext4|xfs)/i ) ) { - $out = "(Warning) File system type can only be ext2, ext3, ext4 or xfs" . "\n"; + if ( $fstype && ( $fstype !~ /(ext2|ext3|ext4|xfs|swap)/i ) ) { + $out = "(Warning) File system type can only be ext2, ext3, ext4 ,swap or xfs" . "\n"; xCAT::zvmUtils->printLn( $callback, "$node: $out" ); $error = 1; } @@ -1062,6 +1063,7 @@ sub changeVM { $out = `ssh -o ConnectTimeout=30 $::SUDOER\@$hcp "$::SUDO $::DIR/linkdiskandbringonline $userId $addr $mode"`; $rc = $? >> 8; + # Note: We don't use zvmUtils->checkSSH_Rc() in this section because some non-zero RCs are tolerated. if ($rc == 255) { xCAT::zvmUtils->printSyslog( "$node: changeVM() Unable to communicate with zHCP agent" ); xCAT::zvmUtils->printLn( $callback, "$node: changeVM() Unable to communicate with zHCP agent: $hcp" ); @@ -1093,19 +1095,39 @@ sub changeVM { sleep(2); $out = `ssh $::SUDOER\@$hcp "$::SUDO /sbin/vmcp LINK TO $userId $addr AS $vdev M 2>&1"`; $error = (xCAT::zvmUtils->checkOutput( $out ) == -1) ? 1 : 0; - + # Note: We don't use zvmUtils->checkSSH_Rc() in this section because + # we are only interested in logging the final error. if ($error) { $retry -= 1; $vdev = xCAT::zvmUtils->getFreeAddress( $::SUDOER, $hcp, 'vmcp' ); } else { + $newlinkcall = 0; last; } } + if ( $error ) { + xCAT::zvmUtils->printSyslog( "Error occurred in 'vmcp LINK TO $userId $addr AS $vdev M' $device. Output: $out" ); + xCAT::zvmUtils->printLn( $callback, "$node: changeVM() Error occurred in 'vmcp LINK TO $userId $addr AS $vdev M' " . + "Output: $out" ); + } else { # make the disk online and get it's device name - if ( !$error ) { $out = `ssh $::SUDOER\@$hcp "$::SUDO /sbin/cio_ignore -r $vdev &> /dev/null"`; + ($rc, $outmsg) = xCAT::zvmUtils->checkSSH_Rc( $?, + "ssh $::SUDOER\@$hcp \"$::SUDO /sbin/cio_ignore -r $vdev &> /dev/null\"", + $hcp, "changeVM", $out, $node ); + if ( $rc != 0 ) { + xCAT::zvmUtils->printLn( $callback, $outmsg ); + $error = 1; + } + if ( !$error ) { $out = xCAT::zvmUtils->disableEnableDisk( $::SUDOER, $hcp, "-e", $vdev ); + if ( $out !~ 'Done' ) { + xCAT::zvmUtils->printLn($callback, "$node: $out"); + $error = 1; + } + } + if ( !$error ) { my $select = `ssh $::SUDOER\@$hcp "$::SUDO cat /proc/dasd/devices"`; ($rc, $outmsg) = xCAT::zvmUtils->checkSSH_Rc( $?, "ssh $::SUDOER\@$hcp \"$::SUDO cat /proc/dasd/devices\"", $hcp, "changeVM", $select, $node ); if ($rc != 0) { @@ -1119,8 +1141,14 @@ sub changeVM { if ( $select ) { my @info = split( ' ', $select ); $device = "/dev/" . $info[6]; + } else { + xCAT::zvmUtils->printSyslog( "$node: changeVM() Error, unable to find the device " . + "on $hcp related to 0.0.$vdev" ); + xCAT::zvmUtils->printLn( $callback, "$node: changeVM() Error, unable to find the device " . + "on $hcp related to 0.0.$vdev" ); + $error = 1; + } } - $error = !$device; } } } @@ -1128,81 +1156,108 @@ sub changeVM { # format the disk if ( !$error ) { $out = `ssh $::SUDOER\@$hcp "$::SUDO /sbin/dasdfmt -y -b 4096 -d cdl -f $device 2>&1"`; - $error = (xCAT::zvmUtils->checkOutput( $out ) == -1) ? 1 : 0; - if ($error) { - xCAT::zvmUtils->printSyslog( "Error occurred during dasdfmt $device. Output: $out" ); + ($rc, $outmsg) = xCAT::zvmUtils->checkSSH_Rc( $?, + "ssh $::SUDOER\@$hcp \"$::SUDO /sbin/dasdfmt -y -b 4096 -d cdl -f $device 2>&1\"", + $hcp, "changeVM", $out, $node ); + if ( $rc != 0 ) { + xCAT::zvmUtils->printLn( $callback, $outmsg ); + $error = 1; } } if ( !$error ) { $out = `ssh $::SUDOER\@$hcp "$::SUDO /sbin/fdasd -a $device 2>&1"`; - $error = (xCAT::zvmUtils->checkOutput( $out ) == -1) ? 1 : 0; - if ($error) { - xCAT::zvmUtils->printSyslog( "Error occurred during fdasd $device. Output: $out" ); - } + ($rc, $outmsg) = xCAT::zvmUtils->checkSSH_Rc( $?, + "ssh $::SUDOER\@$hcp \"$::SUDO /sbin/fdasd -a $device 2>&1\"", + $hcp, "changeVM", $out, $node ); + if ( $rc != 0 ) { + xCAT::zvmUtils->printLn( $callback, $outmsg ); + $error = 1; + } } if ( !$error ) { $device .= '1'; if ( $fstype =~ m/xfs/i ) { - $out = `ssh $::SUDOER\@$hcp "$::SUDO mkfs.xfs $device 2>&1"`; - $error = (xCAT::zvmUtils->checkOutput( $out ) == -1) ? 1 : 0; - if ($error) { - xCAT::zvmUtils->printSyslog( "Error occurred during mkfs.xfs $device. Output: $out" ); + $out = `ssh $::SUDOER\@$hcp "$::SUDO mkfs.xfs -f $device 2>&1"`; + ($rc, $outmsg) = xCAT::zvmUtils->checkSSH_Rc( $?, + "ssh $::SUDOER\@$hcp \"$::SUDO mkfs.xfs -f $device 2>&1\"", + $hcp, "changeVM", $out, $node ); + if ( $rc != 0 ) { + xCAT::zvmUtils->printLn( $callback, $outmsg ); + $error = 1; } + } elsif ( $fstype =~ m/swap/i ) { + xCAT::zvmUtils->printSyslog( "the file system is swap, so no format needed"); } else { - $out = `ssh $::SUDOER\@$hcp "$::SUDO mkfs -t $fstype $device 2>&1"`; - $error = !($out =~ m/done/); - if ($error) { - xCAT::zvmUtils->printSyslog( "Error occurred during mkfs $fstype $device. Output: $out" ); + $out = `ssh $::SUDOER\@$hcp "$::SUDO mkfs -F -t $fstype $device 2>&1"`; + ($rc, $outmsg) = xCAT::zvmUtils->checkSSH_Rc( $?, + "ssh $::SUDOER\@$hcp \"$::SUDO mkfs -F -t $fstype $device 2>&1\"", + $hcp, "changeVM", $out, $node ); + if ( $rc != 0 ) { + xCAT::zvmUtils->printLn( $callback, $outmsg ); + $error = 1; } - } - } - if ( $error ) { - xCAT::zvmUtils->printSyslog("$out"); - $out = "(Warning) Can not format disk with fstype $fstype" . "\n"; - } else { - $out = ""; + } + if ( $error ) { + xCAT::zvmUtils->printLn( $callback, "(Warning) Cannot format disk with fstype $fstype" ); + } } - # offline and detach disk using new call so that zhcp records are updated + # offline and detach disk using the new call so that zhcp records are updated if ( $newlinkcall == 1 ){ $out = `ssh -o ConnectTimeout=30 $::SUDOER\@$hcp "$::SUDO $::DIR/offlinediskanddetach $userId $addr"`; - $rc = $?; - - $rc = $? >> 8; - if ( $rc == 255 ) { - xCAT::zvmUtils->printSyslog( "$node: changeVM() Unable to communicate with zHCP agent" ); - xCAT::zvmUtils->printLn( $callback, "$node: changeVM() Unable to communicate with zHCP agent: $hcp" ); - $error = 1; - } - if ($out =~ m/Success:/i){ - # sample output=>offlinediskanddetach maint start time: 2017-03-03-16:20:48.011 - # Success: Userid maint vdev 193 unlinked - # offlinediskanddetach exit time: 2017-03-03-16:20:52.150 - xCAT::zvmUtils->printSyslog("$out"); - } else { - xCAT::zvmUtils->printSyslog( "$node: changeVM() Error occurred in call to offlinediskanddetach: $out" ); - xCAT::zvmUtils->printLn( $callback, "$node: changeVM() Error occurred in call to offlinediskanddetach: $out" ); + ( $rc, $outmsg) = xCAT::zvmUtils->checkSSH_Rc( $?, + "ssh -o ConnectTimeout=30 $::SUDOER\@$hcp \"$::SUDO $::DIR/offlinediskanddetach $userId $addr\"", + $hcp, "changeVM", $out, $node ); + if ( $rc != 0 ) { + xCAT::zvmUtils->printLn( $callback, $outmsg ); $error = 1; } # Use old code to disable and detach - } else { - xCAT::zvmUtils->disableEnableDisk( $::SUDOER, $hcp, "-d", $vdev ); - `ssh $::SUDOER\@$hcp "$::SUDO /sbin/vmcp DETACH $vdev &> /dev/null"`; - xCAT::zvmUtils->printSyslog("vmcp DETACH $vdev"); + } elsif ( $newlinkcall == 0 ) { + $out = xCAT::zvmUtils->disableEnableDisk( $::SUDOER, $hcp, "-d", $vdev ); + if ( $out !~ 'Done' ){ + # Note: We are only going to log the disable failure because a failure to + # disable the device doesn't mean much because we are going to immmediately + # detach it. The worst that we expect to happen in this case is that + # we have a dasd enabled that is no longer attached. + xCAT::zvmUtils->printSyslog( "$node: $out"); + } + + xCAT::zvmUtils->printSyslog( "ssh $::SUDOER\@$hcp \"$::SUDO /sbin/vmcp DETACH $vdev &> /dev/null\"" ); + $out = `ssh $::SUDOER\@$hcp "$::SUDO /sbin/vmcp DETACH $vdev &> /dev/null"`; + ($rc, $outmsg) = xCAT::zvmUtils->checkSSH_Rc( $?, + "ssh $::SUDOER\@$hcp \"$::SUDO /sbin/vmcp DETACH $vdev &> /dev/null\"", + $hcp, "changeVM", $out, $node ); + if ( $rc != 0 ) { + xCAT::zvmUtils->printLn( $callback, $outmsg ); + xCAT::zvmUtils->printSyslog( $outmsg ); + $error = 1; + } } + # else disk was not linked so we don't have to remove it. } if ( !$error ) { # Add to active configuration - $out .= "Adding 3390 disk for $node as $addr ... Done"; + xCAT::zvmUtils->printLn( $callback, "$node: Adding 3390 disk to $userId\'s directory entry as $addr ... Done" ); my $power = `/opt/xcat/bin/rpower $node stat`; if ($power =~ m/: on/i) { - $out .= "\n" . `ssh $::SUDOER\@$hcp "$::SUDO $::DIR/smcli Image_Disk_Create -T $userId -v $addr -m $mode"`; - xCAT::zvmUtils->printSyslog("smcli Image_Disk_Create -T $userId -v $addr -m $mode"); + xCAT::zvmUtils->printSyslog( "ssh $::SUDOER\@$hcp \"$::SUDO $::DIR/smcli Image_Disk_Create -T $userId -v $addr -m $mode\"" ); + $out = `ssh $::SUDOER\@$hcp "$::SUDO $::DIR/smcli Image_Disk_Create -T $userId -v $addr -m $mode"`; + ($rc, $outmsg) = xCAT::zvmUtils->checkSSH_Rc( $?, + "ssh $::SUDOER\@$hcp \"$::SUDO $::DIR/smcli Image_Disk_Create -T $userId -v $addr -m $mode\"", + $hcp, "changeVM", $out, $node ); + if ( $rc != 0 ) { + xCAT::zvmUtils->printLn( $callback, $outmsg ); + $error = 1; + } } - $out = xCAT::zvmUtils->appendHostname( $node, $out ); + if ( $error != 1 ) { + xCAT::zvmUtils->printLn( $callback, "$node: Adding disk to $userId\'s active configuration... Done" ); + } } + $out = ''; } # add3390active [device address] [mode] @@ -1274,11 +1329,11 @@ sub changeVM { # Add to directory entry my $error = 0; $out = `ssh $::SUDOER\@$hcp "$::SUDO $::DIR/smcli Image_Disk_Create_DM -T $userId -v $addr -t 9336 -a AUTOG -r $pool -u 2 -z $blks -m $mode -f 1 -R $readPw -W $writePw -M $multiPw 2>&1"`; - xCAT::zvmUtils->printSyslog("smcli Image_Disk_Create_DM -T $userId -v $addr -t 9336 -a AUTOG -r $pool -u 2 -z $blks -m $mode -f 1 -R $readPw -W $writePw -M $multiPw"); - $error = (xCAT::zvmUtils->checkOutput( $out ) == -1) ? 1 : 0; - if ($error) { - xCAT::zvmUtils->printLn( $callback, "$node: Error on Image_Disk_Create_DM $out" ); - xCAT::zvmUtils->printSyslog( $callback, "$node: Error on Image_Disk_Create_DM $out" ); + ($rc, $outmsg) = xCAT::zvmUtils->checkSSH_Rc( $?, + "ssh $::SUDOER\@$hcp \"$::SUDO $::DIR/smcli Image_Disk_Create_DM -T $userId -v $addr -t 9336 -a AUTOG -r $pool -u 2 -z $blks -m $mode -f 1 -R $readPw -W $writePw -M $multiPw 2>&1\"", + $hcp, "changeVM", $out, $node ); + if ( $rc != 0 ) { + xCAT::zvmUtils->printLn( $callback, "$node: $out" ); return; } @@ -1289,7 +1344,7 @@ sub changeVM { } my $device = 0; - my $newlinkcall = 0; + my $newlinkcall = -1; # -1: not linked, 0: linked using the old way, 1: linked using linkdiskandbringonline script. my $rc = 0; my $vdev; @@ -1297,7 +1352,6 @@ sub changeVM { # link the disk # Check if zhcp has the new routine to link and online the disk $out = `ssh -o ConnectTimeout=30 $::SUDOER\@$hcp "$::SUDO $::DIR/linkdiskandbringonline $userId $addr $mode"`; - $rc = $?; $rc = $? >> 8; if ($rc == 255) { @@ -1316,7 +1370,7 @@ sub changeVM { # linkdiskandbringonline exit time: 2017-03-03-16:20:52.150 $out = `echo "$out" | egrep -a -i "Success:"`; my @info = split( ' ', $out ); - $device = $info[10]; + $device = "/dev/" . $info[10]; } else { xCAT::zvmUtils->printSyslog( "$node: changeVM() Error occurred in call to linkdiskandbringonline: $out" ); xCAT::zvmUtils->printLn( $callback, "$node: changeVM()(Error occurred in call to linkdiskandbringonline: $out" ); @@ -1331,35 +1385,61 @@ sub changeVM { sleep(2); $out = `ssh $::SUDOER\@$hcp "$::SUDO /sbin/vmcp LINK TO $userId $addr AS $vdev M 2>&1"`; $error = (xCAT::zvmUtils->checkOutput( $out ) == -1) ? 1 : 0; - + # Note: We don't use zvmUtils->checkSSH_Rc() in this section because + # we are only interested in logging the final error. if ($error) { $retry -= 1; $vdev = xCAT::zvmUtils->getFreeAddress( $::SUDOER, $hcp, 'vmcp' ); } else { + $newlinkcall = 0; last; } } + if ( $error ) { + xCAT::zvmUtils->printSyslog( "Error occurred in 'vmcp LINK TO $userId $addr AS $vdev M' $device. Output: $out" ); + xCAT::zvmUtils->printLn( $callback, "$node: changeVM() Error occurred in 'vmcp LINK TO $userId $addr AS $vdev M' " . + "Output: $out" ); + } else { # make the disk online and get it's device name - if ( !$error ) { $out = `ssh $::SUDOER\@$hcp "$::SUDO /sbin/cio_ignore -r $vdev &> /dev/null"`; + ($rc, $outmsg) = xCAT::zvmUtils->checkSSH_Rc( $?, + "ssh $::SUDOER\@$hcp \"$::SUDO /sbin/cio_ignore -r $vdev &> /dev/null\"", + $hcp, "changeVM", $out, $node ); + if ( $rc != 0 ) { + xCAT::zvmUtils->printLn( $callback, $outmsg ); + $error = 1; + } + if ( !$error ) { $out = xCAT::zvmUtils->disableEnableDisk( $::SUDOER, $hcp, "-e", $vdev ); + if ( $out !~ 'Done' ) { + xCAT::zvmUtils->printLn($callback, "$node: $out"); + $error = 1; + } + } + if ( !$error ) { my $select = `ssh $::SUDOER\@$hcp "$::SUDO cat /proc/dasd/devices"`; ($rc, $outmsg) = xCAT::zvmUtils->checkSSH_Rc( $?, "ssh $::SUDOER\@$hcp \"$::SUDO cat /proc/dasd/devices\"", $hcp, "changeVM", $select, $node ); if ($rc != 0) { xCAT::zvmUtils->printLn( $callback, "$outmsg" ); $error = 1; } else { - $out = `echo "$out" | egrep -a -i "0.0.$vdev"`; + $select = `echo "$select" | egrep -a -i "0.0.$vdev"`; chomp( $select ); # A sample entry: - # 0.0.0101(ECKD) at ( 94: 0) is dasda : active at blocksize: 4096, 600840 blocks, 2347 MB + # select: 0.0.0001(FBA ) at ( 94: 28) is dasdh : active at blocksize: 512, 61440 blocks, 30 MB if ( $select ) { my @info = split( ' ', $select ); - $device = "/dev/" . $info[6]; + $device = "/dev/" . $info[7]; + } else { + xCAT::zvmUtils->printSyslog( "$node: changeVM() Error, unable to find the device " . + "on $hcp related to 0.0.$vdev" ); + xCAT::zvmUtils->printLn( $callback, "$node: changeVM() Error, unable to find the device " . + "on $hcp related to 0.0.$vdev" ); + $error = 1; + } + } } - $error = !$device; - } } } @@ -1370,9 +1450,12 @@ sub changeVM { d w EOF"`; - $error = (xCAT::zvmUtils->checkOutput( $out ) == -1) ? 1 : 0; - if ($error) { - xCAT::zvmUtils->printSyslog( "Error occurred during fdisk $device. Output: $out" ); + ($rc, $outmsg) = xCAT::zvmUtils->checkSSH_Rc( $?, + "ssh $::SUDOER\@$hcp \"$::SUDO /sbin/fdisk $device d w\"", + $hcp, "changeVM", $out, $node ); + if ( $rc != 0 ) { + xCAT::zvmUtils->printLn( $callback, $outmsg ); + $error = 1; } } @@ -1387,76 +1470,94 @@ p w EOF"`; - $error = (xCAT::zvmUtils->checkOutput( $out ) == -1) ? 1 : 0; - if ($error) { - xCAT::zvmUtils->printSyslog( "Error occurred during fdisk to make a partition on $device. Output: $out" ); + ($rc, $outmsg) = xCAT::zvmUtils->checkSSH_Rc( $?, + "ssh $::SUDOER\@$hcp \"$::SUDO /sbin/fdisk $device n p 1 w\"", + $hcp, "changeVM", $out, $node ); + if ( $rc != 0 ) { + xCAT::zvmUtils->printLn( $callback, $outmsg ); + $error = 1; } } if ( !$error ) { $device .= '1'; if ( $fstype =~ m/xfs/i ) { - $out = `ssh $::SUDOER\@$hcp "$::SUDO mkfs.xfs $device 2>&1"`; - $error = (xCAT::zvmUtils->checkOutput( $out ) == -1) ? 1 : 0; - if ($error) { - xCAT::zvmUtils->printSyslog( "Error occurred during mkfs.xfs $device. Output: $out" ); + $out = `ssh $::SUDOER\@$hcp "$::SUDO mkfs.xfs -f $device 2>&1"`; + ($rc, $outmsg) = xCAT::zvmUtils->checkSSH_Rc( $?, + "ssh $::SUDOER\@$hcp \"$::SUDO mkfs.xfs -f $device 2>&1\"", + $hcp, "changeVM", $out, $node ); + if ( $rc != 0 ) { + xCAT::zvmUtils->printLn( $callback, $outmsg ); + $error = 1; } } else { - $out = `ssh $::SUDOER\@$hcp "$::SUDO mkfs -t $fstype $device 2>&1"`; - $error = !($out =~ m/done/); - if ($error) { - xCAT::zvmUtils->printSyslog( "Error occurred during mkfs $fstype $device. Output: $out" ); + $out = `ssh $::SUDOER\@$hcp "$::SUDO mkfs -F -t $fstype $device 2>&1"`; + ($rc, $outmsg) = xCAT::zvmUtils->checkSSH_Rc( $?, + "ssh $::SUDOER\@$hcp \"$::SUDO mkfs -F -t $fstype $device\"", + $hcp, "changeVM", $out, $node ); + if ( $rc != 0 ) { + xCAT::zvmUtils->printLn( $callback, $outmsg ); + $error = 1; } - } } if ( $error ) { - xCAT::zvmUtils->printSyslog("$out"); - $out = "(Warning) Can not format disk with fstype $fstype" . "\n"; - } else { - $out = ""; + xCAT::zvmUtils->printLn( $callback, "(Warning) Cannot format disk with fstype $fstype" ); + } } # offline and detach disk using new call so that zhcp records are updated if ( $newlinkcall == 1 ){ $out = `ssh -o ConnectTimeout=30 $::SUDOER\@$hcp "$::SUDO $::DIR/offlinediskanddetach $userId $addr"`; - $rc = $?; - - $rc = $? >> 8; - if ( $rc == 255 ) { - xCAT::zvmUtils->printSyslog( "$node: changeVM() Unable to communicate with zHCP agent" ); - xCAT::zvmUtils->printLn( $callback, "$node: changeVM()( is unable to communicate with zHCP agent: $hcp" ); - $error = 1; - } - if ( $rc > 0 ) { - xCAT::zvmUtils->printSyslog( "$node: changeVM() Unexpected error from SSH call to offlinediskanddetach rc: $rc $out" ); - xCAT::zvmUtils->printLn( $callback, "$node: changeVM()Unexpected error from SSH call to offlinediskanddetach rc: $rc $out" ); - $error = 1; - } - if ($out =~ m/Success:/i){ - # sample output=>Success: Userid maint vdev 193 unlinked - xCAT::zvmUtils->printSyslog("$out"); - } else { - xCAT::zvmUtils->printSyslog( "$node: changeVM() Error occurred in call to offlinediskanddetach: $out" ); - xCAT::zvmUtils->printLn( $callback, "$node: changeVM() Error occurred in call to offlinediskanddetach: $out" ); + ( $rc, $outmsg) = xCAT::zvmUtils->checkSSH_Rc( $?, + "ssh -o ConnectTimeout=30 $::SUDOER\@$hcp \"$::SUDO $::DIR/offlinediskanddetach $userId $addr\"", + $hcp, "changeVM", $out, $node ); + if ( $rc != 0 ) { + xCAT::zvmUtils->printLn( $callback, $outmsg ); $error = 1; } # Use old code to disable and detach - } else { - xCAT::zvmUtils->disableEnableDisk( $::SUDOER, $hcp, "-d", $vdev ); - `ssh $::SUDOER\@$hcp "$::SUDO /sbin/vmcp DETACH $vdev &> /dev/null"`; - xCAT::zvmUtils->printSyslog("vmcp DETACH $vdev"); + } elsif ( $newlinkcall == 0 ) { + $out = xCAT::zvmUtils->disableEnableDisk( $::SUDOER, $hcp, "-d", $vdev ); + if ($out !~ 'Done' ){ + # Note: We are only going to log the disable failure because a failure to + # disable the device doesn't mean much because we are going to immmediately + # detach it. The worst that we expect to happen in this case is that + # we have a dasd enabled that is no longer attached. + xCAT::zvmUtils->printSyslog( "$node: $out"); + } + + xCAT::zvmUtils->printSyslog( "ssh $::SUDOER\@$hcp \"$::SUDO /sbin/vmcp DETACH $vdev &> /dev/null\"" ); + $out = `ssh $::SUDOER\@$hcp "$::SUDO /sbin/vmcp DETACH $vdev &> /dev/null"`; + ($rc, $outmsg) = xCAT::zvmUtils->checkSSH_Rc( $?, + "ssh $::SUDOER\@$hcp \"$::SUDO /sbin/vmcp DETACH $vdev &> /dev/null\"", + $hcp, "changeVM", $out, $node ); + if ( $rc != 0 ) { + xCAT::zvmUtils->printLn( $callback, $outmsg ); + xCAT::zvmUtils->printSyslog( $outmsg ); + $error = 1; + } } + # else disk was not linked so we don't have to remove it. } if (!$error) { # Add to active configuration - $out .= "Adding 9336 disk for $node as $addr ... Done"; + xCAT::zvmUtils->printLn( $callback, "$node: Adding 9336 disk to $userId\'s directory entry as $addr ... Done" ); my $power = `/opt/xcat/bin/rpower $node stat`; if ($power =~ m/: on/i) { - $out .= "\n" . `ssh $::SUDOER\@$hcp "$::SUDO $::DIR/smcli Image_Disk_Create -T $userId -v $addr -m $mode"`; - xCAT::zvmUtils->printSyslog("smcli Image_Disk_Create -T $userId -v $addr -m $mode"); + $out = `ssh $::SUDOER\@$hcp "$::SUDO $::DIR/smcli Image_Disk_Create -T $userId -v $addr -m $mode"`; + ($rc, $outmsg) = xCAT::zvmUtils->checkSSH_Rc( $?, + "ssh $::SUDOER\@$hcp $::SUDO \"$::DIR/smcli Image_Disk_Create -T $userId -v $addr -m $mode\"", + $hcp, "changeVM", $out, $node ); + if ( $rc != 0 ) { + xCAT::zvmUtils->printLn( $callback, $outmsg ); + $error = 1; + } } - $out = xCAT::zvmUtils->appendHostname( $node, $out ); + if ( $error != 1 ) { + xCAT::zvmUtils->printLn( $callback, "$node: Adding disk to $userId\'s active configuration... Done" ); + } } + $out = ''; } # adddisk2pool [function] [region] [volume] [group] @@ -1557,8 +1658,10 @@ EOF"`; $out = `ssh $::SUDOER\@$hcp "$::SUDO $::DIR/smcli Image_Disk_Create_DM -T $userId -v $addr -t FB-512 -a V-DISK -r NONE -u 2 -z $size -m $mode -f 0"`; $error = (xCAT::zvmUtils->checkOutput( $out ) == -1) ? 1 : 0; if ($error) { - xCAT::zvmUtils->printLn( $callback, "$node: Error on Image_Disk_Create_DM $out" ); - xCAT::zvmUtils->printSyslog( $callback, "$node: Error on Image_Disk_Create_DM $out" ); + xCAT::zvmUtils->printSyslog( "$node: Error on Image_Disk_Create_DM. Output: $out" ); + xCAT::zvmUtils->printLn( $callback, "$node: changeVM() Error occurred during " . + "'smcli Image_Disk_Create_DM -T $userId -v $addr -t FB-512 -a V-DISK -r NONE " . + "-u 2 -z $size -m $mode -f 0'. Output: $out" ); return; } @@ -3302,11 +3405,6 @@ sub powerVM { # Output string my $out; - ##pdu commands will be handled in the pdu plugin - if ($args->[0] eq 'pduon' || $args->[0] eq 'pdureset' || $args->[0] eq 'pduoff' || $args->[0] eq 'pdustat') { - return; - } - # Power on virtual server if ( $args->[0] eq 'on' ) { # Check the node flag, if it contain XCATCONF4Z=0, it indicate that this node will be deployed by using non-xcatconf4z type @@ -4437,6 +4535,7 @@ sub makeVM { my $diskSize = ""; my $diskVdev = ""; my $ipl = ""; + my $logonby = ""; my $requestId = "NoUpstreamRequestID"; # Default is still visible in the log my $objectId = "NoUpstreamObjectID"; # Default is still visible in the log if ($args) { @@ -4455,7 +4554,8 @@ sub makeVM { 'r|privilege=s' => \$privilege, # Optional 'q|requestid=s' => \$requestId, # Optional 'j|objectid=s' => \$objectId, # Optional - 'i|ipl=s' => \$ipl); # Optional + 'i|ipl=s' => \$ipl, # Optional + 'l|logonby=s' => \$logonby); # Optional } # If one of the options above are given, create the user without a directory entry file if ($profileName || $password || $memorySize) { @@ -4469,8 +4569,23 @@ sub makeVM { $privilege = 'G'; } + + # validate the logonby userid + my @userids = split(' ', $logonby); + if (scalar(@userids) > 8) { + xCAT::zvmUtils->printSyslog("logonby statement contains more than 8 users which is not allowed, the value is: $logonby"); + xCAT::zvmUtils->printLn( $callback, "$node: (Error) logonby statement contains more than 8 users which is not allowed, the value is: $logonby"); + return; + } + for ( my $i = 0 ; $i < scalar(@userids) ; $i++ ) { + if (length($userids[$i]) > 8) { + xCAT::zvmUtils->printSyslog("logonby userid $userids[$i] contains more than 8 chars"); + xCAT::zvmUtils->printLn( $callback, "$node: logonby userid $userids[$i] contains more than 8 chars"); + return; + } + } # Generate temporary user directory entry file - my $userEntryFile = xCAT::zvmUtils->generateUserEntryFile($userId, $password, $memorySize, $privilege, $profileName, $cpuCount, $ipl); + my $userEntryFile = xCAT::zvmUtils->generateUserEntryFile($userId, $password, $memorySize, $privilege, $profileName, $cpuCount, $ipl, $logonby); if ( $userEntryFile == -1 ) { xCAT::zvmUtils->printLn( $callback, "$node: (Error) Failed to generate user directory entry file" ); return; @@ -5721,10 +5836,10 @@ sub clone { # Exit if all disks are not present if ( @disks != @tgtDisks ) { xCAT::zvmUtils->printLn( $callback, "$tgtNode: (Error) After 50 seconds, all disks not present in target directory." ); - xCAT::zvmUtils->printSyslog( $callback, "$tgtNode: (Error) After 50 seconds, all disks not present in target directory." ); + xCAT::zvmUtils->printSyslog( "$tgtNode: (Error) After 50 seconds, all disks not present in target directory." ); xCAT::zvmUtils->printLn( $callback, "$tgtNode: Disks found in $sourceId source directory (@tgtDisks). Disks found in $tgtUserId target directory (@disks)" ); - xCAT::zvmUtils->printSyslog( $callback, "$tgtNode: Disks found in $sourceId + source directory (@tgtDisks). Disks found in $tgtUserId target directory (@disks)" ); + xCAT::zvmUtils->printSyslog( "$tgtNode: Disks found in $sourceId + source directory (@tgtDisks). Disks found in $tgtUserId target directory (@disks)" ); xCAT::zvmUtils->printLn( $callback, "$tgtNode: (Solution) Verify disk pool($pool) has free disks and that directory updates are working" ); return; @@ -11571,7 +11686,7 @@ sub specialcloneVM { if ( $out =~ m/not linked/i ) { xCAT::zvmUtils->printSyslog("Retry linking source disk ($addr) as ($linkAddr)\n"); - xCAT::zvmUtils->printSyslog($callback, "Retry linking source disk ($addr) as ($linkAddr)"); + xCAT::zvmUtils->printLn($callback, "Retry linking source disk ($addr) as ($linkAddr)"); # Do nothing } else { last; @@ -12025,10 +12140,10 @@ sub specialClone { # Exit if all disks are not present if ( @disks != @tgtDisks ) { xCAT::zvmUtils->printLn( $callback, "$tgtNode: (Error) After 50 seconds, all disks not present in target directory." ); - xCAT::zvmUtils->printSyslog( $callback, "$tgtNode: (Error) After 50 seconds, all disks not present in target directory." ); + xCAT::zvmUtils->printSyslog( "$tgtNode: (Error) After 50 seconds, all disks not present in target directory." ); xCAT::zvmUtils->printLn( $callback, "$tgtNode: Disks found in $sourceId source directory (@tgtDisks). Disks found in $tgtUserId target directory (@disks)" ); - xCAT::zvmUtils->printSyslog( $callback, "$tgtNode: Disks found in $sourceId + source directory (@tgtDisks). Disks found in $tgtUserId target directory (@disks)" ); + xCAT::zvmUtils->printSyslog( "$tgtNode: Disks found in $sourceId + source directory (@tgtDisks). Disks found in $tgtUserId target directory (@disks)" ); xCAT::zvmUtils->printLn( $callback, "$tgtNode: (Solution) Verify disk pool has free disks and that directory updates are working" ); return; diff --git a/xCAT-server/share/xcat/scripts/setupDisk b/xCAT-server/share/xcat/scripts/setupDisk index c9a93ec78..fab9d91f2 100644 --- a/xCAT-server/share/xcat/scripts/setupDisk +++ b/xCAT-server/share/xcat/scripts/setupDisk @@ -495,6 +495,57 @@ function setupDisk { /sbin/multipath -r echo "$funcName successfully remove the SCSI volume" + ########################################################################### + # Handle adding a mdisk based swap disk. + # Disk file input parameters: + # action - "addSwap" + # vaddr - virtual address of the minidisk + ########################################################################## + elif [[ $xcat_action == "addSwap" ]]; then + + if [[ ! -n $xcat_vaddr ]]; then + echo "$funcName (Error) Virtual address was not specified" + return + fi + + xcat_vaddr=`echo $xcat_vaddr | tr '[A-Z]' '[a-z]'` + + # Online the device + rc= onlineDevice $xcat_vaddr + if (( rc != 0 )); then + echo "$funcName (Error) fail to online the disk $xcat_vaddr" + return + fi + + # Configure the added dasd to be persistent + echo "Permanently online the ephemeral disk" + if [[ $os == rhel* ]]; then + out=`cat "/etc/dasd.conf" | egrep -i $xcat_vaddr` + if [[ ! $out ]]; then + echo "0.0.$xcat_vaddr" >> /etc/dasd.conf + fi + elif [[ $os == sles* ]]; then + /sbin/dasd_configure 0.0.$xcat_vaddr 1 + elif [[ $os == ubuntu16* ]]; then + touch /etc/sysconfig/hardware/config-ccw-0.0.$xcat_vaddr + else + echo "$funcName (Error) failed to permanently online the disk:$xcat_vaddr on os: $os, please check if $os is in the supported distribution list" + return + fi + + cp /etc/fstab /etc/fstab.bak + out=`cat "/etc/fstab" | egrep -i "ccw-0.0.$xcat_vaddr"` + if [[ $out ]]; then + sed -i '/ccw-0.0.'"$xcat_vaddr"'/d' /etc/fstab + fi + + # any error should be recorded in the init log, this kind of error should not break + # the whole startup process + mkswap /dev/disk/by-path/ccw-0.0.${xcat_vaddr}-part1 + echo "/dev/disk/by-path/ccw-0.0.${xcat_vaddr}-part1 none swap sw 0 0" >> /etc/fstab + + swapon -a + ########################################################################### # Handle adding a mdisk based ephemeral disk. # Disk file input parameters: